From d84759ed1f888b52b27573ed49e98a94dd136e0b Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Fri, 16 Jun 2023 04:05:24 -0700 Subject: [PATCH 01/14] fix: update and build LBIndustrialCtrls from source --- .gitignore | 15 +- .../LBIndustrialCtrls/AssemblyInfo.cs | 31 + .../Base/LBIndustrialCtrlBase.Designer.cs | 42 ++ .../Base/LBIndustrialCtrlBase.cs | 252 ++++++++ .../LBIndustrialCtrls/Base/Renderer.cs | 26 + .../Button/ButtonRenderer.cs | 265 ++++++++ .../Button/LBButton.Designer.cs | 51 ++ .../LBIndustrialCtrls/Button/LBButton.cs | 297 +++++++++ .../LBIndustrialCtrls/Button/LBButton.resx | 120 ++++ .../LBIndustrialCtrls/Knob/Knob.bmp | Bin 0 -> 822 bytes .../LBIndustrialCtrls/Knob/KnobRenderer.cs | 198 ++++++ .../LBIndustrialCtrls/Knob/LBKnob.Designer.cs | 53 ++ .../LBIndustrialCtrls/Knob/LBKnob.cs | 450 +++++++++++++ .../LBIndustrialCtrls/Knob/LBKnob.resx | 120 ++++ .../LBIndustrialCtrls.csproj | 176 +++++ .../Led/LB7SegmentDisplay.Designer.cs | 51 ++ .../Led/LB7SegmentDisplay.cs | 59 ++ .../Led/LB7SegmentDisplay.resx | 120 ++++ .../Led/LB7SegmentDisplayRenderer.cs | 608 ++++++++++++++++++ .../LBIndustrialCtrls/Led/LBLed.Designer.cs | 56 ++ .../LBIndustrialCtrls/Led/LBLed.cs | 216 +++++++ .../LBIndustrialCtrls/Led/LBLed.resx | 123 ++++ .../LBIndustrialCtrls/Led/LedRenderer.cs | 275 ++++++++ .../Meters/LBAnalogMeter.Designer.cs | 46 ++ .../LBIndustrialCtrls/Meters/LBAnalogMeter.cs | 256 ++++++++ .../Meters/LBDigitalMeter.Designer.cs | 45 ++ .../Meters/LBDigitalMeter.cs | 323 ++++++++++ .../Meters/LBDigitalMeter.resx | 120 ++++ .../Meters/LBDigitalMeterRenderer.cs | 68 ++ .../Meters/LBMeterThreshold.cs | 165 +++++ .../LBIndustrialCtrls/Meters/MeterRenderer.cs | 397 ++++++++++++ .../LBIndustrialCtrls/Utils/ColorMng.cs | 62 ++ .../LBIndustrialCtrls/Utils/MathFunc.cs | 21 + .../LBIndustrialCtrls_src/TestApp.sln | 31 + .../TestApp/AssemblyInfo.cs | 31 + .../TestApp/MainForm.Designer.cs | 541 ++++++++++++++++ .../LBIndustrialCtrls_src/TestApp/MainForm.cs | 182 ++++++ .../TestApp/MainForm.resx | 135 ++++ .../LBIndustrialCtrls_src/TestApp/Program.cs | 32 + .../TestApp/TestApp.csproj | 132 ++++ .../LBIndustrialCtrls_src/TestApp/app.config | 3 + MidiShapeShifter/MidiShapeShifter.sln | 49 ++ .../MidiShapeShifter/MidiShapeShifter.csproj | 10 +- MidiShapeShifter/lib/LBIndustrialCtrls.dll | Bin 57344 -> 0 bytes 44 files changed, 6239 insertions(+), 14 deletions(-) create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/AssemblyInfo.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.Designer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/Renderer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/ButtonRenderer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.Designer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.resx create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/Knob.bmp create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/KnobRenderer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.Designer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.resx create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/LBIndustrialCtrls.csproj create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.Designer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.resx create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplayRenderer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.Designer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.resx create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LedRenderer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.Designer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.Designer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.resx create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeterRenderer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBMeterThreshold.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/MeterRenderer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/ColorMng.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/MathFunc.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp.sln create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/AssemblyInfo.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.Designer.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.resx create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/Program.cs create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/TestApp.csproj create mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/app.config delete mode 100644 MidiShapeShifter/lib/LBIndustrialCtrls.dll diff --git a/.gitignore b/.gitignore index d559146..91404b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,9 @@ *.suo -MidiShapeShifter/MidiShapeShifter/bin *.csproj.user -MidiShapeShifter/MidiShapeShifter/obj -MidiShapeShifter/MidiShapeShifterTest/bin -MidiShapeShifter/MidiShapeShifterTest/obj -MidiShapeShifter/MidiShapeShifterInstaller/Release/ -MidiShapeShifter/MidiShapeShifterInstaller/Debug/ -MidiShapeShifter/.vs - *.bak -/MidiShapeShifter/MidiShapeShifterDeploy/MidiShapeShifterDeploy - .vs/ +packages/ +bin/ +obj/ +Release/ +Debug/ diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/AssemblyInfo.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/AssemblyInfo.cs new file mode 100644 index 0000000..aecdd25 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/AssemblyInfo.cs @@ -0,0 +1,31 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LBIndustrialCtrls")] +[assembly: AssemblyDescription(".NET library controls for measure, visualization and commands")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("LBSoft di Bonotto Luca")] +[assembly: AssemblyProduct("LBIndustrialCtrls")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all the values or you can use the default the Revision and +// Build Numbers by using the '*' as shown below: +[assembly: AssemblyVersion("2.1.0.0")] diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.Designer.cs new file mode 100644 index 0000000..2a2c381 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.Designer.cs @@ -0,0 +1,42 @@ +namespace LBSoft.IndustrialCtrls.Base +{ + partial class LBIndustrialCtrlBase + { + /// + /// Variabile di progettazione necessaria. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Liberare le risorse in uso. + /// + /// ha valore true se le risorse gestite devono essere eliminate, false in caso contrario. + protected override void Dispose(bool disposing) + { + // Dispose the renderers + this.DefaultRenderer.Dispose(); + if (this.Renderer != null) + this.Renderer.Dispose(); + + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Codice generato da Progettazione componenti + + /// + /// Metodo necessario per il supporto della finestra di progettazione. Non modificare + /// il contenuto del metodo con l'editor di codice. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.cs new file mode 100644 index 0000000..e226af7 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.cs @@ -0,0 +1,252 @@ +/*--------------------------------------------------------------------------- + * File: LBIndustrialCtrlBase.cs + * Utente: lucabonotto + * Date: 05/04/2009 + * Time: 13.36 + *-------------------------------------------------------------------------*/ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace LBSoft.IndustrialCtrls.Base +{ + /// + /// Base class for the IndustrialCtrls + /// + public partial class LBIndustrialCtrlBase : UserControl + { + #region (* Constructor *) + public LBIndustrialCtrlBase() + { + InitializeComponent(); + + // Set the styles for drawing + SetStyle(ControlStyles.AllPaintingInWmPaint | + ControlStyles.ResizeRedraw | + ControlStyles.DoubleBuffer | + ControlStyles.SupportsTransparentBackColor, + true); + + // Transparent background + this.BackColor = Color.Transparent; + + // Creation of the default renderer + this._defaultRenderer = CreateDefaultRenderer(); + if (this._defaultRenderer != null) + this._defaultRenderer.Control = this; + } + #endregion + + #region (* Properties *) + /// + /// Default renderer of the control + /// + private ILBRenderer _defaultRenderer = null; + [Browsable(false)] + public ILBRenderer DefaultRenderer + { + get { return this._defaultRenderer; } + } + + /// + /// User defined renderer + /// + private ILBRenderer _renderer = null; + [Browsable(false)] + public ILBRenderer Renderer + { + set + { + // set the renderer + this._renderer = value; + if (this._renderer != null) + { + // Set the control tu the renderer + this._renderer.Control = this; + // Update the renderer + this._renderer.Update(); + } + + // Redraw the renderer + Invalidate(); + } + get { return this._renderer; } + } + #endregion + + #region (* Events delegates *) + /// + /// Font change event + /// + /// + [System.ComponentModel.EditorBrowsableAttribute()] + protected override void OnFontChanged(EventArgs e) + { + // Calculate dimensions + this.CalculateDimensions(); + } + /// + /// SizeChanged event + /// + /// + [System.ComponentModel.EditorBrowsableAttribute()] + protected override void OnSizeChanged(EventArgs e) + { + // Default + base.OnSizeChanged(e); + // Calculate al the data for + // drawing the control + this.CalculateDimensions(); + // Redraw + this.Invalidate(); + } + + /// + /// Resize event + /// + /// + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + // Calculate al the data for + // drawing the control + this.CalculateDimensions(); + // Redraw + this.Invalidate(); + } + /// + /// Paint event + /// + /// + [System.ComponentModel.EditorBrowsableAttribute()] + protected override void OnPaint(PaintEventArgs e) + { + // Rectangle of the control + RectangleF _rc = new RectangleF(0, 0, this.Width, this.Height); + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + + // Call the default renderer if the user + // rendere is null + if (this.Renderer == null) + { + this.DefaultRenderer.Draw(e.Graphics); + return; + } + + // Draw with the user renderer + this.Renderer.Draw(e.Graphics); + } + #endregion + + #region (* Virtual method *) + /// + /// Call from the constructor to create the default renderer + /// + /// + protected virtual ILBRenderer CreateDefaultRenderer() + { + return new LBRendererBase(); + } + + /// + /// Calculate the dimensions of the control + /// + protected virtual void CalculateDimensions() + { + this.DefaultRenderer.Update(); + + // Update the data in the renderer + if (this.Renderer != null) + this.Renderer.Update(); + + this.Invalidate(); + } + #endregion + } + + /// + /// Base class for the controls renderer + /// + public class LBRendererBase : ILBRenderer + { + #region (* Constructor *) + public LBRendererBase() + { + } + #endregion + + #region (* IDisposable implementation *) + public void Dispose() + { + this.OnDispose(); + } + #endregion + + #region (* Properties *) + /// + /// Associated control + /// + protected object _control = null; + public object Control + { + set { this._control = value; } + get { return this._control; } + } + #endregion + + #region (* Virtual methods *) + /// + /// Dispose the resource of the object + /// + public virtual void OnDispose() + { + } + + /// + /// Update the renderer + /// + /// + public virtual bool Update() + { + return false; + } + + /// + /// Drawing method + /// + /// + public virtual void Draw(Graphics Gr) + { + // Check the graphics + if (Gr == null) + throw new ArgumentNullException("Gr"); + + // Check the control + Control ctrl = this.Control as Control; + if (ctrl == null) + throw new NullReferenceException("Associated control is not valid"); + + // Default drawing + Rectangle rc = ctrl.Bounds; + + Gr.FillRectangle(Brushes.White, ctrl.Bounds); + Gr.DrawRectangle(Pens.Black, ctrl.Bounds); + + Gr.DrawLine(Pens.Red, + ctrl.Left, + ctrl.Top, + ctrl.Right, + ctrl.Bottom); + + Gr.DrawLine(Pens.Red, + ctrl.Right, + ctrl.Top, + ctrl.Left, + ctrl.Bottom); + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/Renderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/Renderer.cs new file mode 100644 index 0000000..3a0aefc --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/Renderer.cs @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------- + * File: Renderer.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.Drawing; + +namespace LBSoft.IndustrialCtrls.Base +{ + /// + /// Renderer interface for all + /// LBSoft.IndustrialCtrls renderer + /// + public interface ILBRenderer : IDisposable + { + object Control + { + set; + get; + } + bool Update (); + void Draw ( Graphics Gr ); + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/ButtonRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/ButtonRenderer.cs new file mode 100644 index 0000000..6241e3c --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/ButtonRenderer.cs @@ -0,0 +1,265 @@ +/*--------------------------------------------------------------------------- + * File: ButtonRenderer.cs + * Utente: lucabonotto + * Date: 05/04/2009 + * Time: 13.36 + *-------------------------------------------------------------------------*/ + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using LBSoft.IndustrialCtrls.Utils; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Buttons +{ + /// + /// Base class for the button renderers + /// + public class LBButtonRenderer : LBRendererBase + { + #region (* Variables *) + protected RectangleF rectCtrl; + protected RectangleF rectBody; + protected RectangleF rectText; + protected float drawRatio = 1.0F; + #endregion + + #region (* Constructor *) + public LBButtonRenderer() + { + this.rectCtrl = new RectangleF ( 0, 0, 0, 0 ); + } + #endregion + + #region (* Overrided methods *) + /// + /// Update the rectangles for drawing + /// + /// + public override bool Update() + { + // Check Button object + if ( this.Button == null ) + throw new NullReferenceException ( "Invalid 'Button' object" ); + + // Control rectangle + this.rectCtrl.X = 0; + this.rectCtrl.Y = 0; + this.rectCtrl.Width = this.Button.Width; + this.rectCtrl.Height = this.Button.Height; + + if (this.Button.Style == LBButton.ButtonStyle.Circular) + { + if (rectCtrl.Width < rectCtrl.Height) + rectCtrl.Height = rectCtrl.Width; + else if (rectCtrl.Width > rectCtrl.Height) + rectCtrl.Width = rectCtrl.Height; + + if (rectCtrl.Width < 10) + rectCtrl.Width = 10; + if (rectCtrl.Height < 10) + rectCtrl.Height = 10; + } + + this.rectBody = this.rectCtrl; + this.rectBody.Width -= 1; + this.rectBody.Height -= 1; + + this.rectText = this.rectCtrl; + this.rectText.Width -= 2; + this.rectText.Height -= 2; + + // Calculate ratio + drawRatio = (Math.Min(rectCtrl.Width,rectCtrl.Height)) / 200; + if ( drawRatio == 0.0 ) + drawRatio = 1; + + return true; + } + + /// + /// Draw the button object + /// + /// + public override void Draw ( Graphics Gr ) + { + if ( Gr == null ) + throw new ArgumentNullException ( "Gr", "Invalid Graphics object" ); + + if ( this.Button == null ) + throw new NullReferenceException ( "Invalid 'Button' object" ); + + this.DrawBackground( Gr, this.rectCtrl ); + this.DrawBody ( Gr, this.rectBody ); + this.DrawText ( Gr, this.rectText ); + } + #endregion + + #region (* Properies *) + /// + /// Get the associated button object + /// + public LBButton Button + { + get { return this.Control as LBButton; } + } + #endregion + + #region (* Virtual method *) + /// + /// Draw the background of the control + /// + /// + /// + /// + public virtual bool DrawBackground( Graphics Gr, RectangleF rc ) + { + if ( this.Button == null ) + return false; + + Color c = this.Button.BackColor; + SolidBrush br = new SolidBrush ( c ); + Pen pen = new Pen ( c ); + + Rectangle _rcTmp = new Rectangle(0, 0, this.Button.Width, this.Button.Height ); + Gr.DrawRectangle ( pen, _rcTmp ); + Gr.FillRectangle ( br, rc ); + + br.Dispose(); + pen.Dispose(); + + return true; + } + + /// + /// Draw the body of the control + /// + /// + /// + /// + public virtual bool DrawBody( Graphics Gr, RectangleF rc ) + { + if ( this.Button == null ) + return false; + + Color bodyColor = this.Button.ButtonColor; + Color cDark = LBColorManager.StepColor ( bodyColor, 20 ); + + LinearGradientBrush br1 = new LinearGradientBrush ( rc, + bodyColor, + cDark, + 45 ); + + if ((this.Button.Style == LBButton.ButtonStyle.Circular) || + (this.Button.Style == LBButton.ButtonStyle.Elliptical)) + { + Gr.FillEllipse(br1, rc); + } + else + { + GraphicsPath path = this.RoundedRect(rc, 15F); + Gr.FillPath(br1, path); + path.Dispose(); + } + + if ( this.Button.State == LBButton.ButtonState.Pressed ) + { + RectangleF _rc = rc; + _rc.Inflate ( -15F * this.drawRatio, -15F * drawRatio ); + LinearGradientBrush br2 = new LinearGradientBrush ( _rc, + cDark, + bodyColor, + 45 ); + if ((this.Button.Style == LBButton.ButtonStyle.Circular) || + (this.Button.Style == LBButton.ButtonStyle.Elliptical)) + { + Gr.FillEllipse(br2, _rc); + } + else + { + GraphicsPath path = this.RoundedRect(_rc, 10F); + Gr.FillPath(br2, path); + path.Dispose(); + } + + br2.Dispose(); + } + + br1.Dispose(); + return true; + } + + /// + /// Draw the text of the control + /// + /// + /// + /// + public virtual bool DrawText( Graphics Gr, RectangleF rc ) + { + if ( this.Button == null ) + return false; + + //Draw Strings + Font font = new Font ( this.Button.Font.FontFamily, + this.Button.Font.Size * this.drawRatio, + this.Button.Font.Style ); + + String str = this.Button.Label; + + Color bodyColor = this.Button.ButtonColor; + Color cDark = LBColorManager.StepColor ( bodyColor, 20 ); + + SizeF size = Gr.MeasureString ( str, font ); + + SolidBrush br1 = new SolidBrush ( bodyColor ); + SolidBrush br2 = new SolidBrush ( cDark ); + + Gr.DrawString ( str, + font, + br1, + rc.Left + ( ( rc.Width * 0.5F ) - (float)( size.Width * 0.5F ) ) + (float)( 1 * this.drawRatio ), + rc.Top + ( ( rc.Height * 0.5F ) - (float)( size.Height * 0.5 ) ) + (float)( 1 * this.drawRatio ) ); + + Gr.DrawString ( str, + font, + br2, + rc.Left + ( ( rc.Width * 0.5F ) - (float)( size.Width * 0.5F ) ), + rc.Top + ( ( rc.Height * 0.5F ) - (float)( size.Height * 0.5 ) ) ); + + br1.Dispose(); + br2.Dispose(); + font.Dispose(); + + return false; + } + #endregion + + #region (* Protected Methods *) + protected GraphicsPath RoundedRect(RectangleF rect, float radius) + { + RectangleF baseRect = rect; + float diameter = (radius*this.drawRatio) * 2.0f; + SizeF sizeF = new SizeF(diameter, diameter); + RectangleF arc = new RectangleF(baseRect.Location, sizeF); + GraphicsPath path = new GraphicsPath(); + + // top left arc + path.AddArc(arc, 180, 90); + // top right arc + arc.X = baseRect.Right - diameter; + path.AddArc(arc, 270, 90); + // bottom right arc + arc.Y = baseRect.Bottom - diameter; + path.AddArc(arc, 0, 90); + // bottom left arc + arc.X = baseRect.Left; + path.AddArc(arc, 90, 90); + + path.CloseFigure(); + return path; + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.Designer.cs new file mode 100644 index 0000000..cd229b0 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.Designer.cs @@ -0,0 +1,51 @@ +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 05/04/2008 + * Ora: 13.36 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +namespace LBSoft.IndustrialCtrls.Buttons +{ + partial class LBButton + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the control. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // LBButton + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "LBButton"; + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnMouseDown); + this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnMuoseUp); + this.ResumeLayout(false); + } + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.cs new file mode 100644 index 0000000..a7bb327 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.cs @@ -0,0 +1,297 @@ +/*--------------------------------------------------------------------------- + * File: LBButton.cs + * Utente: lucabonotto + * Date: 05/04/2009 + * Time: 13.36 + *-------------------------------------------------------------------------*/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Buttons +{ + /// + /// Description of LBButton. + /// + public partial class LBButton : LBIndustrialCtrlBase + { + #region (* Enumeratives *) + /// + /// Button styles + /// + public enum ButtonStyle + { + Circular = 0, + Rectangular = 1, + Elliptical = 2, + } + + /// + /// Button states + /// + public enum ButtonState + { + Normal = 0, + Pressed, + } + #endregion + + #region (* Properties variables *) + private ButtonStyle buttonStyle = ButtonStyle.Circular; + private ButtonState buttonState = ButtonState.Normal; + private Color buttonColor = Color.Red; + private string label = String.Empty; + private bool enableRepeatState = false; + private int startRepeatInterval = 500; + private int repeatInterval = 100; + #endregion + + #region (* Variables *) + private Timer tmrRepeat = null; + #endregion + + #region (* Constructor *) + public LBButton() + { + // Initialization + InitializeComponent(); + + // Properties initialization + this.buttonColor = Color.Red; + this.Size = new Size(50, 50); + + // Timer + this.tmrRepeat = new Timer(); + this.tmrRepeat.Enabled = false; + this.tmrRepeat.Interval = this.startRepeatInterval; + this.tmrRepeat.Tick += this.Timer_Tick; + } + #endregion + + #region (* Overrided methods *) + protected override ILBRenderer CreateDefaultRenderer() + { + return new LBButtonRenderer(); + } + #endregion + + #region (* Properties *) + [ + Category("Button"), + Description("Style of the button") + ] + public ButtonStyle Style + { + set + { + this.buttonStyle = value; + this.CalculateDimensions(); + } + get { return this.buttonStyle; } + } + + [ + Category("Button"), + Description("Color of the body of the button") + ] + public Color ButtonColor + { + get { return buttonColor; } + set + { + buttonColor = value; + Invalidate(); + } + } + + [ + Category("Button"), + Description("Label of the button"), + ] + public string Label + { + get { return this.label; } + set + { + this.label = value; + Invalidate(); + } + } + + [ + Category("Button"), + Description("State of the button") + ] + public ButtonState State + { + set + { + this.buttonState = value; + this.Invalidate(); + } + get { return this.buttonState; } + } + + [ + Category("Button"), + Description("Enable/Disable the repetition of the event if the button is pressed") + ] + public bool RepeatState + { + set { this.enableRepeatState = value; } + get { return this.enableRepeatState; } + } + + [ + Category("Button"), + Description("Interval to wait in ms for start the repetition") + ] + public int StartRepeatInterval + { + set { this.startRepeatInterval = value; } + get { return this.startRepeatInterval; } + } + + [ + Category("Button"), + Description("Interva in ms for the repetition") + ] + public int RepeatInterval + { + set { this.repeatInterval = value; } + get { return this.repeatInterval; } + } + #endregion + + #region (* Events delegates *) + /// + /// Timer event + /// + /// + /// + void Timer_Tick(object sender, EventArgs e) + { + this.tmrRepeat.Enabled = false; + + // Update the interval + if (tmrRepeat.Interval == this.startRepeatInterval) + this.tmrRepeat.Interval = this.repeatInterval; + + // Call the delagate + LBButtonEventArgs ev = new LBButtonEventArgs(); + ev.State = this.State; + this.OnButtonRepeatState(ev); + + this.tmrRepeat.Enabled = true; + } + + /// + /// Mouse down event + /// + /// + /// + void OnMouseDown(object sender, MouseEventArgs e) + { + // Change the state + this.State = ButtonState.Pressed; + this.Invalidate(); + + // Call the delagates + LBButtonEventArgs ev = new LBButtonEventArgs(); + ev.State = this.State; + this.OnButtonChangeState ( ev ); + + // Enable the repeat timer + if (this.RepeatState != false) + { + this.tmrRepeat.Interval = this.StartRepeatInterval; + this.tmrRepeat.Enabled = true; + } + } + + /// + /// Mouse up event + /// + /// + /// + void OnMuoseUp(object sender, MouseEventArgs e) + { + // Change the state + this.State = ButtonState.Normal; + this.Invalidate(); + + // Call the delagates + LBButtonEventArgs ev = new LBButtonEventArgs(); + ev.State = this.State; + this.OnButtonChangeState ( ev ); + + // Disable the timer + this.tmrRepeat.Enabled = false; + } + #endregion + + #region (* Fire events *) + /// + /// Event for the state changed + /// + public event ButtonChangeState ButtonChangeState; + + /// + /// Method for call the delagetes + /// + /// + protected virtual void OnButtonChangeState( LBButtonEventArgs e ) + { + if( this.ButtonChangeState != null ) + this.ButtonChangeState( this, e ); + } + + /// + /// Event for the repetition of state + /// + public event ButtonRepeatState ButtonRepeatState; + + /// + /// Method for call the delagetes + /// + /// + protected virtual void OnButtonRepeatState(LBButtonEventArgs e) + { + if (this.ButtonRepeatState != null) + this.ButtonRepeatState(this, e); + } + #endregion + } + + #region (* Classes for event and event delagates args *) + + #region (* Event args class *) + /// + /// Class for events delegates + /// + public class LBButtonEventArgs : EventArgs + { + private LBButton.ButtonState state; + + public LBButtonEventArgs() + { + } + + public LBButton.ButtonState State + { + get { return this.state; } + set { this.state = value; } + } + } + #endregion + + #region (* Delegates *) + public delegate void ButtonChangeState ( object sender, LBButtonEventArgs e ); + public delegate void ButtonRepeatState ( object sender, LBButtonEventArgs e ); + #endregion + + #endregion +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.resx new file mode 100644 index 0000000..7080a7d --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/Knob.bmp b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/Knob.bmp new file mode 100644 index 0000000000000000000000000000000000000000..94a36c59404c9fc9a1e91469fea0f6d846648367 GIT binary patch literal 822 zcmb7C%Wo2K5XN})V&cUk2S^AOkw+F-Xty9BZ+R@Q@G2$^N@CDL!D_2eND=J`i^8I| zyQNJVc`OTfXtkR7k2zt zP4IZ%7i=<_jK|~AXfzlM`u#pchG8JHK$%0xlO$QI)zay--|u(3-N|IKSS%6*LDTe{ zH$_mn*uHN9*nO5zN3!jwm{t z?>HO|trk_QR6xErHJA!P)TkDX#-jWCb!IeT`HkkqMs_a}i9jj6UJtapQv;z|tws<8 z$MM~Ab;!*49~xJ=+_uZ*3WY*WrxU|4rBVqBXrfZ7SpJ)0c{rT$KM|K(TQ#588;{2m ziGYUpTJb=$%`<3cdD)q!- zd0;jfEf$O2W;2>hejHCdPPd3ox7*|P4**`v!N + /// Base class for the renderers of the knob + /// + public class LBKnobRenderer : LBRendererBase + { + #region (* Variables *) + private RectangleF drawRect; + private RectangleF rectScale; + private RectangleF rectKnob; + private PointF knobCenter; + private PointF knobIndicatorPos; + private float drawRatio; + #endregion + + #region (* Properies *) + public LBKnob Knob + { + get { return this.Control as LBKnob; } + } + #endregion + + #region (* Overrided method *) + public override bool Update() + { + // Check Button object + if (this.Knob == null) + throw new NullReferenceException("Invalid 'Knob' object"); + + // Rectangle + float x, y, w, h; + x = 0; + y = 0; + w = this.Knob.Size.Width; + h = this.Knob.Size.Height; + + // Calculate ratio + drawRatio = (Math.Min(w, h)) / 200; + if (drawRatio == 0.0) + drawRatio = 1; + + // Draw rectangle + drawRect.X = x; + drawRect.Y = y; + drawRect.Width = w - 2; + drawRect.Height = h - 2; + + if (w < h) + drawRect.Height = w; + else if (w > h) + drawRect.Width = h; + + if (drawRect.Width < 10) + drawRect.Width = 10; + if (drawRect.Height < 10) + drawRect.Height = 10; + + this.rectScale = this.drawRect; + this.rectKnob = this.drawRect; + this.rectKnob.Inflate(-20 * this.drawRatio, -20 * this.drawRatio); + + this.knobCenter.X = this.rectKnob.Left + (this.rectKnob.Width * 0.5F); + this.knobCenter.Y = this.rectKnob.Top + (this.rectKnob.Height * 0.5F); + + this.knobIndicatorPos = this.Knob.GetPositionFromValue(this.Knob.Value); + + this.Knob.KnobRect = this.rectKnob; + this.Knob.KnobCenter = this.knobCenter; + this.Knob.DrawRatio = this.drawRatio; + return true; + } + + public override void Draw(Graphics Gr) + { + if (Gr == null) + throw new ArgumentNullException("Gr"); + + LBKnob ctrl = this.Knob; + if (ctrl == null) + throw new NullReferenceException("Associated control is not valid"); + + this.DrawBackground(Gr, ctrl.Bounds); + this.DrawScale(Gr, this.rectScale); + this.DrawKnob(Gr, this.rectKnob); + this.DrawKnobIndicator(Gr, this.rectKnob, this.knobIndicatorPos); + } + #endregion + + #region (* Virtual method *) + /// + /// Draw the background of the control + /// + /// + /// + /// + public virtual bool DrawBackground( Graphics Gr, RectangleF rc ) + { + if ( this.Knob == null ) + return false; + + Color c = this.Knob.BackColor; + SolidBrush br = new SolidBrush ( c ); + Pen pen = new Pen ( c ); + + Rectangle _rcTmp = new Rectangle(0, 0, this.Knob.Width, this.Knob.Height ); + Gr.DrawRectangle ( pen, _rcTmp ); + Gr.FillRectangle ( br, rc ); + + br.Dispose(); + pen.Dispose(); + + return true; + } + + /// + /// Draw the scale of the control + /// + /// + /// + /// + public virtual bool DrawScale( Graphics Gr, RectangleF rc ) + { + if ( this.Knob == null ) + return false; + + Color cKnob = this.Knob.ScaleColor; + Color cKnobDark = LBColorManager.StepColor ( cKnob, 60 ); + + LinearGradientBrush br = new LinearGradientBrush ( rc, cKnobDark, cKnob, 45 ); + + Gr.FillEllipse ( br, rc ); + + br.Dispose(); + + return true; + } + + /// + /// Draw the knob of the control + /// + /// + /// + /// + public virtual bool DrawKnob( Graphics Gr, RectangleF rc ) + { + if ( this.Knob == null ) + return false; + + Color cKnob = this.Knob.KnobColor; + Color cKnobDark = LBColorManager.StepColor ( cKnob, 60 ); + + LinearGradientBrush br = new LinearGradientBrush ( rc, cKnob, cKnobDark, 45 ); + + Gr.FillEllipse ( br, rc ); + + br.Dispose(); + + return true; + } + + public virtual bool DrawKnobIndicator( Graphics Gr, RectangleF rc, PointF pos ) + { + if ( this.Knob == null ) + return false; + + RectangleF _rc = rc; + _rc.X = pos.X - 4; + _rc.Y = pos.Y - 4; + _rc.Width = 8; + _rc.Height = 8; + + Color cKnob = this.Knob.IndicatorColor; + Color cKnobDark = LBColorManager.StepColor ( cKnob, 60 ); + + LinearGradientBrush br = new LinearGradientBrush ( _rc, cKnobDark, cKnob, 45 ); + + Gr.FillEllipse ( br, _rc ); + + br.Dispose(); + + return true; + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.Designer.cs new file mode 100644 index 0000000..4d1d2f0 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.Designer.cs @@ -0,0 +1,53 @@ +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 05/04/2008 + * Ora: 13.35 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +namespace LBSoft.IndustrialCtrls.Knobs +{ + partial class LBKnob + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the control. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // LBKnob + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "LBKnob"; + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnMouseDown); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.OnMouseMove); + this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnMouseUp); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnKeyDown); + this.ResumeLayout(false); + } + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.cs new file mode 100644 index 0000000..68556e4 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.cs @@ -0,0 +1,450 @@ +/*--------------------------------------------------------------------------- + * File: LBKnob.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Knobs +{ + /// + /// Description of LBKnob. + /// + public partial class LBKnob : LBIndustrialCtrlBase + { + #region *( Enumerators *) + public enum KnobStyle + { + Circular = 0, + } + #endregion + + #region (* Properties variables *) + private float minValue = 0.0F; + private float maxValue = 1.0F; + private float stepValue = 0.1F; + private float currValue = 0.0F; + private RectangleF knobRect = RectangleF.Empty; + private PointF knobCenter = PointF.Empty; + private KnobStyle style = KnobStyle.Circular; + private Color scaleColor = Color.Green; + private Color knobColor = Color.Black ; + private Color indicatorColor = Color.Red; + private float indicatorOffset = 10F; + private float drawRatio = 1F; + #endregion + + #region (* Class variables *) + private bool isKnobRotating = false; + #endregion + + #region (* Constructor *) + public LBKnob() + { + InitializeComponent(); + + this.CalculateDimensions(); + } + #endregion + + #region (* Properties *) + [ + Category("Knob"), + Description("Minimum value of the knob") + ] + public float MinValue + { + set + { + this.minValue = value; + this.Invalidate(); + } + get { return this.minValue; } + } + + [ + Category("Knob"), + Description("Maximum value of the knob") + ] + public float MaxValue + { + set + { + this.maxValue = value; + this.Invalidate(); + } + get { return this.maxValue; } + } + + [ + Category("Knob"), + Description("Step value of the knob") + ] + public float StepValue + { + set + { + this.stepValue = value; + this.Invalidate(); + } + get { return this.stepValue; } + } + + [ + Category("Knob"), + Description("Current value of the knob") + ] + public float Value + { + set + { + if ( value != this.currValue ) + { + this.currValue = value; + this.CalculateDimensions(); + this.Invalidate(); + + LBKnobEventArgs e = new LBKnobEventArgs(); + e.Value = this.currValue; + this.OnKnobChangeValue( e ); + } + } + get { return this.currValue; } + } + + [ + Category("Knob"), + Description("Style of the knob") + ] + public KnobStyle Style + { + set + { + this.style = value; + this.Invalidate(); + } + get { return this.style; } + } + + [ + Category("Knob"), + Description("Color of the knob") + ] + public Color KnobColor + { + set + { + this.knobColor = value; + this.Invalidate(); + } + get { return this.knobColor; } + } + + [ + Category("Knob"), + Description("Color of the scale") + ] + public Color ScaleColor + { + set + { + this.scaleColor = value; + this.Invalidate(); + } + get { return this.scaleColor; } + } + + [ + Category("Knob"), + Description("Color of the indicator") + ] + public Color IndicatorColor + { + set + { + this.indicatorColor = value; + this.Invalidate(); + } + get { return this.indicatorColor; } + } + + [ + Category("Knob"), + Description("Offset of the indicator from the kob border") + ] + public float IndicatorOffset + { + set + { + this.indicatorOffset = value; + this.CalculateDimensions(); + this.Invalidate(); + } + get { return this.indicatorOffset; } + } + + [Browsable(false)] + public PointF KnobCenter + { + set { this.knobCenter = value; } + get { return this.knobCenter; } + } + + [Browsable(false)] + public RectangleF KnobRect + { + set { this.knobRect = value; } + get { return this.knobRect; } + } + + [Browsable(false)] + public float DrawRatio + { + set { this.drawRatio = value; } + get { return this.drawRatio; } + } + #endregion + + #region (* Events delegates *) + + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + bool blResult = true; + + /// + /// Specified WM_KEYDOWN enumeration value. + /// + const int WM_KEYDOWN = 0x0100; + + /// + /// Specified WM_SYSKEYDOWN enumeration value. + /// + const int WM_SYSKEYDOWN = 0x0104; + + float val = this.Value; + + if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN)) + { + switch(keyData) + { + case Keys.Up: + val += this.StepValue; + if ( val <= this.MaxValue ) + this.Value = val; + break; + + case Keys.Down: + val -= this.StepValue; + if ( val >= this.MinValue ) + this.Value = val; + break; + + case Keys.PageUp: + if ( val < this.MaxValue ) + { + val += ( this.StepValue * 10 ); + this.Value = val; + } + break; + + case Keys.PageDown: + if ( val > this.MinValue ) + { + val -= ( this.StepValue * 10 ); + this.Value = val; + } + break; + + case Keys.Home: + this.Value = this.MinValue; + break; + + case Keys.End: + this.Value = this.MaxValue; + break; + + default: + blResult = base.ProcessCmdKey(ref msg,keyData); + break; + } + } + + return blResult; + } + + [System.ComponentModel.EditorBrowsableAttribute()] + protected override void OnClick(EventArgs e) + { + this.Focus(); + this.Invalidate(); + base.OnClick(e); + } + + void OnMouseUp(object sender, MouseEventArgs e) + { + this.isKnobRotating = false; + + if (this.knobRect.Contains(e.Location) == false) + return; + + float val = this.GetValueFromPosition ( e.Location ); + if ( val != this.Value ) + { + this.Value = val; + this.Invalidate(); + } + } + + void OnMouseDown(object sender, MouseEventArgs e) + { + if (this.knobRect.Contains(e.Location) == false) + return; + + this.isKnobRotating = true; + + this.Focus(); + } + + void OnMouseMove(object sender, MouseEventArgs e) + { + if ( this.isKnobRotating == false ) + return; + + float val = this.GetValueFromPosition ( e.Location ); + if ( val != this.Value ) + { + this.Value = val; + this.Invalidate (); + } + } + + void OnKeyDown(object sender, KeyEventArgs e) + { + float val = this.Value; + + switch ( e.KeyCode ) + { + case Keys.Up: + val = this.Value + this.StepValue; + break; + + case Keys.Down: + val = this.Value - this.StepValue; + break; + } + + if ( val < this.MinValue ) + val = this.MinValue; + + if ( val > this.MaxValue ) + val = this.MaxValue; + + this.Value = val; + } + #endregion + + #region (* Virtual methods *) + public virtual float GetValueFromPosition ( PointF position ) + { + float degree = 0.0F; + float v = 0.0F; + + PointF center = this.KnobCenter; + + if ( position.X <= center.X ) + { + degree = (center.Y - position.Y ) / (center.X - position.X ); + degree = (float)Math.Atan(degree); + degree = (float)((degree) * (180F / Math.PI) + 45F); + v = (degree * ( this.MaxValue - this.MinValue )/ 270F); + } + else + { + if ( position.X > center.X ) + { + degree = (position.Y - center.Y ) / (position.X - center.X ); + degree = (float)Math.Atan(degree); + degree = (float)(225F + (degree) * (180F / Math.PI)); + v = (degree * ( this.MaxValue - this.MinValue ) / 270F); + } + } + + if ( v > this.MaxValue ) + v = this.MaxValue; + + if (v < this.MinValue ) + v = this.MinValue; + + return v; + } + + public virtual PointF GetPositionFromValue ( float val ) + { + PointF pos = new PointF( 0.0F, 0.0F ); + + // Elimina la divisione per 0 + if ( ( this.MaxValue - this.MinValue ) == 0 ) + return pos; + + float _indicatorOffset = this.IndicatorOffset * this.drawRatio; + + float degree = 270F * val / ( this.MaxValue - this.MinValue ); + degree = (degree + 135F) * (float)Math.PI / 180F; + + pos.X = (int)(Math.Cos(degree) * ((this.knobRect.Width * 0.5F) - indicatorOffset) + this.knobRect.X + (this.knobRect.Width * 0.5F)); + pos.Y = (int)(Math.Sin(degree) * ((this.knobRect.Width * 0.5F) - indicatorOffset) + this.knobRect.Y + (this.knobRect.Height * 0.5F)); + + return pos; + } + #endregion + + #region (* Fire events *) + public event KnobChangeValue KnobChangeValue; + protected virtual void OnKnobChangeValue( LBKnobEventArgs e ) + { + if( this.KnobChangeValue != null ) + this.KnobChangeValue( this, e ); + } + #endregion + + #region (* Overrided method *) + protected override ILBRenderer CreateDefaultRenderer() + { + return new LBKnobRenderer(); + } + #endregion + } + + #region (* Classes for event and event delagates args *) + + #region (* Event args class *) + /// + /// Class for events delegates + /// + public class LBKnobEventArgs : EventArgs + { + private float val; + + public LBKnobEventArgs() + { + } + + public float Value + { + get { return this.val; } + set { this.val = value; } + } + } + #endregion + + #region (* Delegates *) + public delegate void KnobChangeValue ( object sender, LBKnobEventArgs e ); + #endregion + + #endregion +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.resx new file mode 100644 index 0000000..7080a7d --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/LBIndustrialCtrls.csproj b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/LBIndustrialCtrls.csproj new file mode 100644 index 0000000..f53dc4f --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/LBIndustrialCtrls.csproj @@ -0,0 +1,176 @@ + + + {B4218BC9-9736-42B9-BC99-7903FDBEBA28} + Debug + AnyCPU + Library + LBIndustrialCtrls + LBIndustrialCtrls + False + False + 4 + false + + + + + 3.5 + v4.5.2 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + bin\Debug\ + true + Full + False + True + DEBUG;TRACE + + + bin\Release\ + False + None + True + False + TRACE + + + False + Auto + 4194304 + AnyCPU + 4096 + + + MinimumRecommendedRules.ruleset + false + + + MinimumRecommendedRules.ruleset + false + + + true + + + + + + + + + + + + UserControl + + + LBIndustrialCtrlBase.cs + + + + UserControl + + + LBButton.cs + + + + + UserControl + + + + UserControl + + + LBLed.cs + + + + UserControl + + + LB7SegmentDisplay.cs + + + + UserControl + + + + UserControl + + + LBDigitalMeter.cs + + + + + + + + LBButton.cs + + + LBKnob.cs + + + LBLed.cs + + + LB7SegmentDisplay.cs + + + LBDigitalMeter.cs + + + + + + False + .NET Framework Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + false + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.Designer.cs new file mode 100644 index 0000000..df31d58 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.Designer.cs @@ -0,0 +1,51 @@ +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 26/03/2009 + * Ora: 10.42 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +namespace LBSoft.IndustrialCtrls.Leds + +{ + partial class LB7SegmentDisplay + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the control. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // LB7SegmentDisplay + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "LB7SegmentDisplay"; + this.Size = new System.Drawing.Size(44, 65); + this.ResumeLayout(false); + } + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.cs new file mode 100644 index 0000000..7988a1c --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.cs @@ -0,0 +1,59 @@ +/*--------------------------------------------------------------------------- + * File: LBLed.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Leds +{ + /// + /// Description of LB7SegmentDisplay. + /// + public partial class LB7SegmentDisplay : LBIndustrialCtrlBase + { + #region (* Constructor *) + public LB7SegmentDisplay() + { + InitializeComponent(); + } + #endregion + + #region (* Properties *) + public int val = 0; + [ + Category("Display"), + Description("Value of the display") + ] + public int Value + { + set { this.val = value; this.Invalidate(); } + get { return this.val; } + } + + private bool showDp = false; + [ + Category("Display"), + Description("Show the point of the display") + ] + public bool ShowDP + { + set { this.showDp = value; this.Invalidate(); } + get { return this.showDp; } + } + #endregion + + #region (* Overrided methods *) + protected override ILBRenderer CreateDefaultRenderer() + { + return new LB7SegmentDisplayRenderer(); + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.resx new file mode 100644 index 0000000..7080a7d --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplayRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplayRenderer.cs new file mode 100644 index 0000000..dc7f060 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplayRenderer.cs @@ -0,0 +1,608 @@ +/*--------------------------------------------------------------------------- + * File: LBLed.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using LBSoft.IndustrialCtrls.Base; + +using LBSoft.IndustrialCtrls.Utils; + +namespace LBSoft.IndustrialCtrls.Leds +{ + /// + /// Description of LB7SegmentDisplayRenderer. + /// + public class LB7SegmentDisplayRenderer : LBRendererBase + { + #region (* Constants *) + public const int WIDTH_PIXEL = 11; + public const int HEIGHT_PIXELS = 18; + #endregion + + #region (* Variables *) + /// + /// Segments data array + /// + protected SegmentDictionary segments = new SegmentDictionary(); + /// + /// Defaults points coordinates + /// + protected PointsList defPoints = new PointsList(); + /// + /// List of the points coordinates + /// + protected PointsList points = new PointsList(); + /// + /// Segments list of a value + /// + protected SegmentsValueDictionary valuesSegments = new SegmentsValueDictionary(); + /// + /// Rectangle of the dp + /// + protected RectangleF rectDP = new RectangleF(); + #endregion + + #region (* Contructor *) + public LB7SegmentDisplayRenderer() + { + this.CreateSegmetsData(); + this.CreateDefPointsCoordinates(); + this.CreateSegmentsValuesList(); + this.UpdatePointsCoordinates(); + } + #endregion + + #region (* Overrided methods *) + public override bool Update() + { + this.UpdatePointsCoordinates(); + return true; + } + + public override void Draw(Graphics Gr) + { + if (Gr == null) + throw new ArgumentNullException("Gr"); + + LB7SegmentDisplay ctrl = this.Display; + if (ctrl == null) + throw new NullReferenceException("Associated control is not valid"); + + RectangleF _rc = new RectangleF(0, 0, ctrl.Width, ctrl.Height); + Gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + + this.DrawBackground(Gr, _rc); + this.DrawOffSegments(Gr, _rc); + this.DrawValue(Gr, _rc); + } + #endregion + + #region (* Properies *) + [Browsable(false)] + public LB7SegmentDisplay Display + { + set { this.Control = value; } + get { return this.Control as LB7SegmentDisplay; } + } + + [Browsable(false)] + public SegmentDictionary Segments + { + get { return this.segments; } + } + #endregion + + #region (* Virtual methods *) + /// + /// Creation of the default points list of the + /// all segments + /// + protected virtual void CreateDefPointsCoordinates() + { + PointF pt = new PointF(3F, 1F); + this.defPoints.Add(pt); + pt = new PointF(8F, 1F); + this.defPoints.Add(pt); + pt = new PointF(9F, 2F); + this.defPoints.Add(pt); + pt = new PointF(10F, 3F); + this.defPoints.Add(pt); + pt = new PointF(10F, 8F); + this.defPoints.Add(pt); + pt = new PointF(9F, 9F); + this.defPoints.Add(pt); + pt = new PointF(10F, 10F); + this.defPoints.Add(pt); + pt = new PointF(10F, 15F); + this.defPoints.Add(pt); + pt = new PointF(9F, 16F); + this.defPoints.Add(pt); + pt = new PointF(8F, 17F); + this.defPoints.Add(pt); + pt = new PointF(3F, 17F); + this.defPoints.Add(pt); + pt = new PointF(2F, 16F); + this.defPoints.Add(pt); + pt = new PointF(1F, 15F); + this.defPoints.Add(pt); + pt = new PointF(1F, 10F); + this.defPoints.Add(pt); + pt = new PointF(2F, 9F); + this.defPoints.Add(pt); + pt = new PointF(1F, 8F); + this.defPoints.Add(pt); + pt = new PointF(1F, 3F); + this.defPoints.Add(pt); + pt = new PointF(2F, 2F); + this.defPoints.Add(pt); + pt = new PointF(3F, 3F); + this.defPoints.Add(pt); + pt = new PointF(8F, 3F); + this.defPoints.Add(pt); + pt = new PointF(8F, 8F); + this.defPoints.Add(pt); + pt = new PointF(8F, 10F); + this.defPoints.Add(pt); + pt = new PointF(8F, 15F); + this.defPoints.Add(pt); + pt = new PointF(3F, 15F); + this.defPoints.Add(pt); + pt = new PointF(3F, 10F); + this.defPoints.Add(pt); + pt = new PointF(3F, 8F); + this.defPoints.Add(pt); + } + + /// + /// Create the dictionary of the + /// segment coordinates + /// + protected virtual void CreateSegmetsData() + { + this.Segments.Clear(); + + Segment s = new Segment(); + s.PointsIndexs[0] = 0; + s.PointsIndexs[1] = 1; + s.PointsIndexs[2] = 2; + s.PointsIndexs[3] = 19; + s.PointsIndexs[4] = 18; + s.PointsIndexs[5] = 17; + this.Segments.Add('A', s); + + s = new Segment(); + s.PointsIndexs[0] = 2; + s.PointsIndexs[1] = 3; + s.PointsIndexs[2] = 4; + s.PointsIndexs[3] = 5; + s.PointsIndexs[4] = 20; + s.PointsIndexs[5] = 19; + this.Segments.Add('B', s); + + s = new Segment(); + s.PointsIndexs[0] = 6; + s.PointsIndexs[1] = 7; + s.PointsIndexs[2] = 8; + s.PointsIndexs[3] = 22; + s.PointsIndexs[4] = 21; + s.PointsIndexs[5] = 5; + this.Segments.Add('C', s); + + s = new Segment(); + s.PointsIndexs[0] = 9; + s.PointsIndexs[1] = 10; + s.PointsIndexs[2] = 11; + s.PointsIndexs[3] = 23; + s.PointsIndexs[4] = 22; + s.PointsIndexs[5] = 8; + this.Segments.Add('D', s); + + s = new Segment(); + s.PointsIndexs[0] = 12; + s.PointsIndexs[1] = 13; + s.PointsIndexs[2] = 14; + s.PointsIndexs[3] = 24; + s.PointsIndexs[4] = 23; + s.PointsIndexs[5] = 11; + this.Segments.Add('E', s); + + s = new Segment(); + s.PointsIndexs[0] = 15; + s.PointsIndexs[1] = 16; + s.PointsIndexs[2] = 17; + s.PointsIndexs[3] = 18; + s.PointsIndexs[4] = 25; + s.PointsIndexs[5] = 14; + this.Segments.Add('F', s); + + s = new Segment(); + s.PointsIndexs[0] = 25; + s.PointsIndexs[1] = 20; + s.PointsIndexs[2] = 5; + s.PointsIndexs[3] = 21; + s.PointsIndexs[4] = 24; + s.PointsIndexs[5] = 14; + this.Segments.Add('G', s); + } + + /// + /// Create the dictionary of the segments + /// for the number values + /// + protected virtual void CreateSegmentsValuesList() + { + SegmentsList list = new SegmentsList(); + list.Add('A'); + list.Add('B'); + list.Add('C'); + list.Add('D'); + list.Add('E'); + list.Add('F'); + this.valuesSegments.Add(0, list); + + list = new SegmentsList(); + list.Add('B'); + list.Add('C'); + this.valuesSegments.Add(1, list); + + list = new SegmentsList(); + list.Add('A'); + list.Add('B'); + list.Add('G'); + list.Add('E'); + list.Add('D'); + this.valuesSegments.Add(2, list); + + list = new SegmentsList(); + list.Add('A'); + list.Add('B'); + list.Add('G'); + list.Add('C'); + list.Add('D'); + this.valuesSegments.Add(3, list); + + list = new SegmentsList(); + list.Add('F'); + list.Add('G'); + list.Add('B'); + list.Add('C'); + this.valuesSegments.Add(4, list); + + list = new SegmentsList(); + list.Add('A'); + list.Add('F'); + list.Add('G'); + list.Add('C'); + list.Add('D'); + this.valuesSegments.Add(5, list); + + list = new SegmentsList(); + list.Add('A'); + list.Add('F'); + list.Add('G'); + list.Add('C'); + list.Add('D'); + list.Add('E'); + this.valuesSegments.Add(6, list); + + list = new SegmentsList(); + list.Add('A'); + list.Add('B'); + list.Add('C'); + this.valuesSegments.Add(7, list); + + list = new SegmentsList(); + list.Add('A'); + list.Add('B'); + list.Add('C'); + list.Add('D'); + list.Add('E'); + list.Add('F'); + list.Add('G'); + this.valuesSegments.Add(8, list); + + list = new SegmentsList(); + list.Add('A'); + list.Add('B'); + list.Add('C'); + list.Add('D'); + list.Add('F'); + list.Add('G'); + this.valuesSegments.Add(9, list); + + list = new SegmentsList(); + list.Add('G'); + this.valuesSegments.Add((int)'-', list); + + list = new SegmentsList(); + list.Add('A'); + list.Add('D'); + list.Add('E'); + list.Add('F'); + list.Add('G'); + this.valuesSegments.Add((int)'E', list); + } + + /// + /// Calculate the points coordinates for drawing + /// with the ratio of the control + /// + protected virtual void UpdatePointsCoordinates() + { + this.points.Clear(); + + double rappW = 1; + double rappH = 1; + + if (this.Display != null) + { + rappW = (double)this.Display.Width / (double)WIDTH_PIXEL; + rappH = (double)this.Display.Height / (double)HEIGHT_PIXELS; + } + + for (int idx = 0; idx < this.defPoints.Count; idx++) + { + PointF ptDef = this.defPoints[idx]; + PointF pt = new PointF((float)((double)ptDef.X * rappW), (float)((double)ptDef.Y * rappH)); + this.points.Add ( pt ); + } + + this.rectDP.X = this.points[7].X - (float)(0.5 * rappW); + this.rectDP.Y = this.points[8].Y; + this.rectDP.Width = (float)rappW; + this.rectDP.Height = (float)rappH; + } + + /// + /// Draw the control background + /// + /// + /// + /// + protected virtual bool DrawBackground(Graphics gr, RectangleF rc) + { + if (this.Display == null) + return false; + + Color c = this.Display.BackColor; + SolidBrush br = new SolidBrush(c); + Pen pen = new Pen(c); + + Rectangle _rcTmp = new Rectangle(0, 0, this.Display.Width, this.Display.Height); + gr.DrawRectangle(pen, _rcTmp); + gr.FillRectangle(br, rc); + + br.Dispose(); + pen.Dispose(); + + return true; + } + + /// + /// Draw all the segments in the off state + /// + /// + /// + /// + protected virtual bool DrawOffSegments(Graphics gr, RectangleF rc) + { + if (this.Display == null) + return false; + +// SolidBrush br = new SolidBrush(LBColorManager.StepColor(this.Display.ForeColor, 30)); + Color clr = Color.FromArgb(70, this.Display.ForeColor); + SolidBrush br = new SolidBrush(clr); + + foreach (Segment seg in this.Segments.Values) + { + GraphicsPath pth = new GraphicsPath(); + + for (int idx = 0; idx < seg.PointsIndexs.Length - 1; idx++) + { + PointF pt1 = this.points[seg.PointsIndexs[idx]]; + PointF pt2 = this.points[seg.PointsIndexs[idx + 1]]; + pth.AddLine(pt1, pt2); + } + pth.CloseFigure(); + + gr.FillPath(br, pth); + + pth.Dispose(); + } + + gr.FillEllipse(br, this.rectDP); + + br.Dispose(); + return true; + } + + /// + /// Draw the segments in on state + /// + /// + /// + /// + protected virtual bool DrawValue(Graphics gr, RectangleF rc) + { + if (this.Display == null) + return false; + + if (this.valuesSegments.Contains(this.Display.Value) == false) + return false; + + SegmentsList list = this.valuesSegments[this.Display.Value]; + if (list == null) + return false; + + SolidBrush br = new SolidBrush(this.Display.ForeColor); + + foreach (char ch in list) + { + Segment seg = this.segments[ch]; + if (seg != null) + { + GraphicsPath pth = new GraphicsPath(); + + for (int idx = 0; idx < seg.PointsIndexs.Length - 1; idx++) + { + PointF pt1 = this.points[seg.PointsIndexs[idx]]; + PointF pt2 = this.points[seg.PointsIndexs[idx + 1]]; + pth.AddLine(pt1, pt2); + } + pth.CloseFigure(); + + gr.FillPath(br, pth); + + pth.Dispose(); + } + } + + if (this.Display.ShowDP != false) + gr.FillEllipse(br, this.rectDP); + + br.Dispose(); + + return true; + } + #endregion + } + + /// + /// Dictionary for the segment associated + /// to the number + /// + public class SegmentDictionary : DictionaryBase + { + public Segment this[char ch] + { + set + { + if (Dictionary.Contains(ch) == false) + this.Add(ch, value); + else + Dictionary[ch] = value; + } + get + { + if (Dictionary.Contains(ch) == false) + return null; + + return (Segment)this.Dictionary[ch]; + } + } + + public void Add(char ch, Segment seg) + { + if (this.Contains(ch) == false) + this.Dictionary.Add(ch, seg); + else + this[ch] = seg; + } + + public bool Contains(char ch) + { + return this.Dictionary.Contains(ch); + } + + public ICollection Values + { + get { return this.Dictionary.Values; } + } + + public ICollection Keys + { + get { return this.Dictionary.Keys; } + } + } + + /// + /// Class for the segment data + /// + public class Segment + { + private int[] points = new int[6]; + public Segment() + { + } + + public int[] PointsIndexs + { + get { return this.points; } + } + } + + /// + /// Points list + /// + public class PointsList : List + { + public PointsList() + { + } + } + + /// + /// Segments list + /// + public class SegmentsList : List + { + public SegmentsList() + { + } + } + + /// + /// Dictionary for value to segments + /// + public class SegmentsValueDictionary : DictionaryBase + { + public SegmentsList this[int num] + { + set + { + if (Dictionary.Contains(num) == false) + this.Add(num, value); + else + Dictionary[num] = value; + } + get + { + if (Dictionary.Contains(num) == false) + return null; + + return (SegmentsList)this.Dictionary[num]; + } + } + + public void Add(int num, SegmentsList seg) + { + if (this.Contains(num) == false) + this.Dictionary.Add(num, seg); + else + this[num] = seg; + } + + public bool Contains(int ch) + { + return this.Dictionary.Contains(ch); + } + + public ICollection Values + { + get { return this.Dictionary.Values; } + } + + public ICollection Keys + { + get { return this.Dictionary.Keys; } + } + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.Designer.cs new file mode 100644 index 0000000..69428c4 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.Designer.cs @@ -0,0 +1,56 @@ +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 26/02/2008 + * Ora: 11.44 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +namespace LBSoft.IndustrialCtrls.Leds +{ + public partial class LBLed + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the control. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmrBlink = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // tmrBlink + // + this.tmrBlink.Interval = 500; + this.tmrBlink.Tick += new System.EventHandler(this.OnBlink); + // + // LBLed + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "LBLed"; + this.ResumeLayout(false); + } + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.cs new file mode 100644 index 0000000..8ac2442 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.cs @@ -0,0 +1,216 @@ +/*--------------------------------------------------------------------------- + * File: LBLed.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Leds +{ + /// + /// Class for the Led control. + /// + public partial class LBLed : LBIndustrialCtrlBase + { + #region (* Enumeratives *) + public enum LedState + { + Off = 0, + On, + Blink, + } + + public enum LedLabelPosition + { + Left = 0, + Top, + Right, + Bottom, + } + + public enum LedStyle + { + Circular = 0, + Rectangular, + } + + #endregion + + #region (* Properties variables *) + private Color ledColor; + private LedState state; + private LedStyle style; + private LedLabelPosition labelPosition; + private String label = "Led"; + private SizeF ledSize; + private int blinkInterval = 500; + #endregion + + #region (* Class variables *) + private Timer tmrBlink; + private bool blinkIsOn = false; + #endregion + + #region (* Constructor *) + public LBLed() + { + InitializeComponent(); + + this.Size = new Size(20, 20); + this.ledColor = Color.Red; + this.state = LBLed.LedState.Off; + this.style = LBLed.LedStyle.Circular; + this.blinkIsOn = false; + this.ledSize = new SizeF ( 10F, 10F ); + this.labelPosition = LedLabelPosition.Top; + } + #endregion + + #region (* Properties *) + [ + Category("Led"), + Description("Style of the led") + ] + public LedStyle Style + { + get { return style; } + set + { + style = value; + this.CalculateDimensions(); + } + } + [ + Category("Led"), + Description("Color of the led") + ] + public Color LedColor + { + get { return ledColor; } + set + { + ledColor = value; + Invalidate(); + } + } + + + [ + Category("Led"), + Description("State of the led") + ] + public LedState State + { + get { return state; } + set + { + state = value; + if ( state == LedState.Blink ) + { + this.blinkIsOn = true; + this.tmrBlink.Interval = this.BlinkInterval; + this.tmrBlink.Start(); + } + else + { + this.blinkIsOn = true; + this.tmrBlink.Stop(); + } + + Invalidate(); + } + } + + + [ + Category("Led"), + Description("Size of the led") + ] + public SizeF LedSize + { + get { return this.ledSize; } + set + { + this.ledSize = value; + this.CalculateDimensions(); + Invalidate(); + } + } + + + [ + Category("Led"), + Description("Label of the led") + ] + public String Label + { + get { return this.label; } + set + { + this.label = value; + Invalidate(); + } + } + + + [ + Category("Led"), + Description("Position of the label of the led") + ] + public LedLabelPosition LabelPosition + { + get { return this.labelPosition; } + set + { + this.labelPosition = value; + this.CalculateDimensions(); + Invalidate(); + } + } + + + [ + Category("Led"), + Description("Interval for the blink state of the led") + ] + public int BlinkInterval + { + get { return this.blinkInterval; } + set { this.blinkInterval = value; } + } + + [Browsable(false)] + public bool BlinkIsOn + { + get { return this.blinkIsOn; } + } + #endregion + + #region (* Events delegates *) + void OnBlink(object sender, EventArgs e) + { + if ( this.State == LedState.Blink ) + { + if ( this.blinkIsOn == false ) + this.blinkIsOn = true; + else + this.blinkIsOn = false; + + this.Invalidate(); + } + } + #endregion + + #region (* Overrided methods *) + protected override ILBRenderer CreateDefaultRenderer() + { + return new LBLedRenderer(); + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.resx new file mode 100644 index 0000000..59f96c4 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LedRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LedRenderer.cs new file mode 100644 index 0000000..60705bd --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LedRenderer.cs @@ -0,0 +1,275 @@ +/*--------------------------------------------------------------------------- + * File: LedRenderer.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using LBSoft.IndustrialCtrls.Utils; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Leds +{ + /// + /// Base class for the led renderers + /// + public class LBLedRenderer : LBRendererBase + { + #region (* Variables *) + private RectangleF drawRect; + private RectangleF rectLed; + private RectangleF rectLabel; + #endregion + + #region (* Properies *) + /// + /// Get the associated led object + /// + public LBLed Led + { + get { return this.Control as LBLed; } + } + #endregion + + #region (* Overrided method *) + /// + /// Update the rectangles for drawing + /// + /// + public override bool Update() + { + // Check Led object + if (this.Led == null) + throw new NullReferenceException("Invalid 'Led' object"); + + // Dati del rettangolo + float x, y, w, h; + x = 0; + y = 0; + w = this.Led.Size.Width; + h = this.Led.Size.Height; + + // Rettangolo di disegno + drawRect.X = x; + drawRect.Y = y; + drawRect.Width = w - 2; + drawRect.Height = h - 2; + if (drawRect.Width <= 0) + drawRect.Width = 20; + if (drawRect.Height <= 0) + drawRect.Height = 20; + + this.rectLed = drawRect; + this.rectLabel = drawRect; + + if (this.Led.LabelPosition == LBLed.LedLabelPosition.Bottom) + { + this.rectLed.X = (this.rectLed.Width * 0.5F) - (this.Led.LedSize.Width * 0.5F); + this.rectLed.Width = this.Led.LedSize.Width; + this.rectLed.Height = this.Led.LedSize.Height; + + this.rectLabel.Y = this.rectLed.Bottom; + } + + else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Top) + { + this.rectLed.X = (this.rectLed.Width * 0.5F) - (this.Led.LedSize.Width * 0.5F); + this.rectLed.Y = this.rectLed.Height - this.Led.LedSize.Height; + this.rectLed.Width = this.Led.LedSize.Width; + this.rectLed.Height = this.Led.LedSize.Height; + + this.rectLabel.Height = this.rectLed.Top; + } + + else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Left) + { + this.rectLed.X = this.rectLed.Width - this.Led.LedSize.Width; + this.rectLed.Width = this.Led.LedSize.Width; + this.rectLed.Height = this.Led.LedSize.Height; + + this.rectLabel.Width = this.rectLabel.Width - this.rectLed.Width; + } + + else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Right) + { + this.rectLed.Width = this.Led.LedSize.Width; + this.rectLed.Height = this.Led.LedSize.Height; + + this.rectLabel.X = this.rectLed.Right; + } + + return true; + } + + /// + /// Draw the led object + /// + /// + public override void Draw(Graphics Gr) + { + if (Gr == null) + throw new ArgumentNullException("Gr"); + + LBLed ctrl = this.Led; + if (ctrl == null) + throw new NullReferenceException("Associated control is not valid"); + + Rectangle rc = ctrl.Bounds; + + this.DrawBackground(Gr, rc); + + if (this.rectLed.Width <= 0) + this.rectLed.Width = rectLabel.Width; + if (this.rectLed.Height <= 0) + this.rectLed.Height = ctrl.LedSize.Height; + + this.DrawLed(Gr, this.rectLed); + + this.DrawLabel(Gr, this.rectLabel); + } + #endregion + + #region (* Virtual method *) + /// + /// Draw the background of the control + /// + /// + /// + /// + public virtual bool DrawBackground( Graphics Gr, RectangleF rc ) + { + if ( this.Led == null ) + return false; + + Color c = this.Led.BackColor; + SolidBrush br = new SolidBrush ( c ); + Pen pen = new Pen ( c ); + + Rectangle _rcTmp = new Rectangle(0, 0, this.Led.Width, this.Led.Height ); + Gr.DrawRectangle ( pen, _rcTmp ); + Gr.FillRectangle ( br, rc ); + + br.Dispose(); + pen.Dispose(); + + return true; + } + + /// + /// Draw the body of the control + /// + /// + /// + /// + public virtual bool DrawLed( Graphics Gr, RectangleF rc ) + { + if ( this.Led == null ) + return false; + + Color cDarkOff = LBColorManager.StepColor ( Color.LightGray, 20 ); + Color cDarkOn = LBColorManager.StepColor ( this.Led.LedColor, 60 ); + + LinearGradientBrush brOff = new LinearGradientBrush ( rc, + Color.Gray, + cDarkOff, + 45 ); + + LinearGradientBrush brOn = new LinearGradientBrush ( rc, + this.Led.LedColor, + cDarkOn, + 45 ); + if ( this.Led.State == LBLed.LedState.Blink ) + { + if (this.Led.BlinkIsOn == false) + { + if (this.Led.Style == LBLed.LedStyle.Circular) + Gr.FillEllipse(brOff, rc); + else if (this.Led.Style == LBLed.LedStyle.Rectangular) + Gr.FillRectangle(brOff, rc); + } + else + { + if (this.Led.Style == LBLed.LedStyle.Circular) + Gr.FillEllipse(brOn, rc); + else if (this.Led.Style == LBLed.LedStyle.Rectangular) + Gr.FillRectangle(brOn, rc); + } + } + else + { + if (this.Led.State == LBLed.LedState.Off) + { + if (this.Led.Style == LBLed.LedStyle.Circular) + Gr.FillEllipse(brOff, rc); + else if (this.Led.Style == LBLed.LedStyle.Rectangular) + Gr.FillRectangle(brOff, rc); + } + else + { + if (this.Led.Style == LBLed.LedStyle.Circular) + Gr.FillEllipse(brOn, rc); + else if (this.Led.Style == LBLed.LedStyle.Rectangular) + Gr.FillRectangle(brOn, rc); + } + } + + brOff.Dispose(); + brOn.Dispose(); + + return true; + } + + /// + /// Draw the text of the control + /// + /// + /// + /// + public virtual bool DrawLabel( Graphics Gr, RectangleF rc ) + { + if ( this.Led == null ) + return false; + + if ( this.Led.Label == String.Empty ) + return false; + + SizeF size = Gr.MeasureString ( this.Led.Label, this.Led.Font ); + + SolidBrush br1 = new SolidBrush ( this.Led.ForeColor ); + + float hPos = 0; + float vPos = 0; + switch ( this.Led.LabelPosition ) + { + case LBLed.LedLabelPosition.Top: + hPos = (float)(rc.Width*0.5F)-(float)(size.Width*0.5F); + vPos = rc.Bottom - size.Height; + break; + + case LBLed.LedLabelPosition.Bottom: + hPos = (float)(rc.Width*0.5F)-(float)(size.Width*0.5F); + break; + + case LBLed.LedLabelPosition.Left: + hPos = rc.Width - size.Width; + vPos = (float)(rc.Height*0.5F)-(float)(size.Height*0.5F); + break; + + case LBLed.LedLabelPosition.Right: + vPos = (float)(rc.Height*0.5F)-(float)(size.Height*0.5F); + break; + } + + Gr.DrawString ( this.Led.Label, + this.Led.Font, + br1, + rc.Left + hPos, + rc.Top + vPos ); + + return true; + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.Designer.cs new file mode 100644 index 0000000..b6f7632 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.Designer.cs @@ -0,0 +1,46 @@ +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 03/04/2008 + * Ora: 14.34 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +namespace LBSoft.IndustrialCtrls.Meters +{ + public partial class LBAnalogMeter + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + // + // UserControl1 + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "LBAnalogMeter"; + } + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.cs new file mode 100644 index 0000000..a044b65 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.cs @@ -0,0 +1,256 @@ +/*--------------------------------------------------------------------------- + * File: LBAnalogMeter.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Meters +{ + /// + /// Class for the analog meter control + /// + public partial class LBAnalogMeter : LBIndustrialCtrlBase + { + #region (* Enumerator *) + public enum AnalogMeterStyle + { + Circular = 0, + }; + #endregion + + #region (* Properties variables *) + private AnalogMeterStyle meterStyle; + private Color bodyColor; + private Color needleColor; + private Color scaleColor; + private bool viewGlass; + private double currValue; + private double minValue; + private double maxValue; + private int scaleDivisions; + private int scaleSubDivisions; + private LBMeterThresholdCollection listThreshold; + #endregion + + #region (* Class variables *) + protected float startAngle; + protected float endAngle; + #endregion + + #region (* Costructors *) + public LBAnalogMeter() + { + // Initialization + InitializeComponent(); + + // Properties initialization + this.bodyColor = Color.Red; + this.needleColor = Color.Yellow; + this.scaleColor = Color.White; + this.meterStyle = AnalogMeterStyle.Circular; + this.viewGlass = false; + this.startAngle = 135; + this.endAngle = 405; + this.minValue = 0; + this.maxValue = 1; + this.currValue = 0; + this.scaleDivisions = 10; + this.scaleSubDivisions = 10; + + // Create the sector list + this.listThreshold = new LBMeterThresholdCollection(); + + this.CalculateDimensions(); + } + #endregion + + #region (* Properties *) + [ + Category("Analog Meter"), + Description("Style of the control") + ] + public AnalogMeterStyle MeterStyle + { + get { return meterStyle;} + set + { + meterStyle = value; + Invalidate(); + } + } + + + [ + Category("Analog Meter"), + Description("Color of the body of the control") + ] + public Color BodyColor + { + get { return bodyColor; } + set + { + bodyColor = value; + Invalidate(); + } + } + + + [ + Category("Analog Meter"), + Description("Color of the needle") + ] + public Color NeedleColor + { + get { return needleColor; } + set + { + needleColor = value; + Invalidate(); + } + } + + + [ + Category("Analog Meter"), + Description("Show or hide the glass effect") + ] + public bool ViewGlass + { + get { return viewGlass; } + set + { + viewGlass = value; + Invalidate(); + } + } + + + [ + Category("Analog Meter"), + Description("Color of the scale of the control") + ] + public Color ScaleColor + { + get { return scaleColor; } + set + { + scaleColor = value; + Invalidate(); + } + } + + + [ + Category("Analog Meter"), + Description("Value of the data") + ] + public double Value + { + get { return currValue; } + set + { + double val = value; + if ( val > maxValue ) + val = maxValue; + + if ( val < minValue ) + val = minValue; + + currValue = val; + Invalidate(); + } + } + + + [ + Category("Analog Meter"), + Description("Minimum value of the data") + ] + public double MinValue + { + get { return minValue; } + set + { + minValue = value; + Invalidate(); + } + } + + + [ + Category("Analog Meter"), + Description("Maximum value of the data") + ] + public double MaxValue + { + get { return maxValue; } + set + { + maxValue = value; + Invalidate(); + } + } + + + [ + Category("Analog Meter"), + Description("Number of the scale divisions") + ] + public int ScaleDivisions + { + get { return scaleDivisions; } + set + { + scaleDivisions = value; + this.CalculateDimensions(); + } + } + + + [ + Category("Analog Meter"), + Description("Number of the scale subdivisions") + ] + public int ScaleSubDivisions + { + get { return scaleSubDivisions; } + set + { + scaleSubDivisions = value; + this.CalculateDimensions(); + } + } + + [Browsable(false)] + public LBMeterThresholdCollection Thresholds + { + get { return this.listThreshold; } + } + #endregion + + #region (* Public methods *) + public float GetStartAngle() + { + return this.startAngle; + } + + public float GetEndAngle() + { + return this.endAngle; + } + #endregion + + #region (* Overrided methods *) + protected override ILBRenderer CreateDefaultRenderer() + { + return new LBAnalogMeterRenderer(); + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.Designer.cs new file mode 100644 index 0000000..ec464cc --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.Designer.cs @@ -0,0 +1,45 @@ +namespace LBSoft.IndustrialCtrls.Meters +{ + partial class LBDigitalMeter + { + /// + /// Variabile di progettazione necessaria. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Liberare le risorse in uso. + /// + /// ha valore true se le risorse gestite devono essere eliminate, false in caso contrario. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Codice generato da Progettazione componenti + + /// + /// Metodo necessario per il supporto della finestra di progettazione. Non modificare + /// il contenuto del metodo con l'editor di codice. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // LBDigitalMeter + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Name = "LBDigitalMeter"; + this.Size = new System.Drawing.Size(385, 150); + this.ResumeLayout(false); + + } + + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.cs new file mode 100644 index 0000000..a3b8b6d --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.cs @@ -0,0 +1,323 @@ +/*--------------------------------------------------------------------------- + * File: LBDigitalMeter.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using LBSoft.IndustrialCtrls.Leds; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Meters +{ + /// + /// Class for the digital meter + /// + public partial class LBDigitalMeter : LBIndustrialCtrlBase + { + #region (* Class variables *) + protected int _dpPos = 0; + protected int _numDigits = 0; + #endregion + + #region (* Constructor *) + public LBDigitalMeter() + { + InitializeComponent(); + + // Transparent background + this.BackColor = Color.Black; + + this.Format = "000"; + } + #endregion + + #region (* Properties *) + /// + /// Background color + /// + public override Color BackColor + { + get + { + return base.BackColor; + } + set + { + base.BackColor = value; + + foreach (Control disp in this.Controls) + { + if (disp.GetType() == typeof(LB7SegmentDisplay)) + { + LB7SegmentDisplay d = disp as LB7SegmentDisplay; + + d.BackColor = value; + } + } + } + } + + /// + /// Color of the display + /// + public override Color ForeColor + { + get + { + return base.ForeColor; + } + set + { + base.ForeColor = value; + + foreach (Control disp in this.Controls) + { + if (disp.GetType() == typeof(LB7SegmentDisplay)) + { + LB7SegmentDisplay d = disp as LB7SegmentDisplay; + + d.ForeColor = value; + } + } + } + } + + /// + /// Set the sign of the display + /// + private bool _signed = false; + [ + Category("Digital meter"), + Description("Set the signed value of the meter") + ] + public bool Signed + { + set + { + if (this._signed == value) + return; + + this._signed = value; + + this.UpdateControls(); + } + + get { return this._signed; } + } + + /// + /// Set the format of the display, without the sign + /// + private string _format = string.Empty; + [ + Category("Digital meter"), + Description("Format of the display value") + ] + public string Format + { + set + { + if (this._format == value) + return; + + this._format = value; + + this.UpdateControls(); + + this.Value = this.Value; + } + + get { return this._format; } + } + + /// + /// Set the value of the display + /// + private double val = 0.0; + [ + Category("Digital meter"), + Description("Value to display") + ] + public double Value + { + set + { + this.val = value; + + string str = this.val.ToString(this.Format); + str = str.Replace ( ".", string.Empty ); + str = str.Replace ( ",", string.Empty ); + + bool sign = false; + if (str[0] == '-') + { + sign = true; + str = str.TrimStart(new char[] { '-' }); + } + + if ( str.Length > this._numDigits ) + { + foreach (LB7SegmentDisplay d in this.Controls) + d.Value = (int)'E'; + + return; + } + + int idx = 0; + for (idx = str.Length - 1; idx >= 0; idx--) + { + int id = idx; + if (this.Signed != false) + id++; + LB7SegmentDisplay d = this.Controls[id] as LB7SegmentDisplay; + d.Value = Convert.ToInt32(str[idx].ToString()); + } + + LB7SegmentDisplay s = this.Controls["digit_sign"] as LB7SegmentDisplay; + if (s != null) + { + if (sign != false) + s.Value = (int)'-'; + else + s.Value = -1; + } + } + + get { return this.val; } + } + #endregion + + #region (* Overrided methods *) + /// + /// Create the default renderer + /// + /// + protected override ILBRenderer CreateDefaultRenderer() + { + return new LBDigitalMeterRenderer(); + } + /// + /// Resize of the control + /// + /// + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + this.RepositionControls(); + } + #endregion + + #region (* Protected methods *) + /// + /// Update the controls of the meter + /// + protected virtual void UpdateControls() + { + int count = this.Format.Length; + + this._dpPos = -1; + + char[] seps = new char[] { '.', ',' }; + int sepIndex = this.Format.IndexOfAny(seps); + if (sepIndex > 0) + { + count--; + this._dpPos = sepIndex - 1; + this._numDigits = count; + } + + this._numDigits = count; + + this.Controls.Clear(); + + if (this.Signed != false) + { + LB7SegmentDisplay disp = new LB7SegmentDisplay(); + disp.Name = "digit_sign"; + disp.Value = -1; + this.Controls.Add(disp); + } + + for (int idx = 0; idx < count; idx++) + { + LB7SegmentDisplay disp = new LB7SegmentDisplay(); + + disp.Name = "digit_" + idx.ToString(); + + disp.Click += this.DisplayClicked; + + if (sepIndex - 1 == idx) + disp.ShowDP = true; + + this.Controls.Add(disp); + } + + this.RepositionControls(); + } + + /// + /// Reposition of the digital displaies + /// + protected void RepositionControls() + { + Rectangle rc = this.ClientRectangle; + + if (this.Controls.Count <= 0) + return; + + int digitW = rc.Width / this.Controls.Count; + bool signFind = false; + foreach (Control disp in this.Controls) + { + if (disp.GetType() == typeof(LB7SegmentDisplay)) + { + LB7SegmentDisplay d = disp as LB7SegmentDisplay; + + int idDigit = 0; + if (d.Name.Contains("digit_sign") != false) + { + signFind = true; + } + else + { + if (d.Name.Contains("digit_") != false) + { + string s = d.Name.Remove(0, 6); + idDigit = Convert.ToInt32(s); + + if (signFind != false) + idDigit++; + } + } + + Point pos = new Point(); + pos.X = idDigit * digitW; + pos.Y = 0; + d.Location = pos; + + Size dim = new Size(); + dim.Width = digitW; + dim.Height = rc.Height; + d.Size = dim; + } + } + } + + /// + /// Event generate from the displaies in the control + /// + /// + /// + private void DisplayClicked(object sender, System.EventArgs e) + { + this.InvokeOnClick(this, e); + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeterRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeterRenderer.cs new file mode 100644 index 0000000..130ced4 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeterRenderer.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Text; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Meters +{ + public class LBDigitalMeterRenderer : LBRendererBase + { + #region (* Constructor *) + public LBDigitalMeterRenderer() + { + } + #endregion + + #region (* Overrided methods *) + public override void Draw(Graphics Gr) + { + if (this.Meter == null) + return; + + RectangleF _rc = new RectangleF(0, 0, this.Meter.Width, this.Meter.Height); + Gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + + this.DrawBackground(Gr, _rc); + this.DrawBorder(Gr, _rc); + } + #endregion + + #region (* Properties *) + public LBDigitalMeter Meter + { + get { return this.Control as LBDigitalMeter; } + } + #endregion + + #region (* Virtual methods *) + public virtual bool DrawBackground(Graphics gr, RectangleF rc) + { + if (this.Meter == null) + return false; + + Color c = this.Meter.BackColor; + SolidBrush br = new SolidBrush(c); + Pen pen = new Pen(c); + + Rectangle _rcTmp = new Rectangle(0, 0, this.Meter.Width, this.Meter.Height); + gr.DrawRectangle(pen, _rcTmp); + gr.FillRectangle(br, rc); + + br.Dispose(); + pen.Dispose(); + + return true; + } + + public virtual bool DrawBorder(Graphics gr, RectangleF rc) + { + if (this.Meter == null) + return false; + + return true; + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBMeterThreshold.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBMeterThreshold.cs new file mode 100644 index 0000000..04a603d --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBMeterThreshold.cs @@ -0,0 +1,165 @@ +/*--------------------------------------------------------------------------- + * File: LBMeterThreshold.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.Collections; +using System.Drawing; + +namespace LBSoft.IndustrialCtrls.Meters +{ + /// + /// Class for the meter threshold + /// + public class LBMeterThreshold + { + #region (* Properties variables *) + private Color color = Color.Empty; + private double startValue = 0.0; + private double endValue = 1.0; + #endregion + + #region (* Constructor *) + public LBMeterThreshold() + { + } + #endregion + + #region (* Properties *) + public Color Color + { + set { this.color = value; } + get { return this.color; } + } + + public double StartValue + { + set { this.startValue = value; } + get { return this.startValue; } + } + + public double EndValue + { + set { this.endValue = value; } + get { return this.endValue; } + } + #endregion + + #region (* Public methods *) + public bool IsInRange ( double val ) + { + if ( val > this.EndValue ) + return false; + + if ( val < this.StartValue ) + return false; + + return true; + } + #endregion + } + + /// + /// Collection of the meter thresolds + /// + public class LBMeterThresholdCollection : CollectionBase + { + #region (* Properties variables *) + private bool _IsReadOnly = false; + #endregion + + #region (* Constructor *) + public LBMeterThresholdCollection() + { + } + #endregion + + #region (* Properties *) + public virtual LBMeterThreshold this[int index] + { + get { return (LBMeterThreshold)InnerList[index]; } + set { InnerList[index] = value; } + } + + public virtual bool IsReadOnly + { + get { return _IsReadOnly; } + } + #endregion + + #region (* Public methods *) + /// + /// Add an object to the collection + /// + /// + public virtual void Add(LBMeterThreshold sector) + { + InnerList.Add(sector); + } + + /// + /// Remove an object from the collection + /// + /// + /// + public virtual bool Remove(LBMeterThreshold sector) + { + bool result = false; + + //loop through the inner array's indices + for (int i = 0; i < InnerList.Count; i++) + { + //store current index being checked + LBMeterThreshold obj = (LBMeterThreshold)InnerList[i]; + + //compare the values of the objects + if ( ( obj.StartValue == sector.StartValue ) && + ( obj.EndValue == sector.EndValue ) ) + { + //remove item from inner ArrayList at index i + InnerList.RemoveAt(i); + result = true; + break; + } + } + + return result; + } + + /// + /// Check if the object is containing in the collection + /// + /// + /// + public bool Contains(LBMeterThreshold sector) + { + //loop through the inner ArrayList + foreach (LBMeterThreshold obj in InnerList) + { + //compare the values of the objects + if ( ( obj.StartValue == sector.StartValue ) && + ( obj.EndValue == sector.EndValue ) ) + { + //if it matches return true + return true; + } + } + + //no match + return false; + } + + /// + /// Copy the collection + /// + /// + /// + public virtual void CopyTo(LBMeterThreshold[] MeterThresholdArray, int index) + { + throw new Exception("This Method is not valid for this implementation."); + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/MeterRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/MeterRenderer.cs new file mode 100644 index 0000000..9885408 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/MeterRenderer.cs @@ -0,0 +1,397 @@ +/*--------------------------------------------------------------------------- + * File: MeterRenderer.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using LBSoft.IndustrialCtrls.Utils; +using LBSoft.IndustrialCtrls.Base; + +namespace LBSoft.IndustrialCtrls.Meters +{ + /// + /// Base class for the renderers of the analog meter + /// + public class LBAnalogMeterRenderer : LBRendererBase + { + #region (* Variables *) + protected PointF needleCenter; + protected RectangleF drawRect; + protected RectangleF glossyRect; + protected RectangleF needleCoverRect; + protected float drawRatio; + #endregion + + #region (* Properties *) + public LBAnalogMeter AnalogMeter + { + get { return this.Control as LBAnalogMeter; } + } + #endregion + + #region (* Overrided method *) + public override bool Update() + { + // Check Button object + if (this.AnalogMeter == null) + throw new NullReferenceException("Invalid 'AnalogMeter' object"); + + // Rectangle + float x, y, w, h; + x = 0; + y = 0; + w = this.AnalogMeter.Size.Width; + h = this.AnalogMeter.Size.Height; + + // Calculate ratio + drawRatio = (Math.Min(w, h)) / 200; + if (drawRatio == 0.0) + drawRatio = 1; + + // Draw rectangle + drawRect.X = x; + drawRect.Y = y; + drawRect.Width = w - 2; + drawRect.Height = h - 2; + + if (w < h) + drawRect.Height = w; + else if (w > h) + drawRect.Width = h; + + if (drawRect.Width < 10) + drawRect.Width = 10; + if (drawRect.Height < 10) + drawRect.Height = 10; + + // Calculate needle center + needleCenter.X = drawRect.X + (drawRect.Width / 2); + needleCenter.Y = drawRect.Y + (drawRect.Height / 2); + + // Needle cover rect + needleCoverRect.X = needleCenter.X - (20 * drawRatio); + needleCoverRect.Y = needleCenter.Y - (20 * drawRatio); + needleCoverRect.Width = 40 * drawRatio; + needleCoverRect.Height = 40 * drawRatio; + + // Glass effect rect + glossyRect.X = drawRect.X + (20 * drawRatio); + glossyRect.Y = drawRect.Y + (10 * drawRatio); + glossyRect.Width = drawRect.Width - (40 * drawRatio); + glossyRect.Height = needleCenter.Y + (30 * drawRatio); + + return false; + } + + public override void Draw(Graphics Gr) + { + if (Gr == null) + throw new ArgumentNullException("Gr"); + + LBAnalogMeter ctrl = this.AnalogMeter; + if (ctrl == null) + throw new NullReferenceException("Associated control is not valid"); + + this.DrawBackground(Gr, ctrl.Bounds); + this.DrawBody(Gr, drawRect); + this.DrawThresholds(Gr, drawRect); + this.DrawDivisions(Gr, drawRect); + this.DrawUM(Gr, drawRect); + this.DrawValue(Gr, drawRect); + this.DrawNeedle(Gr, drawRect); + this.DrawNeedleCover(Gr, this.needleCoverRect); + this.DrawGlass(Gr, this.glossyRect); + } + #endregion + + #region (* Virtual method *) + public virtual bool DrawBackground( Graphics gr, RectangleF rc ) + { + if ( this.AnalogMeter == null ) + return false; + + Color c = this.AnalogMeter.BackColor; + SolidBrush br = new SolidBrush ( c ); + Pen pen = new Pen ( c ); + + Rectangle _rcTmp = new Rectangle(0, 0, this.AnalogMeter.Width, this.AnalogMeter.Height ); + gr.DrawRectangle ( pen, _rcTmp ); + gr.FillRectangle ( br, rc ); + + br.Dispose(); + pen.Dispose(); + + return true; + } + + public virtual bool DrawBody( Graphics Gr, RectangleF rc ) + { + if ( this.AnalogMeter == null ) + return false; + + Color bodyColor = this.AnalogMeter.BodyColor; + Color cDark = LBColorManager.StepColor ( bodyColor, 20 ); + + LinearGradientBrush br1 = new LinearGradientBrush ( rc, + bodyColor, + cDark, + 45 ); + Gr.FillEllipse ( br1, rc ); + + RectangleF _rc = rc; + _rc.X += 3 * drawRatio; + _rc.Y += 3 * drawRatio; + _rc.Width -= 6 * drawRatio; + _rc.Height -= 6 * drawRatio; + + LinearGradientBrush br2 = new LinearGradientBrush ( _rc, + cDark, + bodyColor, + 45 ); + Gr.FillEllipse ( br2, _rc ); + + return true; + } + + public virtual bool DrawThresholds( Graphics Gr, RectangleF rc ) + { + if ( this.AnalogMeter == null ) + return false; + + RectangleF _rc = rc; + _rc.Inflate ( -18F * drawRatio, -18F * drawRatio ); + + double w = _rc.Width; + double radius = w / 2 - ( w * 0.075); + + float startAngle = this.AnalogMeter.GetStartAngle(); + float endAngle = this.AnalogMeter.GetEndAngle(); + float rangeAngle = endAngle - startAngle; + float minValue = (float)this.AnalogMeter.MinValue; + float maxValue = (float)this.AnalogMeter.MaxValue; + + double stepVal = rangeAngle / ( maxValue - minValue ); + + foreach ( LBMeterThreshold sect in this.AnalogMeter.Thresholds ) + { + + float startPathAngle = ( (float)(startAngle + ( stepVal * sect.StartValue ))); + float endPathAngle = ( (float)( ( stepVal * ( sect.EndValue - sect.StartValue )))); + + GraphicsPath pth = new GraphicsPath(); + pth.AddArc ( _rc, startPathAngle, endPathAngle ); + + Pen pen = new Pen( sect.Color, 4.5F * drawRatio ); + + Gr.DrawPath ( pen, pth ); + + pen.Dispose(); + pth.Dispose(); + } + + return false; + } + + public virtual bool DrawDivisions( Graphics Gr, RectangleF rc ) + { + if ( this.AnalogMeter == null ) + return false; + + float startAngle = this.AnalogMeter.GetStartAngle(); + float endAngle = this.AnalogMeter.GetEndAngle(); + float scaleDivisions = this.AnalogMeter.ScaleDivisions; + float scaleSubDivisions = this.AnalogMeter.ScaleSubDivisions; + double minValue = this.AnalogMeter.MinValue; + double maxValue = this.AnalogMeter.MaxValue; + Color scaleColor = this.AnalogMeter.ScaleColor; + + float cx = needleCenter.X; + float cy = needleCenter.Y; + float w = rc.Width; + float h = rc.Height; + + float incr = LBMath.GetRadian(( endAngle - startAngle ) / (( scaleDivisions - 1 )* (scaleSubDivisions + 1))); + float currentAngle = LBMath.GetRadian( startAngle ); + float radius = (float)(w / 2 - ( w * 0.08)); + float rulerValue = (float)minValue; + + Pen pen = new Pen ( scaleColor, ( 1 * drawRatio ) ); + SolidBrush br = new SolidBrush ( scaleColor ); + + PointF ptStart = new PointF(0,0); + PointF ptEnd = new PointF(0,0); + int n = 0; + for( ; n < scaleDivisions; n++ ) + { + //Draw Thick Line + ptStart.X = (float)(cx + radius * Math.Cos(currentAngle)); + ptStart.Y = (float)(cy + radius * Math.Sin(currentAngle)); + ptEnd.X = (float)(cx + (radius - w/20) * Math.Cos(currentAngle)); + ptEnd.Y = (float)(cy + (radius - w/20) * Math.Sin(currentAngle)); + Gr.DrawLine( pen, ptStart, ptEnd ); + + //Draw Strings + Font font = new Font ( this.AnalogMeter.Font.FontFamily, (float)( 6F * drawRatio ) ); + + float tx = (float)(cx + (radius - ( 20 * drawRatio )) * Math.Cos(currentAngle)); + float ty = (float)(cy + (radius - ( 20 * drawRatio )) * Math.Sin(currentAngle)); + double val = Math.Round ( rulerValue ); + String str = String.Format( "{0,0:D}", (int)val ); + + SizeF size = Gr.MeasureString ( str, font ); + Gr.DrawString ( str, + font, + br, + tx - (float)( size.Width * 0.5 ), + ty - (float)( size.Height * 0.5 ) ); + + rulerValue += (float)(( maxValue - minValue) / (scaleDivisions - 1)); + + if ( n == scaleDivisions -1) + { + font.Dispose(); + break; + } + + if ( scaleDivisions <= 0 ) + currentAngle += incr; + else + { + for (int j = 0; j <= scaleSubDivisions; j++) + { + currentAngle += incr; + ptStart.X = (float)(cx + radius * Math.Cos(currentAngle)); + ptStart.Y = (float)(cy + radius * Math.Sin(currentAngle)); + ptEnd.X = (float)(cx + (radius - w/50) * Math.Cos(currentAngle)); + ptEnd.Y = (float)(cy + (radius - w/50) * Math.Sin(currentAngle)); + Gr.DrawLine( pen, ptStart, ptEnd ); + } + } + + font.Dispose(); + } + + return true; + } + + public virtual bool DrawUM( Graphics gr, RectangleF rc ) + { + return false; + } + + public virtual bool DrawValue( Graphics gr, RectangleF rc ) + { + return false; + } + + public virtual bool DrawNeedle( Graphics Gr, RectangleF rc ) + { + if ( this.AnalogMeter == null ) + return false; + + float w, h ; + w = rc.Width; + h = rc.Height; + + double minValue = this.AnalogMeter.MinValue; + double maxValue = this.AnalogMeter.MaxValue; + double currValue = this.AnalogMeter.Value; + float startAngle = this.AnalogMeter.GetStartAngle(); + float endAngle = this.AnalogMeter.GetEndAngle(); + + float radius = (float)(w / 2 - ( w * 0.12)); + float val = (float)(maxValue - minValue); + + val = (float)((100 * ( currValue - minValue )) / val); + val = (( endAngle - startAngle ) * val) / 100; + val += startAngle; + + float angle = LBMath.GetRadian ( val ); + + float cx = needleCenter.X; + float cy = needleCenter.Y; + + PointF ptStart = new PointF(0,0); + PointF ptEnd = new PointF(0,0); + + GraphicsPath pth1 = new GraphicsPath(); + + ptStart.X = cx; + ptStart.Y = cy; + angle = LBMath.GetRadian(val + 10); + ptEnd.X = (float)(cx + (w * .09F) * Math.Cos(angle)); + ptEnd.Y = (float)(cy + (w * .09F) * Math.Sin(angle)); + pth1.AddLine ( ptStart, ptEnd ); + + ptStart = ptEnd; + angle = LBMath.GetRadian(val); + ptEnd.X = (float)(cx + radius * Math.Cos(angle)); + ptEnd.Y = (float)(cy + radius * Math.Sin(angle)); + pth1.AddLine ( ptStart, ptEnd ); + + ptStart = ptEnd; + angle = LBMath.GetRadian(val - 10); + ptEnd.X = (float)(cx + (w * .09F) * Math.Cos(angle)); + ptEnd.Y = (float)(cy + (w * .09F) * Math.Sin(angle)); + pth1.AddLine ( ptStart, ptEnd ); + + pth1.CloseFigure(); + + SolidBrush br = new SolidBrush( this.AnalogMeter.NeedleColor ); + Pen pen = new Pen ( this.AnalogMeter.NeedleColor ); + Gr.DrawPath ( pen, pth1 ); + Gr.FillPath ( br, pth1 ); + + return true; + } + + public virtual bool DrawNeedleCover( Graphics Gr, RectangleF rc ) + { + if ( this.AnalogMeter == null ) + return false; + + Color clr = this.AnalogMeter.NeedleColor; + RectangleF _rc = rc; + + Color clr1 = Color.FromArgb( 70, clr ); + + _rc.Inflate ( 5 * drawRatio, 5 * drawRatio ); + + SolidBrush brTransp = new SolidBrush ( clr1 ); + Gr.FillEllipse ( brTransp, _rc ); + + clr1 = clr; + Color clr2 = LBColorManager.StepColor ( clr, 75 ); + LinearGradientBrush br1 = new LinearGradientBrush( rc, + clr1, + clr2, + 45 ); + Gr.FillEllipse ( br1, rc ); + return true; + } + + public virtual bool DrawGlass( Graphics Gr, RectangleF rc ) + { + if ( this.AnalogMeter == null ) + return false; + + if ( this.AnalogMeter.ViewGlass == false ) + return true; + + Color clr1 = Color.FromArgb( 40, 200, 200, 200 ); + + Color clr2 = Color.FromArgb( 0, 200, 200, 200 ); + LinearGradientBrush br1 = new LinearGradientBrush( rc, + clr1, + clr2, + 45 ); + Gr.FillEllipse ( br1, rc ); + + return true; + } + #endregion + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/ColorMng.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/ColorMng.cs new file mode 100644 index 0000000..d740e57 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/ColorMng.cs @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------- + * File: LBLed.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; +using System.Drawing; + +namespace LBSoft.IndustrialCtrls.Utils +{ + /// + /// Manager for color + /// + public class LBColorManager : Object + { + public static double BlendColour ( double fg, double bg, double alpha ) + { + double result = bg + (alpha * (fg - bg)); + if (result < 0.0) + result = 0.0; + if (result > 255) + result = 255; + return result; + } + + public static Color StepColor ( Color clr, int alpha ) + { + if ( alpha == 100 ) + return clr; + + byte a = clr.A; + byte r = clr.R; + byte g = clr.G; + byte b = clr.B; + float bg = 0; + + int _alpha = Math.Min(alpha, 200); + _alpha = Math.Max(alpha, 0); + double ialpha = ((double)(_alpha - 100.0))/100.0; + + if (ialpha > 100) + { + // blend with white + bg = 255.0F; + ialpha = 1.0F - ialpha; // 0 = transparent fg; 1 = opaque fg + } + else + { + // blend with black + bg = 0.0F; + ialpha = 1.0F + ialpha; // 0 = transparent fg; 1 = opaque fg + } + + r = (byte)(LBColorManager.BlendColour(r, bg, ialpha)); + g = (byte)(LBColorManager.BlendColour(g, bg, ialpha)); + b = (byte)(LBColorManager.BlendColour(b, bg, ialpha)); + + return Color.FromArgb ( a, r, g, b ); + } + }; +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/MathFunc.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/MathFunc.cs new file mode 100644 index 0000000..1d35e26 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/MathFunc.cs @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------- + * File: LBLed.cs + * Utente: lucabonotto + * Date: 05/04/2009 + *-------------------------------------------------------------------------*/ + +using System; + +namespace LBSoft.IndustrialCtrls.Utils +{ + /// + /// Mathematic Functions + /// + public class LBMath : Object + { + public static float GetRadian ( float val ) + { + return (float)(val * Math.PI / 180); + } + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp.sln b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp.sln new file mode 100644 index 0000000..7f57071 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33801.468 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{AA498353-353F-46AE-B5D5-96A88CBEA6ED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LBIndustrialCtrls", "LBIndustrialCtrls\LBIndustrialCtrls.csproj", "{B4218BC9-9736-42B9-BC99-7903FDBEBA28}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AA498353-353F-46AE-B5D5-96A88CBEA6ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA498353-353F-46AE-B5D5-96A88CBEA6ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA498353-353F-46AE-B5D5-96A88CBEA6ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA498353-353F-46AE-B5D5-96A88CBEA6ED}.Release|Any CPU.Build.0 = Release|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C763B692-31EC-48FC-AACE-97C32273C42F} + EndGlobalSection +EndGlobal diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/AssemblyInfo.cs b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/AssemblyInfo.cs new file mode 100644 index 0000000..963bf0c --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/AssemblyInfo.cs @@ -0,0 +1,31 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TestApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TestApp")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all the values or you can use the default the Revision and +// Build Numbers by using the '*' as shown below: +[assembly: AssemblyVersion("1.1.0.0")] diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.Designer.cs new file mode 100644 index 0000000..31f9ba9 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.Designer.cs @@ -0,0 +1,541 @@ +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 03/04/2008 + * Ora: 14.34 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +using System.Windows.Forms; + +namespace TestApp +{ + partial class MainForm + { + /// + /// Designer variable used to keep track of non-visual components. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Disposes resources used by the form. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing) { + if (components != null) { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + /// + /// This method is required for Windows Forms designer support. + /// Do not change the method contents inside the source code editor. The Forms designer might + /// not be able to load this method if it was changed manually. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.sdRepeat = new LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay(); + this.label4 = new System.Windows.Forms.Label(); + this.lB7SegmentDisplay1 = new LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay(); + this.lB7SegmentDisplay2 = new LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay(); + this.lbLed4 = new LBSoft.IndustrialCtrls.Leds.LBLed(); + this.lbLed3 = new LBSoft.IndustrialCtrls.Leds.LBLed(); + this.lbLed2 = new LBSoft.IndustrialCtrls.Leds.LBLed(); + this.lbLed1 = new LBSoft.IndustrialCtrls.Leds.LBLed(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.btnRepeat = new LBSoft.IndustrialCtrls.Buttons.LBButton(); + this.lbButton3 = new LBSoft.IndustrialCtrls.Buttons.LBButton(); + this.lbButton2 = new LBSoft.IndustrialCtrls.Buttons.LBButton(); + this.lbButton1 = new LBSoft.IndustrialCtrls.Buttons.LBButton(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.propertyGrid1 = new System.Windows.Forms.PropertyGrid(); + this.labelCurrCtrl = new System.Windows.Forms.Label(); + this.lbDigitalMeter1 = new LBSoft.IndustrialCtrls.Meters.LBDigitalMeter(); + this.lbAnalogMeter2 = new LBSoft.IndustrialCtrls.Meters.LBAnalogMeter(); + this.lbKnob1 = new LBSoft.IndustrialCtrls.Knobs.LBKnob(); + this.lbAnalogMeter1 = new LBSoft.IndustrialCtrls.Meters.LBAnalogMeter(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.groupBox1.BackColor = System.Drawing.Color.Transparent; + this.groupBox1.Controls.Add(this.sdRepeat); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.lB7SegmentDisplay1); + this.groupBox1.Controls.Add(this.lB7SegmentDisplay2); + this.groupBox1.Controls.Add(this.lbLed4); + this.groupBox1.Controls.Add(this.lbLed3); + this.groupBox1.Controls.Add(this.lbLed2); + this.groupBox1.Controls.Add(this.lbLed1); + this.groupBox1.Location = new System.Drawing.Point(143, 258); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(272, 337); + this.groupBox1.TabIndex = 6; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Leds"; + // + // sdRepeat + // + this.sdRepeat.BackColor = System.Drawing.Color.Black; + this.sdRepeat.ForeColor = System.Drawing.Color.Red; + this.sdRepeat.Location = new System.Drawing.Point(32, 256); + this.sdRepeat.Name = "sdRepeat"; + this.sdRepeat.Renderer = null; + this.sdRepeat.ShowDP = false; + this.sdRepeat.Size = new System.Drawing.Size(32, 50); + this.sdRepeat.TabIndex = 18; + this.sdRepeat.Value = 2; + // + // label4 + // + this.label4.Location = new System.Drawing.Point(145, 27); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(121, 14); + this.label4.TabIndex = 17; + this.label4.Text = "7 Segments display"; + // + // lB7SegmentDisplay1 + // + this.lB7SegmentDisplay1.BackColor = System.Drawing.Color.Black; + this.lB7SegmentDisplay1.ForeColor = System.Drawing.Color.Red; + this.lB7SegmentDisplay1.Location = new System.Drawing.Point(148, 44); + this.lB7SegmentDisplay1.Name = "lB7SegmentDisplay1"; + this.lB7SegmentDisplay1.Renderer = null; + this.lB7SegmentDisplay1.ShowDP = false; + this.lB7SegmentDisplay1.Size = new System.Drawing.Size(32, 50); + this.lB7SegmentDisplay1.TabIndex = 15; + this.lB7SegmentDisplay1.Value = 2; + this.lB7SegmentDisplay1.Click += new System.EventHandler(this.OnObjectClicked); + // + // lB7SegmentDisplay2 + // + this.lB7SegmentDisplay2.BackColor = System.Drawing.Color.Black; + this.lB7SegmentDisplay2.ForeColor = System.Drawing.Color.LawnGreen; + this.lB7SegmentDisplay2.Location = new System.Drawing.Point(148, 104); + this.lB7SegmentDisplay2.Name = "lB7SegmentDisplay2"; + this.lB7SegmentDisplay2.Renderer = null; + this.lB7SegmentDisplay2.ShowDP = false; + this.lB7SegmentDisplay2.Size = new System.Drawing.Size(99, 146); + this.lB7SegmentDisplay2.TabIndex = 16; + this.lB7SegmentDisplay2.Value = 3; + this.lB7SegmentDisplay2.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbLed4 + // + this.lbLed4.BackColor = System.Drawing.Color.Transparent; + this.lbLed4.BlinkInterval = 500; + this.lbLed4.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbLed4.ForeColor = System.Drawing.Color.Black; + this.lbLed4.Label = "Fixed & Top"; + this.lbLed4.LabelPosition = LBSoft.IndustrialCtrls.Leds.LBLed.LedLabelPosition.Top; + this.lbLed4.LedColor = System.Drawing.Color.Red; + this.lbLed4.LedSize = new System.Drawing.SizeF(20F, 20F); + this.lbLed4.Location = new System.Drawing.Point(4, 59); + this.lbLed4.Margin = new System.Windows.Forms.Padding(7, 5, 7, 5); + this.lbLed4.Name = "lbLed4"; + this.lbLed4.Renderer = null; + this.lbLed4.Size = new System.Drawing.Size(103, 39); + this.lbLed4.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.On; + this.lbLed4.Style = LBSoft.IndustrialCtrls.Leds.LBLed.LedStyle.Circular; + this.lbLed4.TabIndex = 3; + this.lbLed4.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbLed3 + // + this.lbLed3.BackColor = System.Drawing.Color.Transparent; + this.lbLed3.BlinkInterval = 200; + this.lbLed3.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbLed3.ForeColor = System.Drawing.Color.Black; + this.lbLed3.Label = "Left & Blink"; + this.lbLed3.LabelPosition = LBSoft.IndustrialCtrls.Leds.LBLed.LedLabelPosition.Left; + this.lbLed3.LedColor = System.Drawing.Color.Yellow; + this.lbLed3.LedSize = new System.Drawing.SizeF(30F, 30F); + this.lbLed3.Location = new System.Drawing.Point(10, 186); + this.lbLed3.Margin = new System.Windows.Forms.Padding(6, 4, 6, 4); + this.lbLed3.Name = "lbLed3"; + this.lbLed3.Renderer = null; + this.lbLed3.Size = new System.Drawing.Size(112, 39); + this.lbLed3.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; + this.lbLed3.Style = LBSoft.IndustrialCtrls.Leds.LBLed.LedStyle.Circular; + this.lbLed3.TabIndex = 2; + this.lbLed3.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbLed2 + // + this.lbLed2.BackColor = System.Drawing.Color.Transparent; + this.lbLed2.BlinkInterval = 500; + this.lbLed2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbLed2.ForeColor = System.Drawing.Color.Black; + this.lbLed2.Label = "Right & Fixed"; + this.lbLed2.LabelPosition = LBSoft.IndustrialCtrls.Leds.LBLed.LedLabelPosition.Right; + this.lbLed2.LedColor = System.Drawing.Color.Lime; + this.lbLed2.LedSize = new System.Drawing.SizeF(20F, 20F); + this.lbLed2.Location = new System.Drawing.Point(10, 118); + this.lbLed2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); + this.lbLed2.Name = "lbLed2"; + this.lbLed2.Renderer = null; + this.lbLed2.Size = new System.Drawing.Size(112, 29); + this.lbLed2.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; + this.lbLed2.Style = LBSoft.IndustrialCtrls.Leds.LBLed.LedStyle.Circular; + this.lbLed2.TabIndex = 1; + this.lbLed2.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbLed1 + // + this.lbLed1.BackColor = System.Drawing.Color.Transparent; + this.lbLed1.BlinkInterval = 500; + this.lbLed1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbLed1.ForeColor = System.Drawing.Color.Black; + this.lbLed1.Label = "Fixed & Bottom"; + this.lbLed1.LabelPosition = LBSoft.IndustrialCtrls.Leds.LBLed.LedLabelPosition.Bottom; + this.lbLed1.LedColor = System.Drawing.Color.Red; + this.lbLed1.LedSize = new System.Drawing.SizeF(20F, 20F); + this.lbLed1.Location = new System.Drawing.Point(4, 19); + this.lbLed1.Margin = new System.Windows.Forms.Padding(7, 5, 7, 5); + this.lbLed1.Name = "lbLed1"; + this.lbLed1.Renderer = null; + this.lbLed1.Size = new System.Drawing.Size(103, 39); + this.lbLed1.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; + this.lbLed1.Style = LBSoft.IndustrialCtrls.Leds.LBLed.LedStyle.Circular; + this.lbLed1.TabIndex = 0; + this.lbLed1.Click += new System.EventHandler(this.OnObjectClicked); + // + // groupBox2 + // + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.groupBox2.BackColor = System.Drawing.Color.Transparent; + this.groupBox2.Controls.Add(this.btnRepeat); + this.groupBox2.Controls.Add(this.lbButton3); + this.groupBox2.Controls.Add(this.lbButton2); + this.groupBox2.Controls.Add(this.lbButton1); + this.groupBox2.Location = new System.Drawing.Point(13, 258); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(124, 337); + this.groupBox2.TabIndex = 7; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Buttons"; + // + // btnRepeat + // + this.btnRepeat.BackColor = System.Drawing.Color.Transparent; + this.btnRepeat.ButtonColor = System.Drawing.Color.DodgerBlue; + this.btnRepeat.Font = new System.Drawing.Font("Microsoft Sans Serif", 39.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnRepeat.Label = "Repeat"; + this.btnRepeat.Location = new System.Drawing.Point(6, 247); + this.btnRepeat.Name = "btnRepeat"; + this.btnRepeat.Renderer = null; + this.btnRepeat.RepeatInterval = 100; + this.btnRepeat.RepeatState = true; + this.btnRepeat.Size = new System.Drawing.Size(103, 70); + this.btnRepeat.StartRepeatInterval = 500; + this.btnRepeat.State = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal; + this.btnRepeat.Style = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonStyle.Rectangular; + this.btnRepeat.TabIndex = 3; + this.btnRepeat.ButtonChangeState += new LBSoft.IndustrialCtrls.Buttons.ButtonChangeState(this.btnRepeat_ButtonChangeState); + this.btnRepeat.ButtonRepeatState += new LBSoft.IndustrialCtrls.Buttons.ButtonRepeatState(this.btnRepeat_ButtonRepeatState); + this.btnRepeat.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbButton3 + // + this.lbButton3.BackColor = System.Drawing.Color.Transparent; + this.lbButton3.ButtonColor = System.Drawing.Color.Yellow; + this.lbButton3.Font = new System.Drawing.Font("Microsoft Sans Serif", 39.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbButton3.Label = "Warn"; + this.lbButton3.Location = new System.Drawing.Point(15, 171); + this.lbButton3.Name = "lbButton3"; + this.lbButton3.Renderer = null; + this.lbButton3.RepeatInterval = 100; + this.lbButton3.RepeatState = false; + this.lbButton3.Size = new System.Drawing.Size(103, 70); + this.lbButton3.StartRepeatInterval = 500; + this.lbButton3.State = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal; + this.lbButton3.Style = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonStyle.Circular; + this.lbButton3.TabIndex = 2; + this.lbButton3.ButtonChangeState += new LBSoft.IndustrialCtrls.Buttons.ButtonChangeState(this.OnWarnStateChanged); + this.lbButton3.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbButton2 + // + this.lbButton2.BackColor = System.Drawing.Color.Transparent; + this.lbButton2.ButtonColor = System.Drawing.Color.Green; + this.lbButton2.Font = new System.Drawing.Font("Microsoft Sans Serif", 39.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbButton2.Label = "Start"; + this.lbButton2.Location = new System.Drawing.Point(15, 95); + this.lbButton2.Name = "lbButton2"; + this.lbButton2.Renderer = null; + this.lbButton2.RepeatInterval = 100; + this.lbButton2.RepeatState = false; + this.lbButton2.Size = new System.Drawing.Size(103, 70); + this.lbButton2.StartRepeatInterval = 500; + this.lbButton2.State = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal; + this.lbButton2.Style = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonStyle.Elliptical; + this.lbButton2.TabIndex = 1; + this.lbButton2.ButtonChangeState += new LBSoft.IndustrialCtrls.Buttons.ButtonChangeState(this.OnStartStateChanged); + this.lbButton2.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbButton1 + // + this.lbButton1.BackColor = System.Drawing.Color.Transparent; + this.lbButton1.ButtonColor = System.Drawing.Color.Red; + this.lbButton1.Font = new System.Drawing.Font("Microsoft Sans Serif", 39.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbButton1.Label = "Stop"; + this.lbButton1.Location = new System.Drawing.Point(15, 19); + this.lbButton1.Name = "lbButton1"; + this.lbButton1.Renderer = null; + this.lbButton1.RepeatInterval = 100; + this.lbButton1.RepeatState = false; + this.lbButton1.Size = new System.Drawing.Size(103, 70); + this.lbButton1.StartRepeatInterval = 500; + this.lbButton1.State = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal; + this.lbButton1.Style = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonStyle.Rectangular; + this.lbButton1.TabIndex = 0; + this.lbButton1.ButtonChangeState += new LBSoft.IndustrialCtrls.Buttons.ButtonChangeState(this.OnStopStateChanged); + this.lbButton1.Click += new System.EventHandler(this.OnObjectClicked); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(72, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(93, 29); + this.label1.TabIndex = 10; + this.label1.Text = "Analog meter with default renderer"; + this.label1.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // label2 + // + this.label2.Location = new System.Drawing.Point(280, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(93, 29); + this.label2.TabIndex = 11; + this.label2.Text = "Analog meter with custom renderer"; + this.label2.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // label3 + // + this.label3.Location = new System.Drawing.Point(479, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(93, 29); + this.label3.TabIndex = 12; + this.label3.Text = "Knob for change the analog values"; + this.label3.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // propertyGrid1 + // + this.propertyGrid1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.propertyGrid1.HelpVisible = false; + this.propertyGrid1.Location = new System.Drawing.Point(424, 258); + this.propertyGrid1.Name = "propertyGrid1"; + this.propertyGrid1.Size = new System.Drawing.Size(251, 337); + this.propertyGrid1.TabIndex = 13; + this.propertyGrid1.ToolbarVisible = false; + // + // labelCurrCtrl + // + this.labelCurrCtrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.labelCurrCtrl.Location = new System.Drawing.Point(420, 233); + this.labelCurrCtrl.Name = "labelCurrCtrl"; + this.labelCurrCtrl.Size = new System.Drawing.Size(257, 14); + this.labelCurrCtrl.TabIndex = 14; + this.labelCurrCtrl.Text = "Click to the controls to view the properties"; + // + // lbDigitalMeter1 + // + this.lbDigitalMeter1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lbDigitalMeter1.BackColor = System.Drawing.Color.Black; + this.lbDigitalMeter1.ForeColor = System.Drawing.Color.Red; + this.lbDigitalMeter1.Format = "0000.00"; + this.lbDigitalMeter1.Location = new System.Drawing.Point(441, 147); + this.lbDigitalMeter1.Name = "lbDigitalMeter1"; + this.lbDigitalMeter1.Renderer = null; + this.lbDigitalMeter1.Signed = false; + this.lbDigitalMeter1.Size = new System.Drawing.Size(233, 71); + this.lbDigitalMeter1.TabIndex = 15; + this.lbDigitalMeter1.Value = 0; + this.lbDigitalMeter1.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbAnalogMeter2 + // + this.lbAnalogMeter2.BackColor = System.Drawing.Color.Transparent; + this.lbAnalogMeter2.BodyColor = System.Drawing.Color.DodgerBlue; + this.lbAnalogMeter2.Location = new System.Drawing.Point(12, 32); + this.lbAnalogMeter2.MaxValue = 100; + this.lbAnalogMeter2.MeterStyle = LBSoft.IndustrialCtrls.Meters.LBAnalogMeter.AnalogMeterStyle.Circular; + this.lbAnalogMeter2.MinValue = 0; + this.lbAnalogMeter2.Name = "lbAnalogMeter2"; + this.lbAnalogMeter2.NeedleColor = System.Drawing.Color.Yellow; + this.lbAnalogMeter2.Renderer = null; + this.lbAnalogMeter2.ScaleColor = System.Drawing.Color.GreenYellow; + this.lbAnalogMeter2.ScaleDivisions = 11; + this.lbAnalogMeter2.ScaleSubDivisions = 10; + this.lbAnalogMeter2.Size = new System.Drawing.Size(211, 201); + this.lbAnalogMeter2.TabIndex = 9; + this.lbAnalogMeter2.Value = 0; + this.lbAnalogMeter2.ViewGlass = true; + this.lbAnalogMeter2.Click += new System.EventHandler(this.OnObjectClicked); + // + // lbKnob1 + // + this.lbKnob1.BackColor = System.Drawing.Color.Transparent; + this.lbKnob1.DrawRatio = 0.415F; + this.lbKnob1.IndicatorColor = System.Drawing.Color.DarkRed; + this.lbKnob1.IndicatorOffset = 8F; + this.lbKnob1.KnobCenter = ((System.Drawing.PointF)(resources.GetObject("lbKnob1.KnobCenter"))); + this.lbKnob1.KnobColor = System.Drawing.Color.DarkOrange; + this.lbKnob1.KnobRect = ((System.Drawing.RectangleF)(resources.GetObject("lbKnob1.KnobRect"))); + this.lbKnob1.Location = new System.Drawing.Point(485, 32); + this.lbKnob1.MaxValue = 100F; + this.lbKnob1.MinValue = 0F; + this.lbKnob1.Name = "lbKnob1"; + this.lbKnob1.Renderer = null; + this.lbKnob1.ScaleColor = System.Drawing.Color.DimGray; + this.lbKnob1.Size = new System.Drawing.Size(87, 83); + this.lbKnob1.StepValue = 0.2F; + this.lbKnob1.Style = LBSoft.IndustrialCtrls.Knobs.LBKnob.KnobStyle.Circular; + this.lbKnob1.TabIndex = 8; + this.lbKnob1.Value = 0F; + this.lbKnob1.Click += new System.EventHandler(this.OnObjectClicked); + this.lbKnob1.KnobChangeValue += new LBSoft.IndustrialCtrls.Knobs.KnobChangeValue(this.OnKnobChangeValue); + // + // lbAnalogMeter1 + // + this.lbAnalogMeter1.BackColor = System.Drawing.Color.Transparent; + this.lbAnalogMeter1.BodyColor = System.Drawing.Color.DodgerBlue; + this.lbAnalogMeter1.Font = new System.Drawing.Font("Verdana", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbAnalogMeter1.ForeColor = System.Drawing.Color.Red; + this.lbAnalogMeter1.Location = new System.Drawing.Point(228, 32); + this.lbAnalogMeter1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.lbAnalogMeter1.MaxValue = 100; + this.lbAnalogMeter1.MeterStyle = LBSoft.IndustrialCtrls.Meters.LBAnalogMeter.AnalogMeterStyle.Circular; + this.lbAnalogMeter1.MinValue = 0; + this.lbAnalogMeter1.Name = "lbAnalogMeter1"; + this.lbAnalogMeter1.NeedleColor = System.Drawing.Color.Yellow; + this.lbAnalogMeter1.Renderer = null; + this.lbAnalogMeter1.ScaleColor = System.Drawing.Color.GreenYellow; + this.lbAnalogMeter1.ScaleDivisions = 11; + this.lbAnalogMeter1.ScaleSubDivisions = 5; + this.lbAnalogMeter1.Size = new System.Drawing.Size(206, 201); + this.lbAnalogMeter1.TabIndex = 2; + this.lbAnalogMeter1.Value = 0; + this.lbAnalogMeter1.ViewGlass = true; + this.lbAnalogMeter1.Click += new System.EventHandler(this.OnObjectClicked); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.DarkKhaki; + this.ClientSize = new System.Drawing.Size(688, 607); + this.Controls.Add(this.lbDigitalMeter1); + this.Controls.Add(this.labelCurrCtrl); + this.Controls.Add(this.propertyGrid1); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.lbAnalogMeter2); + this.Controls.Add(this.lbKnob1); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.lbAnalogMeter1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "MainForm"; + this.Text = "TestApp"; + this.groupBox1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.ResumeLayout(false); + + } + private System.Windows.Forms.Label labelCurrCtrl; + private System.Windows.Forms.PropertyGrid propertyGrid1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private LBSoft.IndustrialCtrls.Leds.LBLed lbLed4; + private LBSoft.IndustrialCtrls.Meters.LBAnalogMeter lbAnalogMeter2; + private LBSoft.IndustrialCtrls.Knobs.LBKnob lbKnob1; + private LBSoft.IndustrialCtrls.Buttons.LBButton lbButton1; + private LBSoft.IndustrialCtrls.Buttons.LBButton lbButton2; + private LBSoft.IndustrialCtrls.Buttons.LBButton lbButton3; + private LBSoft.IndustrialCtrls.Leds.LBLed lbLed1; + private LBSoft.IndustrialCtrls.Leds.LBLed lbLed2; + private LBSoft.IndustrialCtrls.Leds.LBLed lbLed3; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox1; + private LBSoft.IndustrialCtrls.Meters.LBAnalogMeter lbAnalogMeter1; + + void OnWarnStateChanged(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) + { + if ( e.State == LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Pressed ) + this.lbLed3.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Blink; + else + this.lbLed3.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; + } + + void OnStartStateChanged(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) + { + if ( e.State == LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Pressed ) + this.lbLed2.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.On; + else + this.lbLed2.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; + } + + void OnStopStateChanged(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) + { + if ( e.State == LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Pressed ) + { + this.lbLed1.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.On; + this.lbLed4.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; + } + else + { + this.lbLed1.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; + this.lbLed4.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.On; + } + } + + void OnKnobChangeValue(object sender, LBSoft.IndustrialCtrls.Knobs.LBKnobEventArgs e) + { + this.lbAnalogMeter1.Value = e.Value; + this.lbAnalogMeter2.Value = e.Value; + this.lbDigitalMeter1.Value = e.Value * 10; + + int v = (int)(e.Value / 10) - 1; + if ( v < 0 ) + v = 0; + if ( v > 9 ) + v = 9; + this.lB7SegmentDisplay1.Value = v; + this.lB7SegmentDisplay2.Value = v; + } + + void OnObjectClicked(object sender, System.EventArgs e) + { + this.propertyGrid1.CollapseAllGridItems(); + this.propertyGrid1.Refresh(); + + this.propertyGrid1.SelectedObject = sender; + } + + private LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay lB7SegmentDisplay1; + private LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay lB7SegmentDisplay2; + private Label label4; + private LBSoft.IndustrialCtrls.Meters.LBDigitalMeter lbDigitalMeter1; + private LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay sdRepeat; + private LBSoft.IndustrialCtrls.Buttons.LBButton btnRepeat; + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.cs b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.cs new file mode 100644 index 0000000..fe5be26 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.cs @@ -0,0 +1,182 @@ +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 03/04/2008 + * Ora: 14.34 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using LBSoft.IndustrialCtrls; +using LBSoft.IndustrialCtrls.Meters; +using LBSoft.IndustrialCtrls.Utils; + +namespace TestApp +{ + /// + /// Description of MainForm. + /// + public partial class MainForm : Form + { + private LBMyAnalogMeterRenderer myRenderer; + + public MainForm() + { + // + // The InitializeComponent() call is required for Windows Forms designer support. + // + InitializeComponent(); + + this.myRenderer = new LBMyAnalogMeterRenderer(); + + LBMeterThreshold threshold = new LBMeterThreshold(); + threshold.Color = Color.Yellow; + threshold.StartValue = 50; + threshold.EndValue = 70; + this.lbAnalogMeter1.Thresholds.Add ( threshold ); + threshold = new LBMeterThreshold(); + threshold.Color = Color.Red; + threshold.StartValue = 70; + threshold.EndValue = 100; + this.lbAnalogMeter1.Thresholds.Add ( threshold ); + this.lbAnalogMeter1.Renderer = this.myRenderer; + + threshold = new LBMeterThreshold(); + threshold.Color = Color.Yellow; + threshold.StartValue = 50; + threshold.EndValue = 70; + this.lbAnalogMeter2.Thresholds.Add ( threshold ); + threshold = new LBMeterThreshold(); + threshold.Color = Color.Red; + threshold.StartValue = 70; + threshold.EndValue = 100; + this.lbAnalogMeter2.Thresholds.Add ( threshold ); + } + + private void btnRepeat_ButtonChangeState(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) + { + if (e.State != LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal) + return; + + this.sdRepeat.Value = 0; + } + + private void btnRepeat_ButtonRepeatState(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) + { + int v = this.sdRepeat.Value; + v++; + if (v > 9) + v = 0; + + this.sdRepeat.Value = v; + } + } + + /// + /// Custom renderer class + /// + public class LBMyAnalogMeterRenderer : LBAnalogMeterRenderer + { + public override bool DrawBody( Graphics Gr, RectangleF rc ) + { + return true; + } + + public override bool DrawGlass( Graphics Gr, RectangleF rc ) + { + return true; + } + + public override bool DrawDivisions( Graphics Gr, RectangleF rc ) + { + if ( this.AnalogMeter == null ) + return false; + + float startAngle = this.AnalogMeter.GetStartAngle(); + float endAngle = this.AnalogMeter.GetEndAngle(); + float scaleDivisions = this.AnalogMeter.ScaleDivisions; + float scaleSubDivisions = this.AnalogMeter.ScaleSubDivisions; + double minValue = this.AnalogMeter.MinValue; + double maxValue = this.AnalogMeter.MaxValue; + Color scaleColor = this.AnalogMeter.ScaleColor; + + float cx = needleCenter.X; + float cy = needleCenter.Y; + float w = rc.Width; + float h = rc.Height; + + float incr = LBMath.GetRadian(( endAngle - startAngle ) / (( scaleDivisions - 1 )* (scaleSubDivisions + 1))); + float currentAngle = LBMath.GetRadian( startAngle ); + float radius = (float)(w / 2 - ( w * 0.08)); + float rulerValue = (float)minValue; + + Pen pen = new Pen ( scaleColor, ( 2 * drawRatio ) ); + SolidBrush br = new SolidBrush ( scaleColor ); + + PointF ptStart = new PointF(0,0); + PointF ptEnd = new PointF(0,0); + PointF ptCenter = new PointF(0,0); + RectangleF rcTick = new RectangleF(0,0,0,0); + SizeF sizeMax = new SizeF( 10 * drawRatio, 10 * drawRatio ); + SizeF sizeMin = new SizeF( 4 * drawRatio, 4 * drawRatio ); + + int n = 0; + for( ; n < scaleDivisions; n++ ) + { + //Draw Thick Line + ptCenter.X = (float)(cx + (radius - w/90) * Math.Cos(currentAngle)); + ptCenter.Y = (float)(cy + (radius - w/90) * Math.Sin(currentAngle)); + ptStart.X = ptCenter.X - ( 5 * drawRatio ); + ptStart.Y = ptCenter.Y - ( 5 * drawRatio ); + rcTick.Location = ptStart; + rcTick.Size = sizeMax; + Gr.FillEllipse( br, rcTick ); + + //Draw Strings + Font font = new Font ( this.AnalogMeter.Font.FontFamily, (float)( 8F * drawRatio ), FontStyle.Italic ); + + float tx = (float)(cx + (radius - ( 20 * drawRatio )) * Math.Cos(currentAngle)); + float ty = (float)(cy + (radius - ( 20 * drawRatio )) * Math.Sin(currentAngle)); + double val = Math.Round ( rulerValue ); + String str = String.Format( "{0,0:D}", (int)val ); + + SizeF size = Gr.MeasureString ( str, font ); + Gr.DrawString ( str, + font, + br, + tx - (float)( size.Width * 0.5 ), + ty - (float)( size.Height * 0.5 ) ); + + rulerValue += (float)(( maxValue - minValue) / (scaleDivisions - 1)); + + if ( n == scaleDivisions -1) + break; + + if ( scaleDivisions <= 0 ) + currentAngle += incr; + else + { + for (int j = 0; j <= scaleSubDivisions; j++) + { + currentAngle += incr; + + ptCenter.X = (float)(cx + (radius - w/90) * Math.Cos(currentAngle)); + ptCenter.Y = (float)(cy + (radius - w/90) * Math.Sin(currentAngle)); + ptStart.X = ptCenter.X - ( 2 * drawRatio ); + ptStart.Y = ptCenter.Y - ( 2 * drawRatio ); + rcTick.Location = ptStart; + rcTick.Size = sizeMin; + Gr.FillEllipse( br, rcTick ); + } + } + } + + return true; + } + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.resx b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.resx new file mode 100644 index 0000000..2674f1e --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0 + dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJh + d2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAmQgAAIkIL + + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0 + dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh + d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAzcwEQc3MBEHNzIRC + zcyAQgs= + + + \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/Program.cs b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/Program.cs new file mode 100644 index 0000000..e76f8ce --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/Program.cs @@ -0,0 +1,32 @@ +/* + * Creato da SharpDevelop. + * Utente: lucabonotto + * Data: 03/04/2008 + * Ora: 14.34 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +using System; +using System.Windows.Forms; + +namespace TestApp +{ + /// + /// Class with program entry point. + /// + internal sealed class Program + { + /// + /// Program entry point. + /// + [STAThread] + private static void Main(string[] args) + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + + } +} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/TestApp.csproj b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/TestApp.csproj new file mode 100644 index 0000000..70bda3e --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/TestApp.csproj @@ -0,0 +1,132 @@ + + + {AA498353-353F-46AE-B5D5-96A88CBEA6ED} + Debug + AnyCPU + WinExe + TestApp + TestApp + False + False + 4 + false + + + + + 3.5 + v4.5.2 + false + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + bin\Debug\ + true + Full + False + True + DEBUG;TRACE + + + bin\Release\ + False + None + True + False + TRACE + + + False + Auto + 4194304 + AnyCPU + 4096 + + + MinimumRecommendedRules.ruleset + false + + + MinimumRecommendedRules.ruleset + false + + + true + + + + + + + + + + + + + Form + + + MainForm.cs + + + + MainForm.cs + + + + + {B4218BC9-9736-42B9-BC99-7903FDBEBA28} + LBIndustrialCtrls + + + + + False + .NET Framework Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + false + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/app.config b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/app.config new file mode 100644 index 0000000..ff99501 --- /dev/null +++ b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/app.config @@ -0,0 +1,3 @@ + + + diff --git a/MidiShapeShifter/MidiShapeShifter.sln b/MidiShapeShifter/MidiShapeShifter.sln index 73458aa..bf70f8e 100644 --- a/MidiShapeShifter/MidiShapeShifter.sln +++ b/MidiShapeShifter/MidiShapeShifter.sln @@ -4,6 +4,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 17.2.32519.379 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MidiShapeShifter", "MidiShapeShifter\MidiShapeShifter.csproj", "{D19470F9-7D1E-4385-AD34-C7D826649F89}" + ProjectSection(ProjectDependencies) = postProject + {B4218BC9-9736-42B9-BC99-7903FDBEBA28} = {B4218BC9-9736-42B9-BC99-7903FDBEBA28} + EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MidiShapeShifterTest", "MidiShapeShifterTest\MidiShapeShifterTest.csproj", "{F51E9F9B-101C-4F76-92C3-F28904E58466}" ProjectSection(ProjectDependencies) = postProject @@ -15,35 +18,81 @@ Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "MidiShapeShifterInstaller", {D19470F9-7D1E-4385-AD34-C7D826649F89} = {D19470F9-7D1E-4385-AD34-C7D826649F89} EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LBIndustrialCtrls", "LBIndustrialCtrls_src\LBIndustrialCtrls\LBIndustrialCtrls.csproj", "{B4218BC9-9736-42B9-BC99-7903FDBEBA28}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + All|Any CPU = All|Any CPU All|x64 = All|x64 + Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 + Deploy|Any CPU = Deploy|Any CPU Deploy|x64 = Deploy|x64 + Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D19470F9-7D1E-4385-AD34-C7D826649F89}.All|Any CPU.ActiveCfg = Debug|x64 + {D19470F9-7D1E-4385-AD34-C7D826649F89}.All|Any CPU.Build.0 = Debug|x64 {D19470F9-7D1E-4385-AD34-C7D826649F89}.All|x64.ActiveCfg = Release|x64 {D19470F9-7D1E-4385-AD34-C7D826649F89}.All|x64.Build.0 = Release|x64 + {D19470F9-7D1E-4385-AD34-C7D826649F89}.Debug|Any CPU.ActiveCfg = Debug|x64 + {D19470F9-7D1E-4385-AD34-C7D826649F89}.Debug|Any CPU.Build.0 = Debug|x64 {D19470F9-7D1E-4385-AD34-C7D826649F89}.Debug|x64.ActiveCfg = Debug|x64 {D19470F9-7D1E-4385-AD34-C7D826649F89}.Debug|x64.Build.0 = Debug|x64 + {D19470F9-7D1E-4385-AD34-C7D826649F89}.Deploy|Any CPU.ActiveCfg = Debug|x64 + {D19470F9-7D1E-4385-AD34-C7D826649F89}.Deploy|Any CPU.Build.0 = Debug|x64 {D19470F9-7D1E-4385-AD34-C7D826649F89}.Deploy|x64.ActiveCfg = Release|x64 {D19470F9-7D1E-4385-AD34-C7D826649F89}.Deploy|x64.Build.0 = Release|x64 + {D19470F9-7D1E-4385-AD34-C7D826649F89}.Release|Any CPU.ActiveCfg = Release|x64 + {D19470F9-7D1E-4385-AD34-C7D826649F89}.Release|Any CPU.Build.0 = Release|x64 {D19470F9-7D1E-4385-AD34-C7D826649F89}.Release|x64.ActiveCfg = Release|x64 {D19470F9-7D1E-4385-AD34-C7D826649F89}.Release|x64.Build.0 = Release|x64 + {F51E9F9B-101C-4F76-92C3-F28904E58466}.All|Any CPU.ActiveCfg = Debug|x64 + {F51E9F9B-101C-4F76-92C3-F28904E58466}.All|Any CPU.Build.0 = Debug|x64 {F51E9F9B-101C-4F76-92C3-F28904E58466}.All|x64.ActiveCfg = Release|x64 {F51E9F9B-101C-4F76-92C3-F28904E58466}.All|x64.Build.0 = Release|x64 + {F51E9F9B-101C-4F76-92C3-F28904E58466}.Debug|Any CPU.ActiveCfg = Debug|x64 + {F51E9F9B-101C-4F76-92C3-F28904E58466}.Debug|Any CPU.Build.0 = Debug|x64 {F51E9F9B-101C-4F76-92C3-F28904E58466}.Debug|x64.ActiveCfg = Debug|x64 {F51E9F9B-101C-4F76-92C3-F28904E58466}.Debug|x64.Build.0 = Debug|x64 + {F51E9F9B-101C-4F76-92C3-F28904E58466}.Deploy|Any CPU.ActiveCfg = Debug|x64 + {F51E9F9B-101C-4F76-92C3-F28904E58466}.Deploy|Any CPU.Build.0 = Debug|x64 {F51E9F9B-101C-4F76-92C3-F28904E58466}.Deploy|x64.ActiveCfg = Release|x64 + {F51E9F9B-101C-4F76-92C3-F28904E58466}.Release|Any CPU.ActiveCfg = Release|x64 + {F51E9F9B-101C-4F76-92C3-F28904E58466}.Release|Any CPU.Build.0 = Release|x64 {F51E9F9B-101C-4F76-92C3-F28904E58466}.Release|x64.ActiveCfg = Release|x64 {F51E9F9B-101C-4F76-92C3-F28904E58466}.Release|x64.Build.0 = Release|x64 + {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.All|Any CPU.ActiveCfg = Debug + {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.All|Any CPU.Build.0 = Debug {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.All|x64.ActiveCfg = Release {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.All|x64.Build.0 = Release + {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Debug|Any CPU.ActiveCfg = Debug + {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Debug|Any CPU.Build.0 = Debug {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Debug|x64.ActiveCfg = Release + {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Deploy|Any CPU.ActiveCfg = Debug + {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Deploy|Any CPU.Build.0 = Debug {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Deploy|x64.ActiveCfg = Release {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Deploy|x64.Build.0 = Release + {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Release|Any CPU.ActiveCfg = Release + {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Release|Any CPU.Build.0 = Release {A5BC787D-A27A-427B-B616-5AC8CB43A06F}.Release|x64.ActiveCfg = Release + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.All|Any CPU.ActiveCfg = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.All|Any CPU.Build.0 = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.All|x64.ActiveCfg = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.All|x64.Build.0 = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Debug|x64.ActiveCfg = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Debug|x64.Build.0 = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Deploy|x64.ActiveCfg = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Deploy|x64.Build.0 = Debug|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|Any CPU.Build.0 = Release|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|x64.ActiveCfg = Release|Any CPU + {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj index 1f69168..6ed1925 100644 --- a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj +++ b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj @@ -63,10 +63,6 @@ False ..\lib\Jacobi.Vst.Framework.dll - - False - ..\lib\LBIndustrialCtrls.dll - False @@ -403,6 +399,12 @@ + + + {b4218bc9-9736-42b9-bc99-7903fdbeba28} + LBIndustrialCtrls + + >F8?Lx7r#q{W$F>^gBpu2v z)P3nBXQi6%p#{2!_L)ErCFY;kK~rt2s-;!DAg$tko=g=dCXy_C0yc(>7AB%%$DUIT zfIbgQ=y(nCSBs7tCAH=`ZBI%*T`T#_Cr8Prrzh22_Xe~@c$+nKE--Ft8Tys8+ zJhphbwwfY3w!AJJdUA}mx%Te->JDR*McP&%Ww)T#9|gQPCOt(iRkKF6vCNt^z?w54 zd@<)pYh7?Yp|;m(EKLiU;Ix-QsuSxIpJ-!QIn7$Kw$JDbA-GJmn!Ys$fQI(`L$Zdk z=h^P1J0`M-vHSO<=*y3_^>5jEA1c8nJ^Hs@Yfs|R6hF5y5sjDJoHC0X_Axr{7hiva zS(jy;nP`Cia~lJV!Qdj<)om+i)^k0*rd+o}AM#q={>JHQ;LOHh>3D5X$~8`3+Y8<~ zoL)LkzE59sJic4F`3&HtYv#&#sGj&^r>?PB-&gny9H4`(CSjogp zB$`ajLZZRMY$R&HmA+J{VWK9ADZbg;3GLDDl> zm8Jeh2TMGB9VKp~>JSlK(7wKTVrFM-=aZi@wo`NtfDro6ZERD@berF%mO6gfW^DK^ zUt#!lJ6{E}Yei3u=_y}ZNKfg-b?nGCHFT$`%Ii{2dS1IHoycgkoOI(n+~S$YjUCg* zTW?cstPbqw{26Or+?%U#8_gZQyFGR)D%<90pm(QS^Kq@fwHDXWxNwMs_srx3_Dk@M zvFp4Y*G;%ShwJOOzK`o?xc-2PKglx{7k`##DXu|WN8maM*Lk@3)|eOJ;uB$S#>KOj zpThMOTzu-{eq6u9^%yR`lXM2ICAeAx_&_(`pvDAV!p+=`D%YcO?^Zb;+XU`CD)%TD zA@^RDdr;-zg&D@)t8(vGxo@l72UPA>mHVK|(UpS>TFr7dsN9EC?)55nv&y|vnIIH= zhLzs&U9bwz0$p>2C*SUA&wh{D^NEGw`#UgNGGP#9f57ZWRQ89=zBACM%m6xu`^Tc%rrYw3EvWPn{H#OcBaS9^xBzP_^y~iJ$!GR=?gy; zXJ&+7jx#fD2D9wUY&&Bsr!m*YH0;bgJ2T(TEC_!ZSGv%~>|@flfAV}+d=urn(|KbCD(*d1r~52weO1MD&fhJ7*SARBYA zooU(H8MHI2!?`hoHQ_#S<`A2~T067OX0Sf&kIQVZ$qu#24zn;j?&U}vKruC_cQN~^ zDEnh(zrd^v>Yp(C%o9!aK4yQxtT=@Gnf>h3P4=hAj*`6^)DIxlPd`;1C^!q~xA12j z!-4<60w>dir@(i%37-Jxr+u3_FYN-P!yU^J%5pdlQ*T0ZXbqbqXLJVfjY*~AHZhZdr^g?0Dyp9n zoCaL@WvDTH6dywe1F;<^e0~9TP!BptsYQIg@P^)F-gxK?<=<@cj(#*sI8S*-f^+jh zmXBGhK2pC|^%n4PMt_-VA9Xwr^}LmMcLxcY=x_Xjl>C04GxQ=zz2jE^JJRQ~2CB|| zpnn_bQ9l*?U zb{T(%u7GcR1mh^}8wo{|BH#Efq5XYFT0%)XYv534t>-w`vyE=^=a518*cXoMc#uNb@qALZ6!&`kH5@KYH6h%ZT2$tXHJDY%Z5a7wTWP`w?AqQC4rYOs5| zYiMcYMBJfw06p?+s~%{)7(kWqC9U_eqHGh&;?tNFf7=1*nx5UBQW-o9?=a!PNPjC4 z!40I#w`c&Bd~hRk_<1ySvkQQC0{}_>d)Hhc*fxv(jD0$|ar>L z!(E#`N#upPo6zt<*t+U1k@G!L!Rn*1f38}a-Ccw0j9S}4m4|_irAkq?R-rVOFMd(- zajZkvR8=K|pZ{QE11N~{#cKXoM>P+<4|LUT+>L9&O+Zk0kO}E;uOgR^zvFOF_TyQuI@MbBC z*KgrQU8S7gok1s@3)SJJT+>=JDWrG+T}%}MhT>PI_2aW^18AI2J8S-6=7CeX7LRnX zcLAT@b?g0I&_2_id&;SP|H+qieh<}G7i&j&r#cH@MDvl85n;+KYnqe`|ArlJbm)2!X5HACU zJ`CA*JV@*oYti>78QGcUU-)gUtI%WcWq$y9+LsYZ`HkPhSOM)HJJJ$LT3NeIVI}>z zKk7BB(xFa2)=!z{M|1{swru~@vOSiN4MPX@LGli=5o*f@qX+GuJJJ#w$%a9y)|DOC z#yLdAT%lol#&@=va($y`A{H;1)9hl1Z{c{f#`eEaP z+knCra%%&?)8Uc`%mrTpRLO5cM9t0Hf%Eb^SF?K-)i+IZgD(T39yM6?d5H~-Twehq z*=LLuF<&|#O3N@CV9%~F&Hp|fZhh(m+x!|JrJN$yexT?)1@stY6?f?CK(nhB0OIF@ZwT`shp+Gs z$P;`MshZrbR-F<22LP+?(WGVl+y}>R4>(}xRfaI@VB!q#M{zg!7BY)PPV?K^3*4Sy zlQr(kD2HKM@iN&dnV}^x!J>>q8K>S>2<8UZ7Z=!KJTnqt1DzTE{_$xji!ogB@Jqb7 zt=sQ<0bXh67hNBzbCC+L%kH~=COC)RUT`wLO119RJdnFyK6nQ5xVhj7Q{4W=dmw_R z0midh`P`~|Q4!_X?nz*hk(IcTDWfF28N`h9bMnp(xQvQI7Ztvg5y`xMU)nIZ4E6fK zJ5Z=QU*Eu{`?UbSLgp9cXEpQnb?}Z(SUL%-ux~?k+o5Pyq2;I!6rJNh0C!;O@ds(N znmxyWV!s+)h-gvut5jIuP$O1X=l2BfBH!NNJ&L`wbDawvv2!xPk@)OqyJ%Z*Zx#G- z^jUyS;}1uF0SV+uDQaMkDO)UHes>(WwiJCP8{E;Mm@b!wLBFQKNsLrodn2Rh&m(tReXM#1BBKC3$M!z>cfd_*xY{McEnt2*Gz z{U7*V__-Qf+G_Tdp01czP%pSs2EZVDz`qeo_pW|-xDGsCj!7~vx0Ar&E|9@<6N4Fo zUpdypcCL2o0#LJFzw>ls;JW>v(lX8UhQ5ICx_^O}8TuO&C=b}*nKbhjCJ2m=E@1lk zj8I18$^>5qi(*zXS;>?XZ$J1rFe;r3KB+3AOj?HCel5etve z>B|eeZ3jc0GKqTf!{Naf*$)2j#L4aL&zOEp@-ls;;Zfc1)H0pxt%m9y)dD?&ISi<` zB(HaC_;H@>Rp~M^T>4M-2B*e+;I{(Y5(5|bxbvBqg*owLs2sCy#S5?w_n~=rcrN?+ zn(lmUJ^g??j7cHm=Dpy>aC)U&?*{U8b6)cW;882@g0VQB9GzWyyE{Bb3fI?Td5WSc zSKjq|ilGj`-Ng+ScX$@*u3di_5X{b&?AmjrRD+r8v8tUFQ*OS7TQRjmRtm)osin4_ z-rOBlxsnp1wFaS#CEoK`L)IYY5~&MxF8&W3bE{-VpMx6i+OSag&(yW`N{(%EhZXFa z@~%38u{IdZdVX*@lzA`rUCe#|0^m=9rjEfy8vfDtH{u&>7>rd+l^MBXJp3)BYU>cl zp=}YgKJra~``zG$P`f)k4;c(6o_C-N!aYkLCzI8E!`vr$;xCQla zaLHK(A4f<26Lg!3xjsB9>B=jtR{hGq3R78EcdcB*1|t?a_(_S3(BX~m6?g!Z_UqML zYZ|cm0@gw0ivOIqs&K!87iX<}u#)N9B;Bl-em-yfZbt4?-^%vlNlx}K#i0uEAZPA+ zSXP(pzTZHUOy!_k^#B^gvCVc|4%*u$)DCFbv||v3#%>4g*|fuM#;+62_yU?CaujPa zhR~D6{>5%%L-S=EP4tJd{72x3+r3!CR|oPA?e$A+uO_P%B>;el+>PSmcX^2C)$G6e zrlRi!-vxZtPry#n z>(`*Nt@F`QR056~a5Z7-$T<5WjYT5XsBch04O7QgU$~z07nTD%0d)oDzXo%A*P>&* z=34+e`y^vKIp+|NVkL>OrpngOg+|^6B2i1xSFb`**jf%piWFJ%9w^PtDXkm%w}96- zM1Gio)9-0oQ)Zp`KLc&PHInY?3nSn~U|aO-n@e&}T$Rij;e}uB^=F@igG^Y8uedMj zPgmX>h!t<#j?KlE@=X-je|>Gs8ZIr#-KFJiQ7Vi(tgrSLm&ExDoZgUNPwl-kF2ob~ISvX3m++9!hWTd1psfJ$o|jg`Tu zn}Wt-91h9|Fk{SNsg?CTKm?;>uyVO?+*EKAwva?`xo=fWT8rUJ>e z7;O$Kt%@7`8*Jbz%@x=<(67dSb4@pq(F2LdAb*-vHA>ar6#)zuKmxwIZDcbE|im7;m zT!MPrIJhOy;HpYSx?!X2?CJ}f923-z?4L*-`PVCC{`K0ZbJ?AMR}pc(b}Z6bm8BWyL+*mn&oCk z?$h{L@a+)Mf&XK?ql(+4L-&JH$g_i7$Yf=6T+ML4Y*gP!mRM7gWiI$BK7HBHUUuIu zU>slW1$5`-PGMf|0o)7wfkItpKd1j>3D;#Dg`no2x04)IprF_e(jTd$Cp93BVRIBA zZ5LV~px>P}^Z>p^U{yd-N-5WFn8>TSsWHCJt&RLQ3M1tC8F}rtD$zS?MAz5DuC+9S zY@yuWhyS||$l&Mr*q!OG_1F8+hrb{nj@@fP2X73Y{7ZoJU1xWg9XNCy7I@ng6My|Y z5c(=0$9@&t6#R-zG%bG9jw5t)u4qK&utNq_hz&MElqnd`mmv7hyoZCIqu3(%I&3B%{*5wbBns8s&e-1ok-} z#ZG&SpZ1Tp^t+1d2npQaSJa=P zmPpZcgI@xqu)@SsoUwp>7znJUY|am{IK(n*#C?&*%!0YyUeAi^xSoB096GIMxn4X0 zW%-v;!#JZhokUSbQc(-2sPRS31iuFnn)NPJgsmQK4{3j!lRZ{UR#+dg1!5W((Xj~IE~slu}$4@c-mRtlT)m4dKVoG>f$HKLWws$E_svx&E3 ztEE;IC3T%e(F=Y6VH0nKW>)@EtEj(L?QY}T4bI&b=Wdk1lZ^hVACE=$M>Mda$qK7} zY#6KgPHv`PzH@8RBeXf%%rbn#Az~f13+*m?C3UAV7u-*UL&>xNsE78T_JCLY)Y$7{ zx2HGw4G;iS2TELz@f=MBZ#}}XWq-{E#fe zx*)BR1x|j|{bIZHcWh@78&dpUjS%Pe;IEENF(&o-&T$7zfeQT>_ncJp;0N5}@;1;R z`q&8;jKA!cJ<+&25E!f-&<9kT9#_&|MHi!h1xjN2SjzxRIZo%x_%CDKg15Gsb4R5#cuoEo}Qj2em(&$ z#hhlRGcmlU$FpcMI?a1ip9FLMahm)yT7_lU3i|DAunjy%a6&DU-G*hmJ9q%8vRj$1 z%kK$|tR$g3%&*{!Xwt|57T{I_4wT}Dv$!mXvd!s~G`npTK?A~3ZO@JD&$8LAL2?e990+WP-tuio4C>W&?I!P#) z)XzF3prS8?NB`=+pm+q>qJr|(fvR{y* z2t|%XK8Jlbmf$QgxB>tiC1dB-)^QxTI;VOEnW&qwKt-`kKcnV|V?B0$}B_#o;u1{FhZB9!{qWe;ZA!>qCd$j-PlwBOcYl`m~0s{ozF zpU}a3&2w^NK+zgoIv6C5P;E71aQoqxZT1b@`ec{bK>5Wxamk)tusDBl@P>{61nl}T0 z@P4qgib&&{L+~;EVecmH538}8((NFdW^{`f!qV-bD5t94qi)G%V!BQCEmnuBergCo zmsS7p#Oo)Qv9tufW3(NQJZAdwUPX-VqC4~mNAzI?IhQJ!C$p3wrgfpK1<6T{7tR1M zFZ=kk4a6|adn4Zx77<=H^nvFd!ZrB*x!4CuO?=CA@5tBisaU9=2~_Fck#AUV@-j64 zVWn9m*61~`SLoqy1LF7GfXN&$9p8jiu*gcN%*0stM*!@-e*+CrzAo>a4JN;!j9zd8 zY`v)O=wvp`147+>F(Q235`m)8aSB_JN9~RZK;6~=8X;k@mR!{ud~_^Ms-FJkUSELK zfuGsk1sg5Nxf}$Xc-eysVQT$&q0MVCJ_fngaf9Q?82urNua|h3q zT9~Y6RWlCYvdF{_L&uG&`e83BvTKmmRD4|#bc>3XvZD7(MNC$6sv?9_!}L>1 zXK{n_x*~;DEy}A%fx%NP97LVsTq=b+Lb3u{Cp!!}Eek~Xah=geq0|+LuMj>v(L^~TUu^+^yFy(^Vek5ar=xt@P zTGZ`9kXI8ODiKO`TbCM!xaCyS;L?mraX50Wm68_uTjabAp{%Kd$!fQ*1m{idO3EE7 zDchBlXH>eaO3J#D=SU?-v63^SB}`VQ%#w%fcxbj3?oUAxhIip7)+$qm@$_d#XZynS zF>VHMH^#V`;e|1-`Bx4Ej8~37X#2eD%?71m(Qe0||? zgq`69<#w#J42;!S@8&zjoZrY;=QNK!!GqY)fNNH3WWNX;ixL}#uSQbgrOxm*$jh-R z9CErA>F^Es2>vEb3g1q^^%md*1l$|}LNxs{Uq01JLFu6RcNF)6f8bN;pzIt8v3?6V zwM*obcp{09*Q4#rXk(PDFFKgTv`l>SBUdb)e#G1?(Zz z(SvQ8Omiiu23G=<@rM40v}U8{A7O$U;`@`Mny2)={~YF+Y;zS$&p~Naiy7xcWVjIJkBQ>^+k+W}T(e7R4DP0Wg(R*K>t zm7E5oI#b>1%IyDuxp$It7?V9bp|S-~Vrt`Tx8INTT;a<(CCnq(Q^wR^3=lOJi*oMH zZ{jDJ%$!o=Gqld{L8rrbIcbM2$ef&@t8eaZg&@e~<;Y#R5bP$ie;SVAr)V)wms4DQ z1jsbH3;EGQVF-as4E&P8L76oEo3E|7GO`8kWpJPTFp&R&I?-DX z>R!2Qv+)=KU8L{nkRS7_t9~I5S|~1-Eg^kx9e31BA7$k1Bep7x{c;)PUC*`A>co=C zlLNo9Y|^$K)2aooK2asY_4eyCRmv7}^16#Zu^v4cWN8EH&h_MVyzZM zE%vO3HCpfj(CT}*^gEjY|8p!e*H^2{q?LhJ-;B8&cT{)VOS_D;X>b7$mh=jm6^Ef* zl^pjnW03c7Pe2JQ2-LZeMeW6N!W1Db1;uvCccEzzuP*U?(t4pq}gkSgo*jOlOXcLQ+ zq7)LEAdBK=+!eSl=)n0U<>@-j)E#dMPFS87Pf#8$Df@G9->6I(Ra=;y7&Kj~4fMmU zxUqA_CA1n#o8*|{9_#UR2B>QRHj_-6G2iKcVX`pef@|fXoChgkdwVUATBJLG$X^fd z=$3N@Ikw>q&IG!k*WVmP`Pw?Jd~#})oma#A7IjvVa;Wj0bzTV~%rJJH^-WeiIPGyL zNZKHMr(VU%jR8;`+)8aDQMXma0R0gXSXh-@G|cwZH!Uhjtd&!ToyC_f5BG;!chH^j zp4MWj3+H_Jjj->j1UuZ1!22#D0QLX`akASZ6mEdG*hN@bOAsHtkj&5^Lyt9vz`5;4 zxXE+Z&CYMr`G<5v?g2A>3r`)EFQ(ALdPqSp_GHEq z=>UR`eAzR=l0@rB^}M%6_SaSW#}dgBhHFN?7?wBQI|`!f=e*56!D6YszV%!L*{aE` z!}7y8xv?a`z-Dbjr(Z!4|1I~-#1d|X_IuUNT)8p}j?P*F2k4nIfg zLW&xXN|*riG~q2#Y(@u|JR>Y(s)#jP=dsU7UJbM(%erI>N-zK`jz1TebMQ z7TjyKYssM&KUqu8t|d34;#;-kbS-a?T8?DPUm|T`vYMZ*;#k>XpvqO?T0kw9@-$G_ zB9U%k1}RQ~Nl0gCikabx(<2_UNU=FVp#oi5ZZg2aRtb0E)VSf^)8>X1KfM0Ye{Q*PrcJ6oH)RyNS4OBO>krc|~jU0}2KhAd9 z<*-x{l8na6nuBcR{)!~fUaUioG%!g3b~(;H9YOAzU2TLI0FNRi{ir9;6oC{zODKma z!66$7SR@RwBPxZ4MFt_dwo%;Bt0-7ID5Q~^`y!zMko?Tr+;fg+CHPbE9}W@L7YiVkCd3tq*2A+o1jkYkd9C7)`!&H%t#{}_DxQl&n*<>*N~I6K z8BDUU1$X#pa9`brtbYEJc?IoJaV%O-C7~Jo!sdl!6^X=3^48O#2T=uZEbgmSL-vmB6=s`bol&P&{h$8H!xmlef-)Wwkxr#1EMi3vL$Yl|f z(1@P1a z)Ei;m&5WF=WYqV~(E9>M#PmMYqp&!i<2BzSVoDssMIp3PksX(!8ts1n=(EA8BtJs$ zsYgY+{k(oitqj4`77un8?ziVI&Op#7?45$>n?owo=@B^I;?aITBQqPCujRmoVe^9! z((GN7_?s*aRAOw%9cI%!IVXUdO)~Syp3t`S;E7kwaNd)Bwvxu?WV zksn3@8deApaPe21E18T4q0ju7XM(d1<7{Zb?BjVEf9REXUaR>Lk=V4Uo4-NkOo`|+ zLshH=aKd5e8W0anMFwx!nTD^e!>GJm7@Pb+^PSXMpk4&U&1Zky}_(vKYTT!Arr`))II9 z8Yrw`InffrDK9rAGey-QR^hMO758hma~6tBLw&0CaH(G{m?Z2Y44;9QG_r!X?XKk%tGY&lQj2I}xE64GX~ za>P2TAf9?6RNFdjwV07Jc_lxm>%a+CE(o;@dFhpMCa(^!(XL>~IC-ers)wYUTJ=|b z6Wg58_@j_jwpXka{iHaGnd*+}HqT_i_hp)&RYtYi!?ee-r~!Ni`%3WY0WVj*luFl% zO%c(M8ni}5t{hCkNTz1mbm9i8!Jd4#wRj0Cz+;lSv3O`(jaal(iP7H9drUh+w|C^} z5EWm~P+uqWtN9~TO`GMu%%S+^UuROUc`s;PZ}^!gIKmI4$x`w4hRIi$n=x>8XGT&d z95h*Q%_HAfFYz142m751R9d%0W#o<&7~41=wq+sNe+Q1w!Oab&NU76{cSWEChs-b51kre#Yx;!uM2e5cnBKC5&sdvLzOmAvq%9B%StiInBz4dOW zN1XKbmk9c05-JkzoqD2Q>J;Uu<2{rki7Ka3)Jw&=59NDlm+GwY{!%l0ueQEh(j=}O z!Yx%7_8$p?ch(T&Dv+{3s7>z>V^=D5Ic%@VhPtE+VCVqci4~PT(g?D7sE3IAX*WtY_~klIm^Rspc(oTB-}oc zJl0asL^0mu4Sp(4CEnvzfbC|J^b|<1t%OOnN!st=IsF#YrA}zd7%0m<-5UD3rCUrxy3@%NZ5rt0{9Fh`9-_R6WyZrrq!<9?Sw zDx_)VK^JEBTrKeUrEDJhr`Y}6t7anFs}`v2n=xhYRcm@WSteBzP0)NY{BRpw2eZ)Y zd@54>^a4>S>_02d2-cyK_ynAHh6&;Kc(x2Kb^>R+q(4o}06S}9{ZnlIR>^Rxi4R83 zVC(T#hu;YTdLaPM$mjVRmQEjJ)Ug7##)hz5DPkY8`7nqt#EK)15Hd1Z;?ZoZFtBju zAXYUh0N(kb!UGc=NF1P6|Lj6vEZtAU00rl?XE{XU9RmTD5=D6l5E);S>7VW%Hl*>>{yF!$?+y@u?4ndEIA7#C}U}450>Vy%#6H5D3#I_QcBwZ zp$!lqK*9q`KcJ7Yl=QVgXn|J>g{GxITkF8UFdrOVsI`m(IYI5t08_)VGvDaJ_n8;d{@*OS?w%VirC;a(u{Wg)E+tRAc@} zmGn7gj!HJ1+H@Fdh%V;kS+iJ>((kKMmat**kV4VLyCrYajT9>|rpMVwDDo)t#sF>{7><2F*De}PCV<~D-Z+a?HI!Mj2Z&QUI1 z5Jy2EvR6F78*!{o;>4qItXAU0qj9WL;>4qILNwN))Dw8@6UiqY%}3HpoOlq&ao>+8 z|AiMwPhn^EVuoctSDb4|8y#L?P0oGb5v8k?RbC<<+B1Y-k5{hnP6zqevMJlLem_@9 zx&JI|$%r6lJF6fR>*Ku;uO?n{Vx~S`a$*J%#V2O!dt^TPLx8T|(kN$;afTuHb%ezn znSd-ypaS01ryD^pdcF)Xl!JGI5zUJdoOwd)kBC8dn&X=f2~`ZNYnC?D;?u zTma4^L7I0S$S(Xqvg1w==s}F#aF7O%aC;-Nfgu>RNwu=}B%&a8 z7^R0Nc=w9?j>>AjZ){q8I5$%%)UyEp3_RuN5|o7S0@%)2W1Fwq7piaaVFT*-AVQIR_gN0Far0SY?)?8D1b8);jNl2$65~1^W)KAw-=Hz;BAjWG4zoHO1P&C97IH zI0ZMx#Wtet!n+w)N!+vK+_18^l`8@i} z#;4@+G#j{Qe*jirFy*DXIMXU84nE)^q$U4EU%|5AW%LNT6;i!=>wM(y>G+b3?vsy; z+Q3UYK5l(Gg3-Ml@3heq+aKNp{*uE)coVjoccDyv&W<6Nqea zBew@4TiwW)9i;isHkB47Th|>2d%buYb*FrtOM4C<4EicM{u&Kw21_>k_NB0d;9W#c z7gpD=Yn_{~*C#e+UIhl=#s=HkeDHhE{P@SsVn6y34DsYO>_7<1Ng%vH){^h(ffZSV z;!s#m(q&&><9*xi1Iz|KZ1Cr8t9YrF^J=8KS`PEVFKdrqR6o}qi?30?Xg0qDzs}pf zy;#ac7YPcJLe3i%fq2XxT2gckCWu}k9uOV+3@em4@n{??mN@ZfoPeRu5PbPU2O(lHnzlc}87!a>!m!Il4Kbd1%Nb&M-fL16mE?l9&Q zt7BL_VRJxFfM!AB1xmC8w1ifxBwQZU5ujO+wt*thEWDG=i7oYE=kj7Cpkq|l5zt=` z0uT)7+!b>{LUVr1aQ9sKdniG*L<*vdBe^i(h66?E6EfZQr*Jqkx4;`wQsM;GvLQm zXQ;H0bA(k$&Arc>bG?jBw4KPn?vX!_(Gh9ih2m&S(~i}0SC_OSzZMhe;v0yEdLN=! zm&%K8qQ4z1h<8U8Nk?$0pzL%KlgP&0Ch8NM&=%h=$(wRlc`=Vlj4Zn3>b(oj#iO34^-fNi!qM%nOBls?` z%XCkc;a|zz`7Z9(Yn`m84dB|y2kkFGsk#mIJ$&^(>~tYyPw~cX@AwCyA@jc-saG)n zg2E?b==r3ti!#y zMKZ1zwuID#NW?Gzse2IE{MbbAEJ!F_Co!wYo%eeAa)1RVLG(#fZ0 z3G8FP0lbPd7A)S!R)8#{hQfQ%dhTPh#fz6iHG-dGYOz)Q9K4HL)K4y3Y*RnSf%8df zO|T@f5J!VXz@UV&K#t+1M{()M#j6mxLEoH@EijP4aUv2(DX6t=9>x6H4H{8o|U$^N7rF5)s+cDnt%U z2t-67Z*&f`{W{E4{zqi*M?2TWUt42wl)1v)M^2bCfDS>PZBp6^>2==M$whn1PNupIUJ>@*!#FXkyo33a zRp4Im_7|g#L3{P<7*8EeJZLfU{;C@%9>i_WwUVV}p8)3~MKM|DoFKW(*Mf6~z1dWU z5ykNB8238C*cn4}gZX(5_kO?zvv}{Ugcpc~yi%zcLuP}QFwlv9)agY4x8GikVs2C? zqBb4WW1`H236+`jyq=6MToI^nVW0RimbTZ+;&K(N*|<9zO-SfX6*^xeI(Iq$+ZDR1{s!?iePBG~IK*H1q$h?^9m&nSgW3!xP&7*|P(*l3REa`e7Md)+d%H7;^?e z%WuST^BxuCC1|`}Bz;*-N9eKmc8U4g59O=GkP)I&!~+Bo_bxY1JQAn( zC%hE*>j4n-??q;ZYOXn`s}_)N8~UhK6;0sr?0a1ofw#=wyz+t2{6$x6v%e;bVHL+p z0;w&zU-rtXRaW<3T^u8dV|4K`;#jlzI3AQ&5pxtcZU>I~E-hchdIKTxd@=6P@ZY1w z6&io&B>+7_&|I5yU+@y-WU-9J>F@%~mRNMrPLBJhF%ZJ}H)1-0j^M3co%%$lf3uAkD@(}|q&Q@$} zKLfasd1@e&e4fmcI_(v1-zqM*Ny=Fqd1jBs>K%ehDQWS>g<1fKk=`g)ANQ_y;=OF) z1ty8K>HI40iq^RyVX}aUC1X$*$pc%fixAfUaa~=6G9tv}4PKB=S5*9LBKFze zqzT@OYkvj7ApBcy6*jLuYE0WY0lTqYdB_Q}5p)sLlU;Y~&?zB~CmV z_W?IfJc#>pc;UAYXD{^^`vAils~Gr-EA;xGv$#|KkR>{WUs%NPlsPJf%*RHu&A;Xj zwDpT0@?gsyu3C+J%>{X19~g>!RhoqN&M2A2kYBB)C=?bu@e3A)2h)UEqwPeGc?zFF|tA$h)(ZuZLv zJaMZfzk`y2ZzPCrC07#2+qYuak&F?i75GKO;g5~ftXYq%S+C>C+>KI-ou^kSu1Z91 zrhYD`as%ws`88n>Y($BGu$kq0FPA0I$8yD&EHSOJ?K6w7Y-2-<7oLcA$!dxqCZb&* za9dgppti3vK&VQXnQ$sY$3N`;e~2KY(|<-2@m-Jb0zGzG$e({TN}IFB6zW@!S-hG%*7@HPc+Gd_W%&G3xAdyYl!zhSFhm+XICZEE=hBNS zgJMFHYb>02Xy&#$tBU+n%quid!_@f9%dYpL&^WClEcaGmdD_?pt^DUKd^JP@E*DY& z8xzR`j|=^Ku1!MA?_qglU8+`oKP6YC@)5%|=glaOJLjcsUfpaY+vGLr|CT->-aO-V z9Lal8F5LcBkh%_M;USW6$Qb)Obq+QraF->_(sdj1Fg9aNsF$E5oGTHM#mDMg8hjCx zR~l>EQ6To0fQawsuH|Es+0tV+ppMW>+pj{Ad+!1xw!?mi6IFEm?@9Q3ZXcI1(5d?a z?Qgd{#QEqUK!je2F~K}m2aU?NUSfMFyATJ78sl40nghAzgHruSv~ixs8Eta2-^Y%+y3DK$)&PS2URmQLfA@Vwsc0Pq@OiawF z`W`FN6*ZR~_I++i=gtC^a$MMWoAWW0v+s{|{yk>v%EcIKZ|9}7)A9Wx&25do8V?;q z8uTjLG7Au<&pMYfN)wD5=!X9ZwL2#%7=aIMMvHhJK$|1>b~1gVjZVuZsp*?*7c zLC_yEL^{$LN9WY{d;rnwasCirz*jSKp!bbkr*7B9`vloYQOL#gv=v@N{wyDW1J zqSdQqnxgo6H;mnN&RS%W>2<@Z9(^_A_gH`ib9|9dAaF#;;h7DvNKpZa$DGed3h}p> zOzR8rWIn|?uBZrx%?A%aCc9)Q?+sUm$IU)K?~^g-k*2PPQeWP*jKuaTicAdfeE`p{ zKZ}r-l&ybY3*HXlu>QdFEBHG~*x-lDNOO%}@swMTu(j*McaEq_@Vd2?>d< zIll>svc@8PiQ{wyo)eBhqP&0O{GM#o-emoPNdKCYcegQKWYt7_yPxf(s;tydZHU<*d9teEX!{ll0@H$8&py|c~t`)cy{ zqp6C#gxhgS#D=L?r2(wJVq09fs;!I!7P)M7KyKddd>o{)a#dOM$qQ6-{J-gzDnS37`FGKFw*~`BwfOsqdx`O z4M|=5xSqnRE0j+)>km-h!!bRtgAdRG>RUhG;cC*c;O*$JEXsuiqS9~D%c)$Q{VQGx z*gQS3B6~GUOX=0Ud6;qQ?xAf0pF9U0@P@z8fv-pWDMs5OF7AoCcl2Y-s~%e??^6O< zn33GB;mijMhfqcHx&0Dx{;H&3io+4-uS?Q3OgksuY7~gpFEn*|>1ip&IVobe7jszn zlRWIcx+(*|=&mu?RU|`DKyrO?CCVSE%-`|_b_}t17w(|?F zHd0!b2nrM$!Z`B~_#cXZ+b>Z^Bbs(>HW&-Ms~fUg+92=c>i7;a=!V<(mupcGynm(A zI~)@$m=(IBbz+=Iv!$K5ytVy%z+qK%bY{N1%+iWQ&ZH9x{k`AG*qnuBK5h* z-$O#-D|!JMaakw3eT|ss9|04uuC0-G>2VgzC)MkV8*&h<4eaw^pRZ27%F`5+nFbe? zJkCkxK4OD=OcrpkG&p;0xLr0lnQ|S^9JHYPH7N9M6x#Nwc#)l;X~$LrnZj=x@{S*@ z{`u)cnZwvv9CUjtqT=&Ek3jG11F4L_?&Oz-6&$ke~cQLamJP&JUn2))}a)DYhP;-1rB=!tLW)8?!Ve z8nqr<8`qPFVLj^Zqf!<@lwVuVJA;`>Q28*W2Z)7#6voOMmk8tD*dY9a>w-lkV@NWt z#}_$j_Y5<&ZqFe+?A0@JP3zOH7{uo}?3J>Kh0%U<@W4TQ`H~;^_;vP_{iKI-Ev{|tT|jK(>Us7^uM^C{n5KqcZ#J%y?rd7K zzG-a_jSh`#8rKFow6U>Kx)OJa7n*yD?&Q{sDE>QD2ujX}SHLp^B>d6R-inW$Ka7$5? zFk(NVY(F(OHm}bOdOgyNOK4?=YHZ$^dzl}-sd1f+4t7)%n%LCX)R@$c+KrBKzn7wS zSRS|oeI+VQ)B5#I8+yi3ainpBwse^tvaxZayvowJzHy_V?Mot&VY#;ei9D40x_gSV zG;S2}-naocY-q$aw&a!0cQ)c?1f3hBW;<#-hB2@2)`(jlk>v}nqe1RE_v^h3;3a7> zirBf8x{AUS9+5qr7XjV~=Zg2TFs$h}usL>6vNd=UpW{SdzmLjk>>@?DMl1lhM?rA? z4A*+4^Tj{v)PT8E-$fo}ePPyzxhV#sf zVY|Jb-QIi$HAD=o&3aRH(cD#hV_}uT#>PM)NpS*F8`~EI#u%PBBJHV%r_XKGu zx4{MP-q$L4Y1V&lPD z6d-qskv6gEAlicP?ez)Sy0{rb&LlQ&ck8)#Z ztEZiZoqnXMR=pwjbysA?Hbxe9flgvHmZ2{T{M-+`44ZQPE!dmOZo$6HKPw(0_q2$kf8o9@xMI00E)pxjmL z7sGL12Wt<;H`)=y$p5Caf#0Emjg2$F_4Jcw-V;Vc+91gLx5)Tnnfa?R5_&nF@lip9 zMI*-fP?&z~mFF;1>cw*SIu#Z)u|{cG{yO z*bqQ&1$;fU>Q+G*+~ZnQ?mz=@n8OjE@&OMf%6&}`AM`8MpSNe=67tPoK!N`I2{3O> zFQzJds*~$kUEA)ZN?YR-8V7o@ipRxQk;VT8a4^Szi;tSczu^O~O@A9t^e5ZGKIM=0 zvA3ewOVK7C5od{Bsz~aU+93Z3LHw|zir?>D*&JG6g>uD#vjAL?%ZtE*oo5^CdU`yl z^H&1Cz0_LraeB}SE%=)tj_dT@+~2?_Dr9*pcyk{mk2(2e(g$pie(Pc@fagwP?1mQ@ zSwJ(x&Sumr`jdaFK6pM>AeGNHz{oeBgGZ)-Q_R1 z72w_Fk_zzdvR6SOSV1CCK|))Q`!3)p4obZ|MS|^vkXZxL-GM#;pL_@Ou4Cs?Sdh2& z!1^MG02Y}fdt|Srs?h`)#&UORx$jml$E5OdFV}M4t6q*t<>e-{+}~9%$E5OdcWJqQ zs9ugq<>gXZ4#zR7(S=FnP*@^Uj;E?&JHlgi7@YB}g&)$n9euv}F39XQ0p?aL5*ct#el1o6VH zi*0<|`xIuL#ZBV9Xa*e? z8`Qs!{(AbW03=T5!V9cL_R?~fO~XcT7;te)j!8I-prFHxi|RLR>YLLH_b}?SFJj>UtiEs%)<+evG+;{8koU_o<2^m-2;BHdJXLa z_i7cWRhZs~VqNm1Q zJ@F&W==^ftqi(SEa9*Yl8s6 z!6Oj2PQGr1lZTJf&!M4SU2)4h43IZ?>4FBi;HxXoT}0t;`+U{@MH`7ukR}oi(1c;o z1Slv?Bt1YAhP62$D%P>itCT!J`n(!Z5L!*h$~EKyJ@y1W?|O21eI249)SCIIS;Vzf z6h*iTdw~hKQkMzqoR2_F7o%8sfmu8_Z?pTuP~+V*Ns+}33`7?<@=>$636JalS9pP0 z92kzVf?)=LmJAv%@M(w)FEBqA(6#{YCDk^z|1NMKZod=O`!nSos;1LiPh5sFV*LoW z|1omOUHKRh^vk_~?Z4vECz2O0_~<-|>++NPJmJyhYJd#4|C%kwGcQ{ivu+W#w&?Yc z)qIxAa!KX<5i=KoE7n1C}dDO?me61T*dpWYP-x-LK;}rh48C@Fr zydxW2QQ1jAM_&)zSto2^Ou$;A!Tbus^Q1xGTUoI!S3A2gxM05Ca9d2iB>~Uv4$NhB zb!sHzB8gvJlQmajgS{+aWA4-AZX6DXvJ!uP8tbDC-~}y#E$r)%s)3eVtCye)C#8$p zW8NY?O#4q4aOFR6CJU>`Mu6?o+Ddm=HI^^qa(;giK46AZw*(08=dQ)|=2Z&I+LHrt z!?N!s@9}aEns$|Qpp$1K%w6T;%y)x|n_9e$uaJB~;Qb|!5PW~hBSb7f2)hOrytzNV zuBM$^_~^5UeD4>7BXDov%|8V$-m2KGQtCXr@s}PxzVGw@_N}%DetW~4!>2#fw>k7L z(f{?^uWY{N)D3Tb$76@zJURMfgUh|pX zd&{SW_C0y{uC3Q3_Q&o`fB%8d+xD;d#ci7lulv21pZrf>e4=CVp}qgu`@PNou=>e$ zzx`*^@B8?dHviIPzwni(5B*z9;cvg$acJyChe8I^J^pddKG(T@$M&5&c6aV(OpTd= z`@|6(6do(>GCZd2w`p7&g<>h&wrEUim>|UU?<_hi05pNc-0>>(?5tI(%|?0O7<} z@D9i8kxoTtq(3z?X~xaqxzx;js*oO<&rTLHPS%S!p30?W(}i@-Ol0S0Po;B1PHr|; z7|u>RX77n~etxE~|LnxXq15DAATyLn&rF#^V`jpcBbdC|>jB7@%@$6Iy0G?8N4tDy63?(6PfHp7BQ24 z)XrVT<_5JYrT4h$lTLOjL)I&WSXRw$uS`cTL6&9c>Hf)q!c1uq?c7ljXfJwR+x`48 z?e!2jr7YT)o$_hJYAV9&=~rViAmscp4 zo=H_2x8=aP{PAEps60=%&k5D@bauM^{`@QN_GytnlbJ3QQ?C-7?%m$-?dl};DrUkl zEz5&lT~#yn`kA_`W!kyJ8+N#$&q623%*|j@DaW!L_g$SnQF}<#3Ry52x}76aMTIQB zeE12g-|5kHKAXywjK*rPcKITrTjrT+8F%mS$k^S%)>X~e;b#;st(wuFRel15cSFOl zB%I4-X3H8{0&2I+z+}^TDoX zhc^Lr%UCHZ)B|nP;#a1ouvg0qK*6&Gx@CA($l>*f>fsf^bbFaHQ|W9WGo4B2Dp$DE zt1y*2JwJ=g`6?N`!DO{sW)l>8c6&*p9s3EsDyI6SpVI5ea97jy(t3T~r}7(!_lBIP zuzrFs6^92H>$kZVy0N7vmGhEBXz0(@J84g~J(|fEdUtuP>=uDjlDyj^dBv_S&0WGe z9`QSN_!B{K86qFZ*5OUT$|=F5-DdA#F6ZRR*KT{M+?Or8Cg$AbV%`i4_3fTWJB2aV zH*I~hnXKzeU9i5?bH`AEd zv;dONmROcH0=^hYpN65p98%4gF;INXXbyIY!XTAsa}*2LbPh`m2_4R*k>3kyqOq|? z^Bl`$v3+uU2F@{OYJSEs1DSJ%#)!OI5h}1%vO4R<8UVFT7sjZ28tFv!p3I)jI_IZ@U`Ipa+2xUg#n{_X78)?p^5GGf%htZOj%fhra4(cDxzM}cG}&ZTo)c$-2logR0v z%Ew}Uc;HxS&diH{1dD!HDyGt>=1&_A6*4i|7bDMDmUTyj&-=(fnIYT}F&r6pG!|%f z@dn_LR2Hn7Gr9Dnb2^*32i`-&<74LN=-~`i??6kBkls zn#uWG9+rhXEKlI}nKWk|lh$Y6Ol5L~i*9frouABQgy+oUnas>oE}b=*?A&|-?o|4M zS}aT!Ej5#7CIgGq)skynFa{>BGA;Poz8S$Z`%}gp^IEGkIItw9gP7L-9OdL8nG&FcZF>rAU#(4&vafhZg@&>BS!4OE| z++cw%gLbOa4Nbn@`T@e`xtqy3{tC*0`1k@2G^ZXG@G z;<1T=VVJr`PgoL+-+mlaA<<4A_xfL3t4Wq%#ia5mcWihh2#5wGDO?Q7jJ|+5wq5mw`~Sk$IDIFes&q z^1{Mn1xQ(CZ1q}b0s?lna~WqoF9Dm-&mp1xl{%GoX66fNCTq-$l;QBEbAvRGK$1{>|jgX;_}Yy#rQ? z1V^xNycH|b>@jCP2kWElv{4AO9F#Y5=~M>R%G}ggy5M?8r>Fb1bH{0=%zKD}B@dtI zJ2oMM$_)@x9Tq+#4UY^A;#^_QA&NSnPNdK0GH5s<3f0hzX=i4}IZw&p`J^|FI~f?F zbIJxMAoqaoMH!Z&Y}sK0DnpdyFJ=p=3#x>fQ|ML5S248<)sLlT9qo4j&K1zCoR(Ii zFizx_A7qvip$3tG|LDp zIyc8jo5~$07*X?OnlTe+Qu#AF{W$(iG)o@G97UlraW;+lN{h^Jo&w8(YUePg(4IV# zI+X^O$in~_d9E*a+UNfFj@mxS>W8!E(AVZr8fudD4`wlhB=#2KXimfGsv8J~t61wDgl&5c`z9DB zBaXra=IGUeyDgD92i~1JbWwGM{J7&P59454*Kf5AiBc6K;0-1ogE_>EI~I7KDB6Nr zV8_MX{xOHsg=0>>a2&HS?75WmrXPA9g!)O&vZZOm*dT#C>pzp8JS$r_u#8N&z`VVr z9Juscx;%a~Tb4Cg-cux@8x#TX6MP7M9I5Vw@}QlCRFnq$zApzI03$Dv;J+1(JSDi9VN{7n-E z53Bqea_3LRSwXINPkojZ&?I`q-0k1l<5>tm-rcIjic zK6>=gD-UeW5DLsW@=z!+rb$SlV8c#A3I&@P5>hDGv}34Sp}=-6A%z0lj)W8nb_^w? zP_UOMAwuEC;jC`<&0-ZW>uyHQ>K5j#-SV4t4KQX_CeT@wvb&$Nx|cayvR63kZF|lZ z?<~$@S8~?QAtZb8a#zMp6-d+PAcX+DOJ*QLS!;#2k0l5JPli|`9!EfeFJisI@L3rAIe-v zPstoCu<~OUvy*3X4p)3rlD8jw`vt(8yNC&od6?q_72C0kdDOVQALaLDa}CfDPW9K5y$qhDB&o46f-@JAV~OFDx1OyfqrNSM;&e; z@F;|2?3Y!&8JM3Fy%|r6bCPK!Gb2%wPkh69#F@USDN(DTBfwUYmZqG5s!S}7=Nzb5 zoKgt^+%GF`frhGO4jKbw*Uwt$r&{gC(~o!=CX5u%As&!O|f+~pc# z6h{D1&j8lXg|zzJRP7psz>pB4tj+q|917nBqM;LMOiYssimPp6FzDQB z$32UL8J&ib<(waPhO?71^O(d(p;aGeTLc;QZT}302+T8i7-q7k3uj;| zaI&Xwg;JY`+NEfWJI8@@dP+k~vx^t821#E*M4Tbp(b97)l|M@&%Wy$X0XFU&ad5ci zG)9K>j&=%zwlDI&7r^>(8UxGn9QmMXZ4ERGpNQt1Ve#TPJIWCF@ z{VcQ=Llto!79T6{u~eVe8j;aD%oryav1kA_NNP(671<}VYQ;)ViRc;B^$5*dJnRJ_ z$n#cgC}CjCars2pm_DrSi{Sha(~f0CzIpoeuxlODW>{01teXM*pDG~kE9Yi93 zn4jhZn6qTo>zhF@PhA90LN8$=r5#db$}7n%%8m>HNYP1DYvef!<0>^E7?Xq=7Wa#a zuEbM)z^EC68Ai?&5U`p=S@INYtV3c%5fuCFdYwaH?BeVxM;dB-&_*1e&!5pEI#Q)y z*=~v?%emyBK+sLqVKjC&GbjC}Ty!FpMdyQ_EKt;^mf+@SA9Ci-La(6F0(PJb%=ITQ zi>7dtaV(uaYmSbavH4S2Aac5A<$*ppN~4J-lJE`3i$8hG=&?h6h=Az~WpcFItC2xE z$Z!robrW_z0fkTMhJe5<)(V6TB;H!hge_<*Qsl&^aSp7!#24mWEk#+!7!i8RGoGHs zED!Uu1XR9@c#vFy@ZofUD_NZ*C3isRc)b*u2()5grG#}6(vXXlpC*Da(80m5Yorn) z3F_kW1R|p>EeIH*UNy3j5;N;Dm@!1^6B)~m2KH^y^^W>hQrXg=z9%(EKZ(qzN>~ij z+?tv>OKCRl(6)jR0{x1mZp{?VoXm=?i;9Y!OIUAJ?3m~wp`+1SeV{*p3t>WYM?9<( z?v9Wb#o~R^xqZ?-hs1vf95*v_XnuNHWgBtxiEe3N$KKIHhQkkP_8c@H!gfX9 zSOFHobEfayX^e_lb1TiJDtI}}`mFWYvwHY^q$XaDPgrmTI>sa?a_DdsB2Qqp;FuV* z0+~a}7C`gGC@er^h}noT(=afSOxSqBG>!AeGc%_sNmWaR7EcQ>(m0#-P1C5W{zGX@ zo!DAY71(BH`?%OBvlSD^$_XgpSK`_x+?a94-K7QJQ?{H)Pt8xl20ezrOnP*VyRVqM zkEfx(QaJUe3ZrwPtpVCriAsRP{Evp|N@m@r3Ay#fHfg*_2j-IE& zatMC2m!p8Ju>aJ=#10K|5HZ-{NeX5Nj7Vk(L>;GSbh(f0ek5o*rt(cOuMLBisJ^4= z)H$nv(ky!#e5FQNiqI4&K6oKLiTOr&S9NUeAI#!3K^o~PD#U%TNkfvdY(N@OzGD^Z zz;33NTWgX4iia)&ASk9;w1ZXLbENI9NcMz5BiuL5xP;zUi_i79{`L&e9z;9~(y5Sd8~9{3^u#6(FyrbOy|qHG}O z8BXD+?Nm0T8PDx;Y?Ffnq#p!t99&mgi3bhYg`?|2Jn<<18>~>~XJ%jvpPd8leUrk= zB5!h7+^ae?obQ{#Sw>Y@0tzo!UuN(VqSZ-u3m_148Z0yp>mk%HdPmadWf}4!?C-ec z1Jz-WYfqv}hafg|&J>@n<&-f!s?I@wl?5hEue#t=qf1`_3JRMfz`aG+5E?6b9pE36 zLjZymxMl_xf$V7!bTYx_Iou?XDw;q6`N-b7KxGrT#6<_PT`nWjKX?Jth+5U{;Gux- zPhpu&29fNL7_^vb$W9RhUL>$nrAppC**=BY(@|-oCl_dr)h$4gw2(d=L|C7|CrmNz zzN5kct?#Bd6m=NW?pr6^K;-5bUOb;EIx2%x3&kg649>X(55i#kXi{E2@hi+5oXU_j zKnAl7j<~zKS=h(XR-XmOr^Mb+AojAsMMr zECV=`h64BBHBXEU&GIMdVUer%p`V{S&5XY<%$%IBx& zXY8)0na!Vuy`K^}aLA({`)hgO)|@O@T*sK)AH(!$!EY5axg_wCKY#kOXZwVrV~Xj&A@9(8Ta1Dt5> z42(C?okZZ0y-N1cg*5p zRpvO*2+FRus;*_+#Z~corVkfi6fZg4MFn97bj!V>HKg}@uQ9rN(W;{5ym)UQxCu~@ zir+?))f;pvovj8OYE#hHbFxh+>b0Artf*THRB$(syJhH(0pVGnzmWh|xcOs-+1r+)5cb@oDb6g+Dk946=ai&l{7fnoSJWL! z;j{ywx?$+FvraY`gRS6VC^XcMVfGPh;0p8Gr5(*!cB0e)c2@^PuLyJ|1vu5M7|H$y zzNcZ7SpWP^b0q*PEs7O$CuT@H9x9~)X+L@}m7Bp!CooTXl@cY34Nqfg%j|$v4jYEX zZ3V}0K#0f*KEz`ZwW$(wLZ;qeOsO=uRnO4*M0YDKh=d`@PNWO-x$M{^G(8?B#(LW` z?xv@35VxpNK28uuSi<;W8tt%Nf~q5^aXzz%`6)%FVxKG)JLzVU*BX^9GJzPSktjHs zNo5P+kwCAX%&LOmca(>PyT^GFc3d0|wgzmNV7Z9&u~B=sZlj@zeu7WLKz)|?`f(7B zhq~phKUa&@29(k`urcSu#-zy_-ScY}s;os6e?P06R?c4R5~v;i5at4sgN>B6WDvgv zVWWJG9K&2i&6YiD^ALMkPhw_Ko+13wHfbLT@1XSLS=oOHKnP->IEf4)9ZQeX;3Yot zWBI8XH(|2kd&ss_r872eLFnA2M{P=yicZ{=q+z4ZpH18}cfnqsQt23uTdL$VjvJjS zJCx(5R6CpFrk5Piaihyl>bME#$rG0tgjOxYn-= z9gls?%+wsu3X6@7IC_+FX{jtMTIBImCI`HR)%3^>b&WTs{F)ccNJE3oQI&ScI^RUb);(|T_Y!IT3GC#-t zCh{n17|Jv!=pY3$gVT!_R}!wxP1)_w<89poz zV43cXj>GerslEcn?I~LCZ82B*2ixJUmpQDu&SfA`jE$GVh0H0Kz6%$t7G^F`Am^3t z!^>K;r)DmWX9_rYHlR6z}jWrA_EBXLNxrc{CWPZ%BN^D@kL(!N_bXCVyqs|U?fjd^XIK%!W@3>23 zB{Sp%Ck@zQ^O#;|GPv0&f(!6&9XDrSbp*^lq% zvBX{p?X{t82!(34O57DT?gq(sy|~wi`$}=|r5oRC6vBQZa3fcso!d+(g3FpBNRQwq z^T@Rbx1+8brQCINBQHbvPVwQ^=$$8l@j0}62JI#0u)gB0HeA*ZUz?c4?>6)BXAzsm zjmvGknLN&Sd2pQ++B*sQs4ou)S&4&bo4z$HkrBu^)s9j&Z#-=-0KTc8Mw)}a9B#+X zATR&$t_vuf5?E6bHgV=c`FeeJ@Efx6ImDeuTn^89)Ha2hi2>f~K&p#N-rNm{1;kjK z8ev(M{A?rp(8O8W1$heoH5uOZ3YT#Dw4M9(*^aMCw4qcAmR-_`)WTbhpg{pGxrlHF zeks&&8g-D*$S0<@&!y4<*Z0C9*_Hv4`d&CBOA$a)-wTAarXTGL^zvYF_yt0Z_oH9I zSNrt&LZJ*Qr|r|{3xrZXLu$x|MMHSoO5$uC22I?}38xqdIyH z=<@}`sn_x{`ucqTbHl4RCgR6+{2tKfb3>`py809T`0w}qFBo3!m@7jLxW4CxRk?*M z4;ivgpDz#!@UapM_^9s%LW++=G7%qrzCb9Agl6Vjw(Pp}i!$&9 zHDstoPeL5h20(Rm1-lE!U$MM6g=*8!LZLUT6osmzQ%<8_T{)zRyQi8kTroZ>r9}{- zAdiKXRH{)aE{RuUC=d9$KaaVrh-O;9tgsA60Sssv~6YRFWa z(^nFi=P`3#8gzVB;%9(1m60i?&5Cu^PqDze6kX-2S=G9!;;L$;5Gn4W6+>kn`pgSh z_Ff9AR9-p!hX}mNs1$e6ib>yKwbfX+qLOtfI;k2mrOLw!%9zTX6*Mia;H+JZKJF;1 zvZh+euJY-%g2)8*-D*r+Q8B+1l&OYHslr}mfp;lTDjq-8C{%Hsu(Ifs(`dzHPifWF zsI+2y^lS(Pd92C;@6vSKPr1Om{*o;4UeHqJQlRpJmoh7fOmGsZBBL)2I+a%sK^3gx zyuOmi6w_wK(D^BrGM9ont~yao1Xf%>tP~=}U9@7TyuhW*rJ#zhVpZ#)imQi}L#4Qj zRt%Y7wbdxIf1Sslb16^>&Qihd3i40IsdOcg2}^8yz#D~U`oZC0$Seu{<6rJ#u=QtW?Qkhj3C>d0Mp?zFbS04q zO71E$`qH5D0@n^JiA*tVR;;UjinYU~ppL6fRAb?a3j0bSQrtx=hRO?EJ6sB?_$pSl z4yw3zSUFURyJ*Fb307N;GAlTwD|b_Him0LiUW$&YMw{ockXcD|T*kczw`sF>hNt8VdD7;~UZ@%Ra_S3fGh5Aq}Ih=Q6n2>4OD<{hR8>;r>&ZoV& zJ!cg6=fJ;uFEAN3w*m%2wR?f@ar)K_BW4`=4$DnD26y-zMZP}7nbl)(PZ;JnY)s>T z#10~E*c?M{Q_Iwo^r2KA%8k)qGmM%{?FeEd*XpB)9mgMU@-g)TD18_|z>gqz>maD) z-lH`JN(67wGMDkzt&H4|LAnR?n#LoDxq!NOmla=@HZ`{b0~5d29KbpVT_J2eJI;--urnfAp_M4mWSamPw*JLKv)cuN3zx zakq+ljkxWGM7a?qZouz)kRb$Og}?|b)gf-DxLqdH95US&cDLYIXLd>#u$AnPO=uIb z-E6x6@vU{hD~{OBcuIFzJQ-#kJ>sHU;NK(e&2S0XAZEYB91yn;UGobOso)A!$mU*c zpR5$zhg;x6;OP)<)v1wuTBVY17l_V$yDfPy7i2Y!@t529y(qsAem8s&VVAUr;78t? ze!5F<44GP6=#@yw;RmXM-I*y2AR#a{fhjVMZ9ns+@FT^yTcmbaI8&B_1*Fa6H-jIM z)ATT&WZw{mf-2)D<@3W#623aekq@zRWbkB33)GO&>b599MZkQ<1PfGoX zwu0Oqwp2*iCr1rO%X<7a;I|P!7UihoNNdH<9rW%$fXQOi4-rfGy7;LFRR+#2K}&E1t@@RBM{nEstlCFPbrd8?qw z`#XnGoqMMzz65{@itn}33!+FWmza8o70pttf_G-}K0cCxw_&lgzB1niqE>=7i=29^ z7jL*?BYF9h-a48`459EYEW+bOR=itFuc+cY&yK@=ea&n-Z_W&2W+DfT*))g}Bp5zu z0BBkKP74%sovt7Wk+Cy?OTXqNLG=bOXjJECrM!z7p%8~G^6M>KBro+ZQitXB_S1Ig zHKU?w5gPS2-hiq1UzXy^yTDjGDMY5Z2zhDxxoB|T@jeS5Z|`Jz`sUG&GYFBs3{m&v zO=Y|f)W<4>8T%&WG25s;`F)|6e@&v*ZaWSE1AHVLrJ+4VZZzgF^+}~Lsp?)BrtC!K zBhGqL87~#nK2*4bM1H_Gs*LI5KyX{ZSi<69%2*t1zLJF}i)X*^VlExSCBaIpM zwcDE!Ly839kPdnuEnOFq*{3|H!;z4J6lM<Cn=p*0+Q?#-#-i{T&* zN^$&&Ab0WJJzT!)VZa*4Q5QKTi}6&--MF7t?&?#qMoK<=ZemB;^A;>^jj?sQJ@M@2 z?b_l7#q;@;F};=Bq#Qbewy73hp=CE!Dyf`VkrG(%@RB5Vgk-6~#<|)VGUh7wBSk2A z5T6x8PM3q`?5HstihG;1It>mmjkD4#Zfg;9mBtkJlk%enZCm9$#G!a>iqJlwoO=#6 z`Jj+;E;+WRfSEy@CWjeWIn)eEG^5cj$*Kw@yMq-9pt4^uJfzuCLr!v;mEMkqudx}}J zl#T2`Sl6pV?8^w&9}zz5(64u3?TZ^ZBde_+_aH}Vtsj!BwGXMhSvUs@oB%!y@xGWe z!e+IOd{P!Twzffbatb|*Jme7iwEbB3)RS{4$&gblIfTZ-oxb2H~@-W|#^tk37ALF6vh8`=Z&5vbdABhvMrP||yb6i2(1s|by}iMH0f z%p8R4+9ht}QYdmKS~mQ zq&~;pDY(=4V-LvqxVu~iavb@kS(4HrD>!rHsq{JvpF2`Xn;huEyp{Aa-YZP3$ss0k z7J7_A)T>Y_tJ3I!%J4Y${nEv_h3c6~sJL&pHwcq6eQ{oDfob$26?f8|xL(8)OUGJw zfnXvFkSnTV?t`w$yJbxTzb2pG6(7BO9{OO{5Zdla)Z><_zC5kOAM7*K6Q_&?1l&aI zK*uA+RnD2_(ioYQwv8a)Ey&}}Nqy)Ed=|F?2ZAGDjXG#vW9`{_ynimVme4;UT90Xt+R>F^3?B3bwp{^>UO}(VC5^asH?cVUWH4( za5X&g8MSiapeqh@6MdYE@i|u1%USh2@=)ryGaP4fSIaQXq%wJqdY4;+IpCMl9)7ku zb>1w3dO)}0NC(cW)Zq0deZA<{)#!EBR|%-}u-v1(do4zttC zVE^21?!>ISU4CwuY35qGZi+th&^m%Kk`J>sxE4g>?Rn*?RK*xOh~IS>jBPN+R?DY(U~9YYjYL3^@aF;YBk?4-aWjFx z4%ki=poTkPj4BRODzZX1y|X0TRTAzl3GXZk?mVbGy4Y8V>H@XiVuYj>fvXH5wu_vM0EoLe{+* z_K-o0CEvc|+k&WjkURNp3$@`;C!?gH^y5rVnW}mX^BfmDHo4#hyTlKL?G%56!BX`)g|CV@Vrp@GsV!+!=0Y(MKZI+?bY7V@4yF z-WqC%Hz)B(ZcIqlcORnzQPCBeCyGgfi>-) zy?Hp3diNVPeeYGbojd*Lzju!R=;iz4AO7~}oqxRJ({Fs|?wWn4%v=7X?V1l?{>vL4 z`Mrm3djD^nU;XskUiYrc|9E!n`}f{*&*)XJ`tHN8e*EEg-5Yt=&712oi6_3cY1N2y)kJ@cf6+$zn&{Ni!IITPF>Bg78tB8MXri#@m?+dU6U8dUL~o)4 z3!I5=qk}K^m}s1iAbvT0Tj;dWNz%E34*1eU@c|HeRE9jz#LGcf9Y2KTd; z9{gF`&RY7?|JQc267FVJsjR~Itt`4k261=?WQL4;kxL?oWLS$d5*Z`{LF9u7EJ_q? zvK=G{f%7BEG7)G~jKj}FC+SF>IKG4x87f&y@|9#E7?qbku7bMML0lV(7kp8_auMZz zMIPkqum{=Q)s^l|P4{fuIn~>{t$VUFy)D%-HMQ;3&fZhg9lf2MyEySf#t8%@79NUZHCc@AG>baHJ7PV>Q!T;k*0ZS(nb zo0FZn*p|vpwasQupDDDRO1I6O!FNEX+MM}9Ti$W9+uKeeTLw_@5!JTB85T*mozE1` zw8{5J_m1z!RDCV>qmR#|QBt7J;Uk*(y6wfbeg_|5bW0=O&njNe7ytj$`EI}&fdJh| z-k%xT`J-p0do2=6HsaSDjzuD|#x{5p_^k@ZTH(zz*B_$r}TXcpzG;*AQEdbSkCBLf-%p~d6Le9aF%bQ@3VBiLFb#%SmV+Y`aDEvVkfW(hV& zO{k$E))q?Mk!11Y9WBVvAZcsi3)6?rY%?uU_*j1n7I!9`?ByTOOtiE_O(={M;Hm`^ zQhZgS&FFfu7A5VL24<$+e%ms4N@N&N$aC8ffB7)GCo>^0?QY~eWkcd;@&Ur1LD3`+y}*dNZg0T zeMDS^@R<1DBkudf{h+uX7WZS~K7pA%1Rpq=c$1+Kuxtz11HFO%= zq+=V~;%w+fkR6L0kRcR~f#4e(!fZ~m2VBk)JyHjFgmqX}*~F5Kw<)ySgpN{A<6X9% z#=9gEu1PLE4YGm6D1tt0lRiZ3U!b!Sg2B?a6O!*ks2<(EiKw*14f^2klABO(3x>y< zwkRIogirp1Ozbc~OSAw6bI3CRPogc-!Y7y{+>)S+B{_ReQ4lUf_Bzmol6~nJ z9LBvdD_oEt6>&XOi z^68Q0QSd1TT`Rkk9(_Eh5RvauU`rtIDHtFiVE9B#g1zuea+CJ)Gw=&dkVi<>kO0S^ z0qhC5VLS+JwXhkk%$d#H6Wt;b^1>vSChuz8}x%n19Tl3B%4_h0tjJA0O!$@T-~CuTav4hFWF4-*=R@g@*B}z$>szHSA-o1 z-iR8L+zM|^1If`EX|2&b5wK1ol8Bp7vbS;hO`N@Yp$8p{8FqLtn5Xe2$=)a!0w6+h z87EDqDFiBno6Op#kks44e65YG%(oh~tX{nuUZ|HiO|v@Dcqal0#)rX427Lxnm~b-1 zzZ%GDScBU_O%R-Q&`V&sW(DHSh!;pT(I#mtt3g>-*4Qd_W2uk2W8%ieCFeG_){0vv zE~kJRYAiK1cs(E#r8gQy$#5)&lHqtfP81mpc7m50tTm;x`sM5yrFUVt;yv#5`l}14MY1u^I%uU41rE*U}UHPngob~ zU@Jy8)G}Do*?#(Iba(wUyu1F!r7wuT22?X_Z3C1T&=u1=qC%npKodYugAE#5R>9Pe zgvP)hL9t9S_o)FLm;#31hSq4wRZH}UEh-5T%Tfnw!Q-xd~)8i|5iZ7eG#*Me(rJbRm~d{3#lwy5;P!Yp5st(|;WhDk4z~z6yR{|) zk|FyYHSutAT?3La1z^q5i~osaFSK(e^d?X^9EP{?CE&hjOH1Qj;dSvfSV`a<^ z6Mfkd#$QvsCY(H?`#H_Bos+yV5w}V^v3Uudc7kiEjYk__!avMk(QpfWM5O=+G>k)t zvY^l~4m2A!#N$xCv2>!0TYjZ@9!1QxK*Re9#d+>;i?7yrsqD4Ic~H>9fV@)KH<X>ubRO$s-sOtu2W#YylXziTZe)DivAzgR8`=fe&wpH!^`C;Jox<@#EPTuSXnm zO9WE@o#A*KvXHpPqnd$ZZX-u!TbpY@aW`0H1j9xWmU#f;HV)GXfV>xrz=O%|7=~py zxv4we7*1kOR5x84@Z@GI)rSwYBxjRLe@{{g|XkuX>b-K(9|g2x0~aCu-w0 zNF{jWZmmZcn0%W`gl!i3wj*!-w^zv z4x%BLs92U*KnpB1#?g0pqIuA=xO%0uB#$&STpeEv0cW6*z6Za@@OwXIT68&`@55Pc z$7+HIKHAbE)I=3RP@(WME-Fs}b<}x3f2g;W-g*{;9D>YwRA~I5HtI16h`W6CW$`*z zEV(dXq+UA9S7Y@88Z?kbSfsFz{t<*kH$uqH zdxin>&3$0IXX?PESVYhZtbxP^@C`_ak@!?X;xRftl)Nv|8{Z`1`&JRhUg> zMmNSyATJ3Bx7PcjBvt}gU_=lJHVI5RhiI;LhzbA5LCsbY2QS5hVU5o-fDmJp3$=By$A6FXK0YIF{!D20od7o%I{D*vUAY5;2R1e)Uky{F=Cr ziTj~LpF+%^ANn@jf0CFViu{BIk4FZ`bn_YWlgPsIJIxZf7{@5Oya@;40;{!K%Kuut3Mv=8+f^WPCVr#W{K%0u`g%-@xAZ!`}} z=<~?=`|v+1p{Jz2zcGI*q2Jm?nBOtqkkEG|?Vrs*OXwc~rNjKd{F{WLdsxE{%nt?6 zbqL*!@e~5mYfZbPF@`LR`2wv2A+$8a4dMLEkykXBHdmg7i3cUkqAKCLc zq^`#`0EF_5J>Nyz`p_0h``d-RMYH$9Wr1eYAO$c2u8$;8QcEim#-TXL07bI<; zgsuwRCr}2ElY6j_O6}M85X!Zo-;uNzA*V6zp(g~&OQeSO&}Rk83_{apd+4dqa@$&S zpQLRMeLWOH=$BA#lesDMjD#LV=uxvf)D&jg#}RtW^n^A_=!=rp8@gOV-;>au&=nF2 z?`650Lsy5{zGj3TH+w_Zgh`jH5yGpTp>av;KS`3qdBM3ci z217qDp}P?JBgoq~NhpWVm(20d+a>h#dr67op~nT6UqR>*b0YK!f%ztZd28s4lJnjF zPkZkI7ge?Q|F6q{12V%5H@P!hR1g%rQ(iKqlr&N!)3U@e)038^mX;Y7nWYt;EHy1J zSy@?!iaJ=9SU_4<+A-6z!ZNioqq5Qt+3)lHuEl1`(|Ml%^Zb7Q*Z=YiulewOul3#Q zzSmxR&z?P;=7n+>(~F=QaiQGD+r0v+5~JlIj{AT;N6W7inot}9T`Mk@Uvu0)LEFV8 zAc0ZPwjY)AQu!Un#e&v}@$v^X4{`VOrnvF)XU-vyJ*UXy>{-~4Ni#^736%G<5McB?@bGQGsKPF~8M|KRN& zljAw=FepJhFXwZdtABo<1EN|k;J8H4YVo4HTT|WhK_OzJtmL@<{kNT7AUDb-Ocz7;qovBo=o>K9hHSl&oDK~K1^>ieJ}en9b`Ht z&twtd_5R+1)n4V;EsWD8O zm_pT9ruUfKYMjf3x_=HT7vbtMro)ydxHLxVQP87^o5&>3B=W1PndsPznNQ7fVepDH zP>6_D<*v0th<+e^jYn0uZbc5m*fUz)&fArO_F+C*z%-TPV$@ws3z^!fMO@Ao$WtV# zdziL>j>r^M$@D&Gj!039xztB^yA*Yw%Y{<^!jz?!xHNK47)a&psFu6hfO0LZVCoBU zsa*9i(@;yRnJxfDs66!uN{00wC`9C`M_qJt(^Sy4peJ1E_`ZKCZjI_MG9pHlj}jds z(#05&gOD)M8JZ}%a%@lNWuh=5G<2>Q5HYHJK72-%FJygy^q*u&l0rOCJfcF9e~KK8kU~l6_h&6)J%@ET>nPT-te3G)X1#`WChJYC^H?ib z7qBj7UCO$WbuH_9)+*NLSZi2cWvydu;<9P2r`i zGg+Tt-OuWFQS6zlH?Tg$`VZEy5Q^>0dKv3-)>m17WbG76KIgGkux@1im{qo+*j}uY zSnpk-z7 zw&c@?^SJtOk>sj}+o?wmgkbh^^b697wE@iD}ZDeiZ z9f=X1;k^)gx_6v2=7)PP`@b~u&6qdi|Njpoe=OQ+MEOM4X{kF*4 ztZ%XIg}TIH@0HMRyi+2&iXXh^KwXj7LOrZ;kuzbZv1W5f57sjyXCr(>B>7*?AyZjz zV9$B13pr#N>tpbj;_s1jp&ziGfVxDYZyfg7&c4CWKE7L#+Hl_@gqQjjLnr$R;U7HT z4);>XjXs)7@58oIJn5q}xBFH=5BpX@L;Mu7SFCg9*mVCo%r@;=^Pnvyp)!!?ddIW3 ze?2_=u=Zyi%z6Rq1lFrqr?bvxy@j=cbs_7$toO67VttbJ1=h{1Z$hKRd;Se5!$E&F z^n3qCXlT>`)IBn43p5?}sPZmRgJJiGx)xf<+Ba$@>;bGr95R&k{HWOozZ6@Aim6cz zuop(X6>&lN0|>dGdi#K*>}REXL-6q@>F2E9 zL?49DkFaqKCuST{3yGmLJ+mDCFzHdP%(tVsYannmg!K4qT3=}%>y$+`$Ss(b}f7*+lx>)%+PW36X>AKFVCV5MVmFY!Z66ZBWs zwy{mfJua5Y5L~+?gxqf1Av2cRhx#H!WV2@%s7rK@^`cb$*d7!cO(jGRjw&}t{BsaK zs(d)BSqYS~J({(Qbt2Ry{(|&fT=$m#r8W;0*TrT)Z-^a?d`%htbvaGhMwQ=;)TCGu zOC#+$-fC+sjhVM&T^`A03lY0wHKjkmslKk5IO#_oTmIO zZDK~((ztj}sGvOs4+TT7;o)k~Q1KAwW%k4x&c*CUb#dwFk+)-MeC~*&ef;yd4hW&1 zb%~>Kw5OYtY1EA>4{b-KO=?GWXDE8M9c^_s6#G%TPRM-{!b8Q}c7vgd*j~Z*TDJej zx~W|OJk1EN=a9Xuhgm82P#$lg+^1BRp2)Fv^mY{?@#8Q*N3h1Rro{L1bQQU*eWA3! z^g%A?#MAyhGX5ZxW{gm7nNV(-`C?rB0QgLcr@8m~c-q(gpKYIoQQA^YI?A-z#X;dM zwiGwTcR={<@idcH#*c*kKs=2=n$@Lv2rVPUT2|v}^a-?;6wky*!~ZX_7eY@Bsg56u z@J;d6XtCGP{-I)9Jne(DkA&ELBzWK1g?vNAXRNgENbz0#c&I7QuP8%^2u~m%GlyjI z9yc;(BKk22;VrXV`-G96QRO+T`A|9o)M9>o&xEUxnxO{SC*fMmlr1zcVHQ$pp^}8# zJYkm1cJv(>N`F=9qC21*^?lK1c)k7qk2!G7|ulHB&syzzBFMQ zsEVn=JvreW&?cq^K_yEP+Z|ftNfz1Z0xybt+>;{uX137No>Z~Pq31nmqA9B-Zlfn4 zs@k{EW>2~}%v2#}AcqVwp##M&7I!4<@??s>*+lb2Z~tCTmMC+m(bHZmuylXIUQY+H z!J$S^N3qM&D#T@r;|?`?azubW(m7=3Pg4%lf!!njhH)zTbhkJbQ3ciYV>p$D=k$Zu7{{~sL|6?9JbUS zalJ%Du1T}MztPiM^sv+iafM>ELyex(M7gC~5O=y*=TM`kkJxVM0Ls}{G&$7h=_lgz zOb+*ByZ)lDLyev@!~{#L5H~<9aH!F9rl_*?B;p2&T@E#R28m`%FCeZ+1Uj1>UO*kr z5<@I)M%>wAibIW_!D0zhgZMJxpl68KYDj*c@D*qmlNrgyVjt5y_lbliPqD!B8}OoW zeGHUr2;=$}&pDzm(>#pplb|7ngga4thl*)TW|R*T@}4Ia zFp=jP&j@jVX|WiP81Ee^vhd}ymi^&;5z)Pcp7xZAbq+o6xjpV6R-7LEcP%_SvGqv5kqiYhqhasnB%=v zOtADgXq+eq(RQ_ocY4Z171Mn8uEc!rWnzb=&l3wl`wXE42YN3T#~nK9xk79mM5$2g z7JDa(0}hpVuN1DLmbml1lSGz7qrHVVXK7qAcZZ})z1N6rLp<|M z69r6*MUSMbz0<@3rUyh((sb{&!ZnJvdq4~UO&3$HFfBgjc zL9>_|+;=72@4Zbdv$QmpH5oktq@gA^V~H_>p`2C8pP{K z&v|bbSgBsmsT^R}U%laoMwcNhvyNe9)wM}*IMQtCZ- zh&ral@$FMOA};VTd-9mSL-a7@&PzGySs+R+^-L-DE)Zo*W_;c$rr0=Z=TTJ>L&2gw7 zJQq1s6nT$W&D7wg@lq*jO`I5kx>t&rPdQC7nrV`yaZH;mO=R*l8qcXr6D-YOsWhy#sJd>H0S;}NOVkw7dz?a6efa$BZC)p8G_zrEQ2?B9iIDJ{%1{LEI92 zl5FS)#NChkU<|cMTj9B1lrow9_5o35 zdThN|Y2wgI^CH)a8tYk=c30$+VvnWGX`4MyiUXG3NxL`lDLiDw6Hy4 z*~D?nKP|EyS{eC_D0JwN$SP54$bA$o@tl}p=~uMGbE4c*Xwp-W&x_TTB9p2>8<;jjWCMjLgK*$l551EQKc3M!qB_Sc*)l z2Tfx#`MoUWm^kED@7W|4I8@@@B#tv342uXfd0r82J|8_OlLBu=z9M1_h2;cxg0d`i z3+#@3Rm`xSeF7&vwPLlUfq{LITSS$mp@DkOYhsVxZbV>znG$Of^MX`c88 zJR3wrB;_|xd;;1Ei(U;OU!#6+8UTF@dP|ID&j-Y@z=_E1qRt`Vdq*5&S}at0i0@r7 z#7Aj9Alj!3-wrW_$*jS4I%(#ndwi|bEq!MsF9SID(?S1mJO`%#;@RcUx#=;!R=O~K zU*sMq?vnJ~k$WAQn4abP$f0YICLhib(hyRS-pR)YVy21d`940_GUcZC_U(7J%S}JS z#|JnYH^j$>7^X_3!UqSYmFXouJ~%L~PcQZH;ee?+eT?r2EP6GB)TWQ~@xg&8(s||X&Ie-JjpY4&e$2r zlRQ)JjNOsHk{ezPA!ow#Hv^#aGD_&iEq*nGT#_-@r{oOozXnPD5Guc6&flS5g)2$}7tWE&*)kyj3}M1ACwRhFoaqNFd%cv7!K%YY^7l~_64p)-8# z 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 From 7cc3a210801a5a118e60be7f16f28cf9f19c3565 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Fri, 16 Jun 2023 04:21:54 -0700 Subject: [PATCH 04/14] build: use Nuget to install Moq --- .../MidiShapeShifterTest.csproj | 15 ++++++++++++--- .../MidiShapeShifterTest/packages.config | 4 ++++ MidiShapeShifter/lib/Moq.dll | Bin 488448 -> 0 bytes 3 files changed, 16 insertions(+), 3 deletions(-) delete mode 100644 MidiShapeShifter/lib/Moq.dll diff --git a/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj b/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj index 8430231..41d70a0 100644 --- a/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj +++ b/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj @@ -55,6 +55,9 @@ false + + ..\packages\Castle.Core.4.4.1\lib\net45\Castle.Core.dll + ..\packages\VST.NET.x64.1.1\lib\net40\Jacobi.Vst.Core.dll @@ -64,9 +67,8 @@ ..\packages\VST.NET.x64.1.1\lib\net40\Jacobi.Vst.Interop.dll - - False - ..\lib\Moq.dll + + ..\packages\Moq.4.17.2\lib\net45\Moq.dll False @@ -77,9 +79,16 @@ ..\..\SDK\NUnit\bin\net-2.0\nunit.framework.dll + 3.5 + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll + 3.5 diff --git a/MidiShapeShifter/MidiShapeShifterTest/packages.config b/MidiShapeShifter/MidiShapeShifterTest/packages.config index 794106e..551795e 100644 --- a/MidiShapeShifter/MidiShapeShifterTest/packages.config +++ b/MidiShapeShifter/MidiShapeShifterTest/packages.config @@ -1,4 +1,8 @@  + + + + \ No newline at end of file diff --git a/MidiShapeShifter/lib/Moq.dll b/MidiShapeShifter/lib/Moq.dll deleted file mode 100644 index 3a3e653aa79f33f339435b5efd7f097cf18786d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488448 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

>=P)e=oKrW;}RKre+)vwRqkQFY(4yw* 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

FUJ0 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�)DKq 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 WOiLWrFLIBYUsCzM>HoVm@c#g`8AFr+ From c903003388c74732a5eab6c68d591d59f240de78 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Fri, 16 Jun 2023 04:23:18 -0700 Subject: [PATCH 05/14] build: use Nuget to install ninject --- .../MidiShapeShifter/MidiShapeShifter.csproj | 5 ++--- .../MidiShapeShifter/packages.config | 1 + .../MidiShapeShifterTest.csproj | 5 ++--- .../MidiShapeShifterTest/packages.config | 1 + MidiShapeShifter/lib/Ninject.dll | Bin 124416 -> 0 bytes 5 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 MidiShapeShifter/lib/Ninject.dll diff --git a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj index 7e18f17..4e76771 100644 --- a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj +++ b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj @@ -68,9 +68,8 @@ ..\packages\ncalc.1.3.8\lib\NCalc.dll - - False - ..\lib\Ninject.dll + + ..\packages\Ninject.3.3.6\lib\net45\Ninject.dll diff --git a/MidiShapeShifter/MidiShapeShifter/packages.config b/MidiShapeShifter/MidiShapeShifter/packages.config index af61c80..7551101 100644 --- a/MidiShapeShifter/MidiShapeShifter/packages.config +++ b/MidiShapeShifter/MidiShapeShifter/packages.config @@ -1,5 +1,6 @@  + \ No newline at end of file diff --git a/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj b/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj index 41d70a0..6ab16bc 100644 --- a/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj +++ b/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj @@ -70,9 +70,8 @@ ..\packages\Moq.4.17.2\lib\net45\Moq.dll - - False - ..\lib\Ninject.dll + + ..\packages\Ninject.3.3.6\lib\net45\Ninject.dll False diff --git a/MidiShapeShifter/MidiShapeShifterTest/packages.config b/MidiShapeShifter/MidiShapeShifterTest/packages.config index 551795e..04f0530 100644 --- a/MidiShapeShifter/MidiShapeShifterTest/packages.config +++ b/MidiShapeShifter/MidiShapeShifterTest/packages.config @@ -2,6 +2,7 @@ + diff --git a/MidiShapeShifter/lib/Ninject.dll b/MidiShapeShifter/lib/Ninject.dll deleted file mode 100644 index be8cb1e1914f2441cac22ae0f3eb0f133fdb48e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124416 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 L*MI)%QQ-do|KGPT From 528c9a0923aa0455875e4aa296fd6f4f14dcba24 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Mon, 19 Jun 2023 03:16:26 -0700 Subject: [PATCH 06/14] build: fix the vst-dist renaming build --- MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj index 4e76771..51600dc 100644 --- a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj +++ b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj @@ -417,10 +417,11 @@ rmdir "$(ProjectDir)bin\vst-dist\" /Q/S xcopy "$(TargetDir)" "$(ProjectDir)bin\vst-dist\" /E/H/Q del "$(ProjectDir)bin\vst-dist\$(TargetFileName)" -copy "$(TargetPath)" "$(ProjectDir)bin\vst-dist\$(TargetName).net.vstdll" +copy "$(TargetPath)" "$(ProjectDir)bin\vst-dist\$(TargetName).net.vstdll" +copy "$(TargetDir)\Jacobi.Vst.Interop.dll" "$(ProjectDir)bin\vst-dist\$(TargetFileName) - \ No newline at end of file + From 2ecee34ba41874ce199a32b0dd36b700971d6bcc Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Mon, 19 Jun 2023 04:42:13 -0700 Subject: [PATCH 07/14] fix: build LBIndustrialCtrls and ZedGraph from the SDK folder --- .../LBIndustrialCtrls/AssemblyInfo.cs | 31 - .../Base/LBIndustrialCtrlBase.Designer.cs | 42 -- .../Base/LBIndustrialCtrlBase.cs | 252 -------- .../LBIndustrialCtrls/Base/Renderer.cs | 26 - .../Button/ButtonRenderer.cs | 265 -------- .../Button/LBButton.Designer.cs | 51 -- .../LBIndustrialCtrls/Button/LBButton.cs | 297 --------- .../LBIndustrialCtrls/Button/LBButton.resx | 120 ---- .../LBIndustrialCtrls/Knob/Knob.bmp | Bin 822 -> 0 bytes .../LBIndustrialCtrls/Knob/KnobRenderer.cs | 198 ------ .../LBIndustrialCtrls/Knob/LBKnob.Designer.cs | 53 -- .../LBIndustrialCtrls/Knob/LBKnob.cs | 450 ------------- .../LBIndustrialCtrls/Knob/LBKnob.resx | 120 ---- .../LBIndustrialCtrls.csproj | 176 ----- .../Led/LB7SegmentDisplay.Designer.cs | 51 -- .../Led/LB7SegmentDisplay.cs | 59 -- .../Led/LB7SegmentDisplay.resx | 120 ---- .../Led/LB7SegmentDisplayRenderer.cs | 608 ------------------ .../LBIndustrialCtrls/Led/LBLed.Designer.cs | 56 -- .../LBIndustrialCtrls/Led/LBLed.cs | 216 ------- .../LBIndustrialCtrls/Led/LBLed.resx | 123 ---- .../LBIndustrialCtrls/Led/LedRenderer.cs | 275 -------- .../Meters/LBAnalogMeter.Designer.cs | 46 -- .../LBIndustrialCtrls/Meters/LBAnalogMeter.cs | 256 -------- .../Meters/LBDigitalMeter.Designer.cs | 45 -- .../Meters/LBDigitalMeter.cs | 323 ---------- .../Meters/LBDigitalMeter.resx | 120 ---- .../Meters/LBDigitalMeterRenderer.cs | 68 -- .../Meters/LBMeterThreshold.cs | 165 ----- .../LBIndustrialCtrls/Meters/MeterRenderer.cs | 397 ------------ .../LBIndustrialCtrls/Utils/ColorMng.cs | 62 -- .../LBIndustrialCtrls/Utils/MathFunc.cs | 21 - .../LBIndustrialCtrls_src/TestApp.sln | 31 - .../TestApp/AssemblyInfo.cs | 31 - .../TestApp/MainForm.Designer.cs | 541 ---------------- .../LBIndustrialCtrls_src/TestApp/MainForm.cs | 182 ------ .../TestApp/MainForm.resx | 135 ---- .../LBIndustrialCtrls_src/TestApp/Program.cs | 32 - .../TestApp/TestApp.csproj | 132 ---- .../LBIndustrialCtrls_src/TestApp/app.config | 3 - MidiShapeShifter/MidiShapeShifter.sln | 21 +- .../MidiShapeShifter/MidiShapeShifter.csproj | 12 +- MidiShapeShifter/lib/DependencyInfo.ods | Bin 4105 -> 0 bytes MidiShapeShifter/lib/ZedGraph.dll | Bin 299008 -> 0 bytes .../LBIndustrialCtrls.csproj | 18 +- SDK/ZedGraphs/ZedGraph.csproj | 7 +- 46 files changed, 43 insertions(+), 6194 deletions(-) delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/AssemblyInfo.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.Designer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/Renderer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/ButtonRenderer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.Designer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.resx delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/Knob.bmp delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/KnobRenderer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.Designer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.resx delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/LBIndustrialCtrls.csproj delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.Designer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.resx delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplayRenderer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.Designer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.resx delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LedRenderer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.Designer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.Designer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.resx delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeterRenderer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBMeterThreshold.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/MeterRenderer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/ColorMng.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/MathFunc.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp.sln delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/AssemblyInfo.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.Designer.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.resx delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/Program.cs delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/TestApp.csproj delete mode 100644 MidiShapeShifter/LBIndustrialCtrls_src/TestApp/app.config delete mode 100644 MidiShapeShifter/lib/DependencyInfo.ods delete mode 100644 MidiShapeShifter/lib/ZedGraph.dll diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/AssemblyInfo.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/AssemblyInfo.cs deleted file mode 100644 index aecdd25..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/AssemblyInfo.cs +++ /dev/null @@ -1,31 +0,0 @@ -#region Using directives - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -#endregion - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("LBIndustrialCtrls")] -[assembly: AssemblyDescription(".NET library controls for measure, visualization and commands")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("LBSoft di Bonotto Luca")] -[assembly: AssemblyProduct("LBIndustrialCtrls")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose a type to COM, use [ComVisible(true)] on that type. -[assembly: ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all the values or you can use the default the Revision and -// Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("2.1.0.0")] diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.Designer.cs deleted file mode 100644 index 2a2c381..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.Designer.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace LBSoft.IndustrialCtrls.Base -{ - partial class LBIndustrialCtrlBase - { - ///

- /// Variabile di progettazione necessaria. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Liberare le risorse in uso. - /// - /// ha valore true se le risorse gestite devono essere eliminate, false in caso contrario. - protected override void Dispose(bool disposing) - { - // Dispose the renderers - this.DefaultRenderer.Dispose(); - if (this.Renderer != null) - this.Renderer.Dispose(); - - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Codice generato da Progettazione componenti - - /// - /// Metodo necessario per il supporto della finestra di progettazione. Non modificare - /// il contenuto del metodo con l'editor di codice. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - } - - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.cs deleted file mode 100644 index e226af7..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/LBIndustrialCtrlBase.cs +++ /dev/null @@ -1,252 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBIndustrialCtrlBase.cs - * Utente: lucabonotto - * Date: 05/04/2009 - * Time: 13.36 - *-------------------------------------------------------------------------*/ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace LBSoft.IndustrialCtrls.Base -{ - /// - /// Base class for the IndustrialCtrls - /// - public partial class LBIndustrialCtrlBase : UserControl - { - #region (* Constructor *) - public LBIndustrialCtrlBase() - { - InitializeComponent(); - - // Set the styles for drawing - SetStyle(ControlStyles.AllPaintingInWmPaint | - ControlStyles.ResizeRedraw | - ControlStyles.DoubleBuffer | - ControlStyles.SupportsTransparentBackColor, - true); - - // Transparent background - this.BackColor = Color.Transparent; - - // Creation of the default renderer - this._defaultRenderer = CreateDefaultRenderer(); - if (this._defaultRenderer != null) - this._defaultRenderer.Control = this; - } - #endregion - - #region (* Properties *) - /// - /// Default renderer of the control - /// - private ILBRenderer _defaultRenderer = null; - [Browsable(false)] - public ILBRenderer DefaultRenderer - { - get { return this._defaultRenderer; } - } - - /// - /// User defined renderer - /// - private ILBRenderer _renderer = null; - [Browsable(false)] - public ILBRenderer Renderer - { - set - { - // set the renderer - this._renderer = value; - if (this._renderer != null) - { - // Set the control tu the renderer - this._renderer.Control = this; - // Update the renderer - this._renderer.Update(); - } - - // Redraw the renderer - Invalidate(); - } - get { return this._renderer; } - } - #endregion - - #region (* Events delegates *) - /// - /// Font change event - /// - /// - [System.ComponentModel.EditorBrowsableAttribute()] - protected override void OnFontChanged(EventArgs e) - { - // Calculate dimensions - this.CalculateDimensions(); - } - /// - /// SizeChanged event - /// - /// - [System.ComponentModel.EditorBrowsableAttribute()] - protected override void OnSizeChanged(EventArgs e) - { - // Default - base.OnSizeChanged(e); - // Calculate al the data for - // drawing the control - this.CalculateDimensions(); - // Redraw - this.Invalidate(); - } - - /// - /// Resize event - /// - /// - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - // Calculate al the data for - // drawing the control - this.CalculateDimensions(); - // Redraw - this.Invalidate(); - } - /// - /// Paint event - /// - /// - [System.ComponentModel.EditorBrowsableAttribute()] - protected override void OnPaint(PaintEventArgs e) - { - // Rectangle of the control - RectangleF _rc = new RectangleF(0, 0, this.Width, this.Height); - e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; - - // Call the default renderer if the user - // rendere is null - if (this.Renderer == null) - { - this.DefaultRenderer.Draw(e.Graphics); - return; - } - - // Draw with the user renderer - this.Renderer.Draw(e.Graphics); - } - #endregion - - #region (* Virtual method *) - /// - /// Call from the constructor to create the default renderer - /// - /// - protected virtual ILBRenderer CreateDefaultRenderer() - { - return new LBRendererBase(); - } - - /// - /// Calculate the dimensions of the control - /// - protected virtual void CalculateDimensions() - { - this.DefaultRenderer.Update(); - - // Update the data in the renderer - if (this.Renderer != null) - this.Renderer.Update(); - - this.Invalidate(); - } - #endregion - } - - /// - /// Base class for the controls renderer - /// - public class LBRendererBase : ILBRenderer - { - #region (* Constructor *) - public LBRendererBase() - { - } - #endregion - - #region (* IDisposable implementation *) - public void Dispose() - { - this.OnDispose(); - } - #endregion - - #region (* Properties *) - /// - /// Associated control - /// - protected object _control = null; - public object Control - { - set { this._control = value; } - get { return this._control; } - } - #endregion - - #region (* Virtual methods *) - /// - /// Dispose the resource of the object - /// - public virtual void OnDispose() - { - } - - /// - /// Update the renderer - /// - /// - public virtual bool Update() - { - return false; - } - - /// - /// Drawing method - /// - /// - public virtual void Draw(Graphics Gr) - { - // Check the graphics - if (Gr == null) - throw new ArgumentNullException("Gr"); - - // Check the control - Control ctrl = this.Control as Control; - if (ctrl == null) - throw new NullReferenceException("Associated control is not valid"); - - // Default drawing - Rectangle rc = ctrl.Bounds; - - Gr.FillRectangle(Brushes.White, ctrl.Bounds); - Gr.DrawRectangle(Pens.Black, ctrl.Bounds); - - Gr.DrawLine(Pens.Red, - ctrl.Left, - ctrl.Top, - ctrl.Right, - ctrl.Bottom); - - Gr.DrawLine(Pens.Red, - ctrl.Right, - ctrl.Top, - ctrl.Left, - ctrl.Bottom); - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/Renderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/Renderer.cs deleted file mode 100644 index 3a0aefc..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Base/Renderer.cs +++ /dev/null @@ -1,26 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: Renderer.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.Drawing; - -namespace LBSoft.IndustrialCtrls.Base -{ - /// - /// Renderer interface for all - /// LBSoft.IndustrialCtrls renderer - /// - public interface ILBRenderer : IDisposable - { - object Control - { - set; - get; - } - bool Update (); - void Draw ( Graphics Gr ); - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/ButtonRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/ButtonRenderer.cs deleted file mode 100644 index 6241e3c..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/ButtonRenderer.cs +++ /dev/null @@ -1,265 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: ButtonRenderer.cs - * Utente: lucabonotto - * Date: 05/04/2009 - * Time: 13.36 - *-------------------------------------------------------------------------*/ - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using LBSoft.IndustrialCtrls.Utils; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Buttons -{ - /// - /// Base class for the button renderers - /// - public class LBButtonRenderer : LBRendererBase - { - #region (* Variables *) - protected RectangleF rectCtrl; - protected RectangleF rectBody; - protected RectangleF rectText; - protected float drawRatio = 1.0F; - #endregion - - #region (* Constructor *) - public LBButtonRenderer() - { - this.rectCtrl = new RectangleF ( 0, 0, 0, 0 ); - } - #endregion - - #region (* Overrided methods *) - /// - /// Update the rectangles for drawing - /// - /// - public override bool Update() - { - // Check Button object - if ( this.Button == null ) - throw new NullReferenceException ( "Invalid 'Button' object" ); - - // Control rectangle - this.rectCtrl.X = 0; - this.rectCtrl.Y = 0; - this.rectCtrl.Width = this.Button.Width; - this.rectCtrl.Height = this.Button.Height; - - if (this.Button.Style == LBButton.ButtonStyle.Circular) - { - if (rectCtrl.Width < rectCtrl.Height) - rectCtrl.Height = rectCtrl.Width; - else if (rectCtrl.Width > rectCtrl.Height) - rectCtrl.Width = rectCtrl.Height; - - if (rectCtrl.Width < 10) - rectCtrl.Width = 10; - if (rectCtrl.Height < 10) - rectCtrl.Height = 10; - } - - this.rectBody = this.rectCtrl; - this.rectBody.Width -= 1; - this.rectBody.Height -= 1; - - this.rectText = this.rectCtrl; - this.rectText.Width -= 2; - this.rectText.Height -= 2; - - // Calculate ratio - drawRatio = (Math.Min(rectCtrl.Width,rectCtrl.Height)) / 200; - if ( drawRatio == 0.0 ) - drawRatio = 1; - - return true; - } - - /// - /// Draw the button object - /// - /// - public override void Draw ( Graphics Gr ) - { - if ( Gr == null ) - throw new ArgumentNullException ( "Gr", "Invalid Graphics object" ); - - if ( this.Button == null ) - throw new NullReferenceException ( "Invalid 'Button' object" ); - - this.DrawBackground( Gr, this.rectCtrl ); - this.DrawBody ( Gr, this.rectBody ); - this.DrawText ( Gr, this.rectText ); - } - #endregion - - #region (* Properies *) - /// - /// Get the associated button object - /// - public LBButton Button - { - get { return this.Control as LBButton; } - } - #endregion - - #region (* Virtual method *) - /// - /// Draw the background of the control - /// - /// - /// - /// - public virtual bool DrawBackground( Graphics Gr, RectangleF rc ) - { - if ( this.Button == null ) - return false; - - Color c = this.Button.BackColor; - SolidBrush br = new SolidBrush ( c ); - Pen pen = new Pen ( c ); - - Rectangle _rcTmp = new Rectangle(0, 0, this.Button.Width, this.Button.Height ); - Gr.DrawRectangle ( pen, _rcTmp ); - Gr.FillRectangle ( br, rc ); - - br.Dispose(); - pen.Dispose(); - - return true; - } - - /// - /// Draw the body of the control - /// - /// - /// - /// - public virtual bool DrawBody( Graphics Gr, RectangleF rc ) - { - if ( this.Button == null ) - return false; - - Color bodyColor = this.Button.ButtonColor; - Color cDark = LBColorManager.StepColor ( bodyColor, 20 ); - - LinearGradientBrush br1 = new LinearGradientBrush ( rc, - bodyColor, - cDark, - 45 ); - - if ((this.Button.Style == LBButton.ButtonStyle.Circular) || - (this.Button.Style == LBButton.ButtonStyle.Elliptical)) - { - Gr.FillEllipse(br1, rc); - } - else - { - GraphicsPath path = this.RoundedRect(rc, 15F); - Gr.FillPath(br1, path); - path.Dispose(); - } - - if ( this.Button.State == LBButton.ButtonState.Pressed ) - { - RectangleF _rc = rc; - _rc.Inflate ( -15F * this.drawRatio, -15F * drawRatio ); - LinearGradientBrush br2 = new LinearGradientBrush ( _rc, - cDark, - bodyColor, - 45 ); - if ((this.Button.Style == LBButton.ButtonStyle.Circular) || - (this.Button.Style == LBButton.ButtonStyle.Elliptical)) - { - Gr.FillEllipse(br2, _rc); - } - else - { - GraphicsPath path = this.RoundedRect(_rc, 10F); - Gr.FillPath(br2, path); - path.Dispose(); - } - - br2.Dispose(); - } - - br1.Dispose(); - return true; - } - - /// - /// Draw the text of the control - /// - /// - /// - /// - public virtual bool DrawText( Graphics Gr, RectangleF rc ) - { - if ( this.Button == null ) - return false; - - //Draw Strings - Font font = new Font ( this.Button.Font.FontFamily, - this.Button.Font.Size * this.drawRatio, - this.Button.Font.Style ); - - String str = this.Button.Label; - - Color bodyColor = this.Button.ButtonColor; - Color cDark = LBColorManager.StepColor ( bodyColor, 20 ); - - SizeF size = Gr.MeasureString ( str, font ); - - SolidBrush br1 = new SolidBrush ( bodyColor ); - SolidBrush br2 = new SolidBrush ( cDark ); - - Gr.DrawString ( str, - font, - br1, - rc.Left + ( ( rc.Width * 0.5F ) - (float)( size.Width * 0.5F ) ) + (float)( 1 * this.drawRatio ), - rc.Top + ( ( rc.Height * 0.5F ) - (float)( size.Height * 0.5 ) ) + (float)( 1 * this.drawRatio ) ); - - Gr.DrawString ( str, - font, - br2, - rc.Left + ( ( rc.Width * 0.5F ) - (float)( size.Width * 0.5F ) ), - rc.Top + ( ( rc.Height * 0.5F ) - (float)( size.Height * 0.5 ) ) ); - - br1.Dispose(); - br2.Dispose(); - font.Dispose(); - - return false; - } - #endregion - - #region (* Protected Methods *) - protected GraphicsPath RoundedRect(RectangleF rect, float radius) - { - RectangleF baseRect = rect; - float diameter = (radius*this.drawRatio) * 2.0f; - SizeF sizeF = new SizeF(diameter, diameter); - RectangleF arc = new RectangleF(baseRect.Location, sizeF); - GraphicsPath path = new GraphicsPath(); - - // top left arc - path.AddArc(arc, 180, 90); - // top right arc - arc.X = baseRect.Right - diameter; - path.AddArc(arc, 270, 90); - // bottom right arc - arc.Y = baseRect.Bottom - diameter; - path.AddArc(arc, 0, 90); - // bottom left arc - arc.X = baseRect.Left; - path.AddArc(arc, 90, 90); - - path.CloseFigure(); - return path; - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.Designer.cs deleted file mode 100644 index cd229b0..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.Designer.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Creato da SharpDevelop. - * Utente: lucabonotto - * Data: 05/04/2008 - * Ora: 13.36 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ -namespace LBSoft.IndustrialCtrls.Buttons -{ - partial class LBButton - { - /// - /// Designer variable used to keep track of non-visual components. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Disposes resources used by the control. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing) { - if (components != null) { - components.Dispose(); - } - } - base.Dispose(disposing); - } - - /// - /// This method is required for Windows Forms designer support. - /// Do not change the method contents inside the source code editor. The Forms designer might - /// not be able to load this method if it was changed manually. - /// - private void InitializeComponent() - { - this.SuspendLayout(); - // - // LBButton - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Name = "LBButton"; - this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnMouseDown); - this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnMuoseUp); - this.ResumeLayout(false); - } - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.cs deleted file mode 100644 index a7bb327..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.cs +++ /dev/null @@ -1,297 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBButton.cs - * Utente: lucabonotto - * Date: 05/04/2009 - * Time: 13.36 - *-------------------------------------------------------------------------*/ - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Buttons -{ - /// - /// Description of LBButton. - /// - public partial class LBButton : LBIndustrialCtrlBase - { - #region (* Enumeratives *) - /// - /// Button styles - /// - public enum ButtonStyle - { - Circular = 0, - Rectangular = 1, - Elliptical = 2, - } - - /// - /// Button states - /// - public enum ButtonState - { - Normal = 0, - Pressed, - } - #endregion - - #region (* Properties variables *) - private ButtonStyle buttonStyle = ButtonStyle.Circular; - private ButtonState buttonState = ButtonState.Normal; - private Color buttonColor = Color.Red; - private string label = String.Empty; - private bool enableRepeatState = false; - private int startRepeatInterval = 500; - private int repeatInterval = 100; - #endregion - - #region (* Variables *) - private Timer tmrRepeat = null; - #endregion - - #region (* Constructor *) - public LBButton() - { - // Initialization - InitializeComponent(); - - // Properties initialization - this.buttonColor = Color.Red; - this.Size = new Size(50, 50); - - // Timer - this.tmrRepeat = new Timer(); - this.tmrRepeat.Enabled = false; - this.tmrRepeat.Interval = this.startRepeatInterval; - this.tmrRepeat.Tick += this.Timer_Tick; - } - #endregion - - #region (* Overrided methods *) - protected override ILBRenderer CreateDefaultRenderer() - { - return new LBButtonRenderer(); - } - #endregion - - #region (* Properties *) - [ - Category("Button"), - Description("Style of the button") - ] - public ButtonStyle Style - { - set - { - this.buttonStyle = value; - this.CalculateDimensions(); - } - get { return this.buttonStyle; } - } - - [ - Category("Button"), - Description("Color of the body of the button") - ] - public Color ButtonColor - { - get { return buttonColor; } - set - { - buttonColor = value; - Invalidate(); - } - } - - [ - Category("Button"), - Description("Label of the button"), - ] - public string Label - { - get { return this.label; } - set - { - this.label = value; - Invalidate(); - } - } - - [ - Category("Button"), - Description("State of the button") - ] - public ButtonState State - { - set - { - this.buttonState = value; - this.Invalidate(); - } - get { return this.buttonState; } - } - - [ - Category("Button"), - Description("Enable/Disable the repetition of the event if the button is pressed") - ] - public bool RepeatState - { - set { this.enableRepeatState = value; } - get { return this.enableRepeatState; } - } - - [ - Category("Button"), - Description("Interval to wait in ms for start the repetition") - ] - public int StartRepeatInterval - { - set { this.startRepeatInterval = value; } - get { return this.startRepeatInterval; } - } - - [ - Category("Button"), - Description("Interva in ms for the repetition") - ] - public int RepeatInterval - { - set { this.repeatInterval = value; } - get { return this.repeatInterval; } - } - #endregion - - #region (* Events delegates *) - /// - /// Timer event - /// - /// - /// - void Timer_Tick(object sender, EventArgs e) - { - this.tmrRepeat.Enabled = false; - - // Update the interval - if (tmrRepeat.Interval == this.startRepeatInterval) - this.tmrRepeat.Interval = this.repeatInterval; - - // Call the delagate - LBButtonEventArgs ev = new LBButtonEventArgs(); - ev.State = this.State; - this.OnButtonRepeatState(ev); - - this.tmrRepeat.Enabled = true; - } - - /// - /// Mouse down event - /// - /// - /// - void OnMouseDown(object sender, MouseEventArgs e) - { - // Change the state - this.State = ButtonState.Pressed; - this.Invalidate(); - - // Call the delagates - LBButtonEventArgs ev = new LBButtonEventArgs(); - ev.State = this.State; - this.OnButtonChangeState ( ev ); - - // Enable the repeat timer - if (this.RepeatState != false) - { - this.tmrRepeat.Interval = this.StartRepeatInterval; - this.tmrRepeat.Enabled = true; - } - } - - /// - /// Mouse up event - /// - /// - /// - void OnMuoseUp(object sender, MouseEventArgs e) - { - // Change the state - this.State = ButtonState.Normal; - this.Invalidate(); - - // Call the delagates - LBButtonEventArgs ev = new LBButtonEventArgs(); - ev.State = this.State; - this.OnButtonChangeState ( ev ); - - // Disable the timer - this.tmrRepeat.Enabled = false; - } - #endregion - - #region (* Fire events *) - /// - /// Event for the state changed - /// - public event ButtonChangeState ButtonChangeState; - - /// - /// Method for call the delagetes - /// - /// - protected virtual void OnButtonChangeState( LBButtonEventArgs e ) - { - if( this.ButtonChangeState != null ) - this.ButtonChangeState( this, e ); - } - - /// - /// Event for the repetition of state - /// - public event ButtonRepeatState ButtonRepeatState; - - /// - /// Method for call the delagetes - /// - /// - protected virtual void OnButtonRepeatState(LBButtonEventArgs e) - { - if (this.ButtonRepeatState != null) - this.ButtonRepeatState(this, e); - } - #endregion - } - - #region (* Classes for event and event delagates args *) - - #region (* Event args class *) - /// - /// Class for events delegates - /// - public class LBButtonEventArgs : EventArgs - { - private LBButton.ButtonState state; - - public LBButtonEventArgs() - { - } - - public LBButton.ButtonState State - { - get { return this.state; } - set { this.state = value; } - } - } - #endregion - - #region (* Delegates *) - public delegate void ButtonChangeState ( object sender, LBButtonEventArgs e ); - public delegate void ButtonRepeatState ( object sender, LBButtonEventArgs e ); - #endregion - - #endregion -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.resx deleted file mode 100644 index 7080a7d..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Button/LBButton.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/Knob.bmp b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/Knob.bmp deleted file mode 100644 index 94a36c59404c9fc9a1e91469fea0f6d846648367..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmb7C%Wo2K5XN})V&cUk2S^AOkw+F-Xty9BZ+R@Q@G2$^N@CDL!D_2eND=J`i^8I| zyQNJVc`OTfXtkR7k2zt zP4IZ%7i=<_jK|~AXfzlM`u#pchG8JHK$%0xlO$QI)zay--|u(3-N|IKSS%6*LDTe{ zH$_mn*uHN9*nO5zN3!jwm{t z?>HO|trk_QR6xErHJA!P)TkDX#-jWCb!IeT`HkkqMs_a}i9jj6UJtapQv;z|tws<8 z$MM~Ab;!*49~xJ=+_uZ*3WY*WrxU|4rBVqBXrfZ7SpJ)0c{rT$KM|K(TQ#588;{2m ziGYUpTJb=$%`<3cdD)q!- zd0;jfEf$O2W;2>hejHCdPPd3ox7*|P4**`v!N - /// Base class for the renderers of the knob - /// - public class LBKnobRenderer : LBRendererBase - { - #region (* Variables *) - private RectangleF drawRect; - private RectangleF rectScale; - private RectangleF rectKnob; - private PointF knobCenter; - private PointF knobIndicatorPos; - private float drawRatio; - #endregion - - #region (* Properies *) - public LBKnob Knob - { - get { return this.Control as LBKnob; } - } - #endregion - - #region (* Overrided method *) - public override bool Update() - { - // Check Button object - if (this.Knob == null) - throw new NullReferenceException("Invalid 'Knob' object"); - - // Rectangle - float x, y, w, h; - x = 0; - y = 0; - w = this.Knob.Size.Width; - h = this.Knob.Size.Height; - - // Calculate ratio - drawRatio = (Math.Min(w, h)) / 200; - if (drawRatio == 0.0) - drawRatio = 1; - - // Draw rectangle - drawRect.X = x; - drawRect.Y = y; - drawRect.Width = w - 2; - drawRect.Height = h - 2; - - if (w < h) - drawRect.Height = w; - else if (w > h) - drawRect.Width = h; - - if (drawRect.Width < 10) - drawRect.Width = 10; - if (drawRect.Height < 10) - drawRect.Height = 10; - - this.rectScale = this.drawRect; - this.rectKnob = this.drawRect; - this.rectKnob.Inflate(-20 * this.drawRatio, -20 * this.drawRatio); - - this.knobCenter.X = this.rectKnob.Left + (this.rectKnob.Width * 0.5F); - this.knobCenter.Y = this.rectKnob.Top + (this.rectKnob.Height * 0.5F); - - this.knobIndicatorPos = this.Knob.GetPositionFromValue(this.Knob.Value); - - this.Knob.KnobRect = this.rectKnob; - this.Knob.KnobCenter = this.knobCenter; - this.Knob.DrawRatio = this.drawRatio; - return true; - } - - public override void Draw(Graphics Gr) - { - if (Gr == null) - throw new ArgumentNullException("Gr"); - - LBKnob ctrl = this.Knob; - if (ctrl == null) - throw new NullReferenceException("Associated control is not valid"); - - this.DrawBackground(Gr, ctrl.Bounds); - this.DrawScale(Gr, this.rectScale); - this.DrawKnob(Gr, this.rectKnob); - this.DrawKnobIndicator(Gr, this.rectKnob, this.knobIndicatorPos); - } - #endregion - - #region (* Virtual method *) - /// - /// Draw the background of the control - /// - /// - /// - /// - public virtual bool DrawBackground( Graphics Gr, RectangleF rc ) - { - if ( this.Knob == null ) - return false; - - Color c = this.Knob.BackColor; - SolidBrush br = new SolidBrush ( c ); - Pen pen = new Pen ( c ); - - Rectangle _rcTmp = new Rectangle(0, 0, this.Knob.Width, this.Knob.Height ); - Gr.DrawRectangle ( pen, _rcTmp ); - Gr.FillRectangle ( br, rc ); - - br.Dispose(); - pen.Dispose(); - - return true; - } - - /// - /// Draw the scale of the control - /// - /// - /// - /// - public virtual bool DrawScale( Graphics Gr, RectangleF rc ) - { - if ( this.Knob == null ) - return false; - - Color cKnob = this.Knob.ScaleColor; - Color cKnobDark = LBColorManager.StepColor ( cKnob, 60 ); - - LinearGradientBrush br = new LinearGradientBrush ( rc, cKnobDark, cKnob, 45 ); - - Gr.FillEllipse ( br, rc ); - - br.Dispose(); - - return true; - } - - /// - /// Draw the knob of the control - /// - /// - /// - /// - public virtual bool DrawKnob( Graphics Gr, RectangleF rc ) - { - if ( this.Knob == null ) - return false; - - Color cKnob = this.Knob.KnobColor; - Color cKnobDark = LBColorManager.StepColor ( cKnob, 60 ); - - LinearGradientBrush br = new LinearGradientBrush ( rc, cKnob, cKnobDark, 45 ); - - Gr.FillEllipse ( br, rc ); - - br.Dispose(); - - return true; - } - - public virtual bool DrawKnobIndicator( Graphics Gr, RectangleF rc, PointF pos ) - { - if ( this.Knob == null ) - return false; - - RectangleF _rc = rc; - _rc.X = pos.X - 4; - _rc.Y = pos.Y - 4; - _rc.Width = 8; - _rc.Height = 8; - - Color cKnob = this.Knob.IndicatorColor; - Color cKnobDark = LBColorManager.StepColor ( cKnob, 60 ); - - LinearGradientBrush br = new LinearGradientBrush ( _rc, cKnobDark, cKnob, 45 ); - - Gr.FillEllipse ( br, _rc ); - - br.Dispose(); - - return true; - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.Designer.cs deleted file mode 100644 index 4d1d2f0..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.Designer.cs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Creato da SharpDevelop. - * Utente: lucabonotto - * Data: 05/04/2008 - * Ora: 13.35 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ -namespace LBSoft.IndustrialCtrls.Knobs -{ - partial class LBKnob - { - /// - /// Designer variable used to keep track of non-visual components. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Disposes resources used by the control. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing) { - if (components != null) { - components.Dispose(); - } - } - base.Dispose(disposing); - } - - /// - /// This method is required for Windows Forms designer support. - /// Do not change the method contents inside the source code editor. The Forms designer might - /// not be able to load this method if it was changed manually. - /// - private void InitializeComponent() - { - this.SuspendLayout(); - // - // LBKnob - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Name = "LBKnob"; - this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnMouseDown); - this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.OnMouseMove); - this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnMouseUp); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnKeyDown); - this.ResumeLayout(false); - } - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.cs deleted file mode 100644 index 68556e4..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.cs +++ /dev/null @@ -1,450 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBKnob.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Knobs -{ - /// - /// Description of LBKnob. - /// - public partial class LBKnob : LBIndustrialCtrlBase - { - #region *( Enumerators *) - public enum KnobStyle - { - Circular = 0, - } - #endregion - - #region (* Properties variables *) - private float minValue = 0.0F; - private float maxValue = 1.0F; - private float stepValue = 0.1F; - private float currValue = 0.0F; - private RectangleF knobRect = RectangleF.Empty; - private PointF knobCenter = PointF.Empty; - private KnobStyle style = KnobStyle.Circular; - private Color scaleColor = Color.Green; - private Color knobColor = Color.Black ; - private Color indicatorColor = Color.Red; - private float indicatorOffset = 10F; - private float drawRatio = 1F; - #endregion - - #region (* Class variables *) - private bool isKnobRotating = false; - #endregion - - #region (* Constructor *) - public LBKnob() - { - InitializeComponent(); - - this.CalculateDimensions(); - } - #endregion - - #region (* Properties *) - [ - Category("Knob"), - Description("Minimum value of the knob") - ] - public float MinValue - { - set - { - this.minValue = value; - this.Invalidate(); - } - get { return this.minValue; } - } - - [ - Category("Knob"), - Description("Maximum value of the knob") - ] - public float MaxValue - { - set - { - this.maxValue = value; - this.Invalidate(); - } - get { return this.maxValue; } - } - - [ - Category("Knob"), - Description("Step value of the knob") - ] - public float StepValue - { - set - { - this.stepValue = value; - this.Invalidate(); - } - get { return this.stepValue; } - } - - [ - Category("Knob"), - Description("Current value of the knob") - ] - public float Value - { - set - { - if ( value != this.currValue ) - { - this.currValue = value; - this.CalculateDimensions(); - this.Invalidate(); - - LBKnobEventArgs e = new LBKnobEventArgs(); - e.Value = this.currValue; - this.OnKnobChangeValue( e ); - } - } - get { return this.currValue; } - } - - [ - Category("Knob"), - Description("Style of the knob") - ] - public KnobStyle Style - { - set - { - this.style = value; - this.Invalidate(); - } - get { return this.style; } - } - - [ - Category("Knob"), - Description("Color of the knob") - ] - public Color KnobColor - { - set - { - this.knobColor = value; - this.Invalidate(); - } - get { return this.knobColor; } - } - - [ - Category("Knob"), - Description("Color of the scale") - ] - public Color ScaleColor - { - set - { - this.scaleColor = value; - this.Invalidate(); - } - get { return this.scaleColor; } - } - - [ - Category("Knob"), - Description("Color of the indicator") - ] - public Color IndicatorColor - { - set - { - this.indicatorColor = value; - this.Invalidate(); - } - get { return this.indicatorColor; } - } - - [ - Category("Knob"), - Description("Offset of the indicator from the kob border") - ] - public float IndicatorOffset - { - set - { - this.indicatorOffset = value; - this.CalculateDimensions(); - this.Invalidate(); - } - get { return this.indicatorOffset; } - } - - [Browsable(false)] - public PointF KnobCenter - { - set { this.knobCenter = value; } - get { return this.knobCenter; } - } - - [Browsable(false)] - public RectangleF KnobRect - { - set { this.knobRect = value; } - get { return this.knobRect; } - } - - [Browsable(false)] - public float DrawRatio - { - set { this.drawRatio = value; } - get { return this.drawRatio; } - } - #endregion - - #region (* Events delegates *) - - protected override bool ProcessCmdKey(ref Message msg, Keys keyData) - { - bool blResult = true; - - /// - /// Specified WM_KEYDOWN enumeration value. - /// - const int WM_KEYDOWN = 0x0100; - - /// - /// Specified WM_SYSKEYDOWN enumeration value. - /// - const int WM_SYSKEYDOWN = 0x0104; - - float val = this.Value; - - if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN)) - { - switch(keyData) - { - case Keys.Up: - val += this.StepValue; - if ( val <= this.MaxValue ) - this.Value = val; - break; - - case Keys.Down: - val -= this.StepValue; - if ( val >= this.MinValue ) - this.Value = val; - break; - - case Keys.PageUp: - if ( val < this.MaxValue ) - { - val += ( this.StepValue * 10 ); - this.Value = val; - } - break; - - case Keys.PageDown: - if ( val > this.MinValue ) - { - val -= ( this.StepValue * 10 ); - this.Value = val; - } - break; - - case Keys.Home: - this.Value = this.MinValue; - break; - - case Keys.End: - this.Value = this.MaxValue; - break; - - default: - blResult = base.ProcessCmdKey(ref msg,keyData); - break; - } - } - - return blResult; - } - - [System.ComponentModel.EditorBrowsableAttribute()] - protected override void OnClick(EventArgs e) - { - this.Focus(); - this.Invalidate(); - base.OnClick(e); - } - - void OnMouseUp(object sender, MouseEventArgs e) - { - this.isKnobRotating = false; - - if (this.knobRect.Contains(e.Location) == false) - return; - - float val = this.GetValueFromPosition ( e.Location ); - if ( val != this.Value ) - { - this.Value = val; - this.Invalidate(); - } - } - - void OnMouseDown(object sender, MouseEventArgs e) - { - if (this.knobRect.Contains(e.Location) == false) - return; - - this.isKnobRotating = true; - - this.Focus(); - } - - void OnMouseMove(object sender, MouseEventArgs e) - { - if ( this.isKnobRotating == false ) - return; - - float val = this.GetValueFromPosition ( e.Location ); - if ( val != this.Value ) - { - this.Value = val; - this.Invalidate (); - } - } - - void OnKeyDown(object sender, KeyEventArgs e) - { - float val = this.Value; - - switch ( e.KeyCode ) - { - case Keys.Up: - val = this.Value + this.StepValue; - break; - - case Keys.Down: - val = this.Value - this.StepValue; - break; - } - - if ( val < this.MinValue ) - val = this.MinValue; - - if ( val > this.MaxValue ) - val = this.MaxValue; - - this.Value = val; - } - #endregion - - #region (* Virtual methods *) - public virtual float GetValueFromPosition ( PointF position ) - { - float degree = 0.0F; - float v = 0.0F; - - PointF center = this.KnobCenter; - - if ( position.X <= center.X ) - { - degree = (center.Y - position.Y ) / (center.X - position.X ); - degree = (float)Math.Atan(degree); - degree = (float)((degree) * (180F / Math.PI) + 45F); - v = (degree * ( this.MaxValue - this.MinValue )/ 270F); - } - else - { - if ( position.X > center.X ) - { - degree = (position.Y - center.Y ) / (position.X - center.X ); - degree = (float)Math.Atan(degree); - degree = (float)(225F + (degree) * (180F / Math.PI)); - v = (degree * ( this.MaxValue - this.MinValue ) / 270F); - } - } - - if ( v > this.MaxValue ) - v = this.MaxValue; - - if (v < this.MinValue ) - v = this.MinValue; - - return v; - } - - public virtual PointF GetPositionFromValue ( float val ) - { - PointF pos = new PointF( 0.0F, 0.0F ); - - // Elimina la divisione per 0 - if ( ( this.MaxValue - this.MinValue ) == 0 ) - return pos; - - float _indicatorOffset = this.IndicatorOffset * this.drawRatio; - - float degree = 270F * val / ( this.MaxValue - this.MinValue ); - degree = (degree + 135F) * (float)Math.PI / 180F; - - pos.X = (int)(Math.Cos(degree) * ((this.knobRect.Width * 0.5F) - indicatorOffset) + this.knobRect.X + (this.knobRect.Width * 0.5F)); - pos.Y = (int)(Math.Sin(degree) * ((this.knobRect.Width * 0.5F) - indicatorOffset) + this.knobRect.Y + (this.knobRect.Height * 0.5F)); - - return pos; - } - #endregion - - #region (* Fire events *) - public event KnobChangeValue KnobChangeValue; - protected virtual void OnKnobChangeValue( LBKnobEventArgs e ) - { - if( this.KnobChangeValue != null ) - this.KnobChangeValue( this, e ); - } - #endregion - - #region (* Overrided method *) - protected override ILBRenderer CreateDefaultRenderer() - { - return new LBKnobRenderer(); - } - #endregion - } - - #region (* Classes for event and event delagates args *) - - #region (* Event args class *) - /// - /// Class for events delegates - /// - public class LBKnobEventArgs : EventArgs - { - private float val; - - public LBKnobEventArgs() - { - } - - public float Value - { - get { return this.val; } - set { this.val = value; } - } - } - #endregion - - #region (* Delegates *) - public delegate void KnobChangeValue ( object sender, LBKnobEventArgs e ); - #endregion - - #endregion -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.resx deleted file mode 100644 index 7080a7d..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Knob/LBKnob.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/LBIndustrialCtrls.csproj b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/LBIndustrialCtrls.csproj deleted file mode 100644 index f53dc4f..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/LBIndustrialCtrls.csproj +++ /dev/null @@ -1,176 +0,0 @@ - - - {B4218BC9-9736-42B9-BC99-7903FDBEBA28} - Debug - AnyCPU - Library - LBIndustrialCtrls - LBIndustrialCtrls - False - False - 4 - false - - - - - 3.5 - v4.5.2 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - bin\Debug\ - true - Full - False - True - DEBUG;TRACE - - - bin\Release\ - False - None - True - False - TRACE - - - False - Auto - 4194304 - AnyCPU - 4096 - - - MinimumRecommendedRules.ruleset - false - - - MinimumRecommendedRules.ruleset - false - - - true - - - - - - - - - - - - UserControl - - - LBIndustrialCtrlBase.cs - - - - UserControl - - - LBButton.cs - - - - - UserControl - - - - UserControl - - - LBLed.cs - - - - UserControl - - - LB7SegmentDisplay.cs - - - - UserControl - - - - UserControl - - - LBDigitalMeter.cs - - - - - - - - LBButton.cs - - - LBKnob.cs - - - LBLed.cs - - - LB7SegmentDisplay.cs - - - LBDigitalMeter.cs - - - - - - False - .NET Framework Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - false - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.Designer.cs deleted file mode 100644 index df31d58..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.Designer.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Creato da SharpDevelop. - * Utente: lucabonotto - * Data: 26/03/2009 - * Ora: 10.42 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ -namespace LBSoft.IndustrialCtrls.Leds - -{ - partial class LB7SegmentDisplay - { - /// - /// Designer variable used to keep track of non-visual components. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Disposes resources used by the control. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing) { - if (components != null) { - components.Dispose(); - } - } - base.Dispose(disposing); - } - - /// - /// This method is required for Windows Forms designer support. - /// Do not change the method contents inside the source code editor. The Forms designer might - /// not be able to load this method if it was changed manually. - /// - private void InitializeComponent() - { - this.SuspendLayout(); - // - // LB7SegmentDisplay - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Name = "LB7SegmentDisplay"; - this.Size = new System.Drawing.Size(44, 65); - this.ResumeLayout(false); - } - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.cs deleted file mode 100644 index 7988a1c..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.cs +++ /dev/null @@ -1,59 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBLed.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.Collections; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Leds -{ - /// - /// Description of LB7SegmentDisplay. - /// - public partial class LB7SegmentDisplay : LBIndustrialCtrlBase - { - #region (* Constructor *) - public LB7SegmentDisplay() - { - InitializeComponent(); - } - #endregion - - #region (* Properties *) - public int val = 0; - [ - Category("Display"), - Description("Value of the display") - ] - public int Value - { - set { this.val = value; this.Invalidate(); } - get { return this.val; } - } - - private bool showDp = false; - [ - Category("Display"), - Description("Show the point of the display") - ] - public bool ShowDP - { - set { this.showDp = value; this.Invalidate(); } - get { return this.showDp; } - } - #endregion - - #region (* Overrided methods *) - protected override ILBRenderer CreateDefaultRenderer() - { - return new LB7SegmentDisplayRenderer(); - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.resx deleted file mode 100644 index 7080a7d..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplay.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplayRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplayRenderer.cs deleted file mode 100644 index dc7f060..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LB7SegmentDisplayRenderer.cs +++ /dev/null @@ -1,608 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBLed.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Windows.Forms; -using LBSoft.IndustrialCtrls.Base; - -using LBSoft.IndustrialCtrls.Utils; - -namespace LBSoft.IndustrialCtrls.Leds -{ - /// - /// Description of LB7SegmentDisplayRenderer. - /// - public class LB7SegmentDisplayRenderer : LBRendererBase - { - #region (* Constants *) - public const int WIDTH_PIXEL = 11; - public const int HEIGHT_PIXELS = 18; - #endregion - - #region (* Variables *) - /// - /// Segments data array - /// - protected SegmentDictionary segments = new SegmentDictionary(); - /// - /// Defaults points coordinates - /// - protected PointsList defPoints = new PointsList(); - /// - /// List of the points coordinates - /// - protected PointsList points = new PointsList(); - /// - /// Segments list of a value - /// - protected SegmentsValueDictionary valuesSegments = new SegmentsValueDictionary(); - /// - /// Rectangle of the dp - /// - protected RectangleF rectDP = new RectangleF(); - #endregion - - #region (* Contructor *) - public LB7SegmentDisplayRenderer() - { - this.CreateSegmetsData(); - this.CreateDefPointsCoordinates(); - this.CreateSegmentsValuesList(); - this.UpdatePointsCoordinates(); - } - #endregion - - #region (* Overrided methods *) - public override bool Update() - { - this.UpdatePointsCoordinates(); - return true; - } - - public override void Draw(Graphics Gr) - { - if (Gr == null) - throw new ArgumentNullException("Gr"); - - LB7SegmentDisplay ctrl = this.Display; - if (ctrl == null) - throw new NullReferenceException("Associated control is not valid"); - - RectangleF _rc = new RectangleF(0, 0, ctrl.Width, ctrl.Height); - Gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; - - this.DrawBackground(Gr, _rc); - this.DrawOffSegments(Gr, _rc); - this.DrawValue(Gr, _rc); - } - #endregion - - #region (* Properies *) - [Browsable(false)] - public LB7SegmentDisplay Display - { - set { this.Control = value; } - get { return this.Control as LB7SegmentDisplay; } - } - - [Browsable(false)] - public SegmentDictionary Segments - { - get { return this.segments; } - } - #endregion - - #region (* Virtual methods *) - /// - /// Creation of the default points list of the - /// all segments - /// - protected virtual void CreateDefPointsCoordinates() - { - PointF pt = new PointF(3F, 1F); - this.defPoints.Add(pt); - pt = new PointF(8F, 1F); - this.defPoints.Add(pt); - pt = new PointF(9F, 2F); - this.defPoints.Add(pt); - pt = new PointF(10F, 3F); - this.defPoints.Add(pt); - pt = new PointF(10F, 8F); - this.defPoints.Add(pt); - pt = new PointF(9F, 9F); - this.defPoints.Add(pt); - pt = new PointF(10F, 10F); - this.defPoints.Add(pt); - pt = new PointF(10F, 15F); - this.defPoints.Add(pt); - pt = new PointF(9F, 16F); - this.defPoints.Add(pt); - pt = new PointF(8F, 17F); - this.defPoints.Add(pt); - pt = new PointF(3F, 17F); - this.defPoints.Add(pt); - pt = new PointF(2F, 16F); - this.defPoints.Add(pt); - pt = new PointF(1F, 15F); - this.defPoints.Add(pt); - pt = new PointF(1F, 10F); - this.defPoints.Add(pt); - pt = new PointF(2F, 9F); - this.defPoints.Add(pt); - pt = new PointF(1F, 8F); - this.defPoints.Add(pt); - pt = new PointF(1F, 3F); - this.defPoints.Add(pt); - pt = new PointF(2F, 2F); - this.defPoints.Add(pt); - pt = new PointF(3F, 3F); - this.defPoints.Add(pt); - pt = new PointF(8F, 3F); - this.defPoints.Add(pt); - pt = new PointF(8F, 8F); - this.defPoints.Add(pt); - pt = new PointF(8F, 10F); - this.defPoints.Add(pt); - pt = new PointF(8F, 15F); - this.defPoints.Add(pt); - pt = new PointF(3F, 15F); - this.defPoints.Add(pt); - pt = new PointF(3F, 10F); - this.defPoints.Add(pt); - pt = new PointF(3F, 8F); - this.defPoints.Add(pt); - } - - /// - /// Create the dictionary of the - /// segment coordinates - /// - protected virtual void CreateSegmetsData() - { - this.Segments.Clear(); - - Segment s = new Segment(); - s.PointsIndexs[0] = 0; - s.PointsIndexs[1] = 1; - s.PointsIndexs[2] = 2; - s.PointsIndexs[3] = 19; - s.PointsIndexs[4] = 18; - s.PointsIndexs[5] = 17; - this.Segments.Add('A', s); - - s = new Segment(); - s.PointsIndexs[0] = 2; - s.PointsIndexs[1] = 3; - s.PointsIndexs[2] = 4; - s.PointsIndexs[3] = 5; - s.PointsIndexs[4] = 20; - s.PointsIndexs[5] = 19; - this.Segments.Add('B', s); - - s = new Segment(); - s.PointsIndexs[0] = 6; - s.PointsIndexs[1] = 7; - s.PointsIndexs[2] = 8; - s.PointsIndexs[3] = 22; - s.PointsIndexs[4] = 21; - s.PointsIndexs[5] = 5; - this.Segments.Add('C', s); - - s = new Segment(); - s.PointsIndexs[0] = 9; - s.PointsIndexs[1] = 10; - s.PointsIndexs[2] = 11; - s.PointsIndexs[3] = 23; - s.PointsIndexs[4] = 22; - s.PointsIndexs[5] = 8; - this.Segments.Add('D', s); - - s = new Segment(); - s.PointsIndexs[0] = 12; - s.PointsIndexs[1] = 13; - s.PointsIndexs[2] = 14; - s.PointsIndexs[3] = 24; - s.PointsIndexs[4] = 23; - s.PointsIndexs[5] = 11; - this.Segments.Add('E', s); - - s = new Segment(); - s.PointsIndexs[0] = 15; - s.PointsIndexs[1] = 16; - s.PointsIndexs[2] = 17; - s.PointsIndexs[3] = 18; - s.PointsIndexs[4] = 25; - s.PointsIndexs[5] = 14; - this.Segments.Add('F', s); - - s = new Segment(); - s.PointsIndexs[0] = 25; - s.PointsIndexs[1] = 20; - s.PointsIndexs[2] = 5; - s.PointsIndexs[3] = 21; - s.PointsIndexs[4] = 24; - s.PointsIndexs[5] = 14; - this.Segments.Add('G', s); - } - - /// - /// Create the dictionary of the segments - /// for the number values - /// - protected virtual void CreateSegmentsValuesList() - { - SegmentsList list = new SegmentsList(); - list.Add('A'); - list.Add('B'); - list.Add('C'); - list.Add('D'); - list.Add('E'); - list.Add('F'); - this.valuesSegments.Add(0, list); - - list = new SegmentsList(); - list.Add('B'); - list.Add('C'); - this.valuesSegments.Add(1, list); - - list = new SegmentsList(); - list.Add('A'); - list.Add('B'); - list.Add('G'); - list.Add('E'); - list.Add('D'); - this.valuesSegments.Add(2, list); - - list = new SegmentsList(); - list.Add('A'); - list.Add('B'); - list.Add('G'); - list.Add('C'); - list.Add('D'); - this.valuesSegments.Add(3, list); - - list = new SegmentsList(); - list.Add('F'); - list.Add('G'); - list.Add('B'); - list.Add('C'); - this.valuesSegments.Add(4, list); - - list = new SegmentsList(); - list.Add('A'); - list.Add('F'); - list.Add('G'); - list.Add('C'); - list.Add('D'); - this.valuesSegments.Add(5, list); - - list = new SegmentsList(); - list.Add('A'); - list.Add('F'); - list.Add('G'); - list.Add('C'); - list.Add('D'); - list.Add('E'); - this.valuesSegments.Add(6, list); - - list = new SegmentsList(); - list.Add('A'); - list.Add('B'); - list.Add('C'); - this.valuesSegments.Add(7, list); - - list = new SegmentsList(); - list.Add('A'); - list.Add('B'); - list.Add('C'); - list.Add('D'); - list.Add('E'); - list.Add('F'); - list.Add('G'); - this.valuesSegments.Add(8, list); - - list = new SegmentsList(); - list.Add('A'); - list.Add('B'); - list.Add('C'); - list.Add('D'); - list.Add('F'); - list.Add('G'); - this.valuesSegments.Add(9, list); - - list = new SegmentsList(); - list.Add('G'); - this.valuesSegments.Add((int)'-', list); - - list = new SegmentsList(); - list.Add('A'); - list.Add('D'); - list.Add('E'); - list.Add('F'); - list.Add('G'); - this.valuesSegments.Add((int)'E', list); - } - - /// - /// Calculate the points coordinates for drawing - /// with the ratio of the control - /// - protected virtual void UpdatePointsCoordinates() - { - this.points.Clear(); - - double rappW = 1; - double rappH = 1; - - if (this.Display != null) - { - rappW = (double)this.Display.Width / (double)WIDTH_PIXEL; - rappH = (double)this.Display.Height / (double)HEIGHT_PIXELS; - } - - for (int idx = 0; idx < this.defPoints.Count; idx++) - { - PointF ptDef = this.defPoints[idx]; - PointF pt = new PointF((float)((double)ptDef.X * rappW), (float)((double)ptDef.Y * rappH)); - this.points.Add ( pt ); - } - - this.rectDP.X = this.points[7].X - (float)(0.5 * rappW); - this.rectDP.Y = this.points[8].Y; - this.rectDP.Width = (float)rappW; - this.rectDP.Height = (float)rappH; - } - - /// - /// Draw the control background - /// - /// - /// - /// - protected virtual bool DrawBackground(Graphics gr, RectangleF rc) - { - if (this.Display == null) - return false; - - Color c = this.Display.BackColor; - SolidBrush br = new SolidBrush(c); - Pen pen = new Pen(c); - - Rectangle _rcTmp = new Rectangle(0, 0, this.Display.Width, this.Display.Height); - gr.DrawRectangle(pen, _rcTmp); - gr.FillRectangle(br, rc); - - br.Dispose(); - pen.Dispose(); - - return true; - } - - /// - /// Draw all the segments in the off state - /// - /// - /// - /// - protected virtual bool DrawOffSegments(Graphics gr, RectangleF rc) - { - if (this.Display == null) - return false; - -// SolidBrush br = new SolidBrush(LBColorManager.StepColor(this.Display.ForeColor, 30)); - Color clr = Color.FromArgb(70, this.Display.ForeColor); - SolidBrush br = new SolidBrush(clr); - - foreach (Segment seg in this.Segments.Values) - { - GraphicsPath pth = new GraphicsPath(); - - for (int idx = 0; idx < seg.PointsIndexs.Length - 1; idx++) - { - PointF pt1 = this.points[seg.PointsIndexs[idx]]; - PointF pt2 = this.points[seg.PointsIndexs[idx + 1]]; - pth.AddLine(pt1, pt2); - } - pth.CloseFigure(); - - gr.FillPath(br, pth); - - pth.Dispose(); - } - - gr.FillEllipse(br, this.rectDP); - - br.Dispose(); - return true; - } - - /// - /// Draw the segments in on state - /// - /// - /// - /// - protected virtual bool DrawValue(Graphics gr, RectangleF rc) - { - if (this.Display == null) - return false; - - if (this.valuesSegments.Contains(this.Display.Value) == false) - return false; - - SegmentsList list = this.valuesSegments[this.Display.Value]; - if (list == null) - return false; - - SolidBrush br = new SolidBrush(this.Display.ForeColor); - - foreach (char ch in list) - { - Segment seg = this.segments[ch]; - if (seg != null) - { - GraphicsPath pth = new GraphicsPath(); - - for (int idx = 0; idx < seg.PointsIndexs.Length - 1; idx++) - { - PointF pt1 = this.points[seg.PointsIndexs[idx]]; - PointF pt2 = this.points[seg.PointsIndexs[idx + 1]]; - pth.AddLine(pt1, pt2); - } - pth.CloseFigure(); - - gr.FillPath(br, pth); - - pth.Dispose(); - } - } - - if (this.Display.ShowDP != false) - gr.FillEllipse(br, this.rectDP); - - br.Dispose(); - - return true; - } - #endregion - } - - /// - /// Dictionary for the segment associated - /// to the number - /// - public class SegmentDictionary : DictionaryBase - { - public Segment this[char ch] - { - set - { - if (Dictionary.Contains(ch) == false) - this.Add(ch, value); - else - Dictionary[ch] = value; - } - get - { - if (Dictionary.Contains(ch) == false) - return null; - - return (Segment)this.Dictionary[ch]; - } - } - - public void Add(char ch, Segment seg) - { - if (this.Contains(ch) == false) - this.Dictionary.Add(ch, seg); - else - this[ch] = seg; - } - - public bool Contains(char ch) - { - return this.Dictionary.Contains(ch); - } - - public ICollection Values - { - get { return this.Dictionary.Values; } - } - - public ICollection Keys - { - get { return this.Dictionary.Keys; } - } - } - - /// - /// Class for the segment data - /// - public class Segment - { - private int[] points = new int[6]; - public Segment() - { - } - - public int[] PointsIndexs - { - get { return this.points; } - } - } - - /// - /// Points list - /// - public class PointsList : List - { - public PointsList() - { - } - } - - /// - /// Segments list - /// - public class SegmentsList : List - { - public SegmentsList() - { - } - } - - /// - /// Dictionary for value to segments - /// - public class SegmentsValueDictionary : DictionaryBase - { - public SegmentsList this[int num] - { - set - { - if (Dictionary.Contains(num) == false) - this.Add(num, value); - else - Dictionary[num] = value; - } - get - { - if (Dictionary.Contains(num) == false) - return null; - - return (SegmentsList)this.Dictionary[num]; - } - } - - public void Add(int num, SegmentsList seg) - { - if (this.Contains(num) == false) - this.Dictionary.Add(num, seg); - else - this[num] = seg; - } - - public bool Contains(int ch) - { - return this.Dictionary.Contains(ch); - } - - public ICollection Values - { - get { return this.Dictionary.Values; } - } - - public ICollection Keys - { - get { return this.Dictionary.Keys; } - } - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.Designer.cs deleted file mode 100644 index 69428c4..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.Designer.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Creato da SharpDevelop. - * Utente: lucabonotto - * Data: 26/02/2008 - * Ora: 11.44 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ -namespace LBSoft.IndustrialCtrls.Leds -{ - public partial class LBLed - { - /// - /// Designer variable used to keep track of non-visual components. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Disposes resources used by the control. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing) { - if (components != null) { - components.Dispose(); - } - } - base.Dispose(disposing); - } - - /// - /// This method is required for Windows Forms designer support. - /// Do not change the method contents inside the source code editor. The Forms designer might - /// not be able to load this method if it was changed manually. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.tmrBlink = new System.Windows.Forms.Timer(this.components); - this.SuspendLayout(); - // - // tmrBlink - // - this.tmrBlink.Interval = 500; - this.tmrBlink.Tick += new System.EventHandler(this.OnBlink); - // - // LBLed - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Name = "LBLed"; - this.ResumeLayout(false); - } - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.cs deleted file mode 100644 index 8ac2442..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.cs +++ /dev/null @@ -1,216 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBLed.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Leds -{ - /// - /// Class for the Led control. - /// - public partial class LBLed : LBIndustrialCtrlBase - { - #region (* Enumeratives *) - public enum LedState - { - Off = 0, - On, - Blink, - } - - public enum LedLabelPosition - { - Left = 0, - Top, - Right, - Bottom, - } - - public enum LedStyle - { - Circular = 0, - Rectangular, - } - - #endregion - - #region (* Properties variables *) - private Color ledColor; - private LedState state; - private LedStyle style; - private LedLabelPosition labelPosition; - private String label = "Led"; - private SizeF ledSize; - private int blinkInterval = 500; - #endregion - - #region (* Class variables *) - private Timer tmrBlink; - private bool blinkIsOn = false; - #endregion - - #region (* Constructor *) - public LBLed() - { - InitializeComponent(); - - this.Size = new Size(20, 20); - this.ledColor = Color.Red; - this.state = LBLed.LedState.Off; - this.style = LBLed.LedStyle.Circular; - this.blinkIsOn = false; - this.ledSize = new SizeF ( 10F, 10F ); - this.labelPosition = LedLabelPosition.Top; - } - #endregion - - #region (* Properties *) - [ - Category("Led"), - Description("Style of the led") - ] - public LedStyle Style - { - get { return style; } - set - { - style = value; - this.CalculateDimensions(); - } - } - [ - Category("Led"), - Description("Color of the led") - ] - public Color LedColor - { - get { return ledColor; } - set - { - ledColor = value; - Invalidate(); - } - } - - - [ - Category("Led"), - Description("State of the led") - ] - public LedState State - { - get { return state; } - set - { - state = value; - if ( state == LedState.Blink ) - { - this.blinkIsOn = true; - this.tmrBlink.Interval = this.BlinkInterval; - this.tmrBlink.Start(); - } - else - { - this.blinkIsOn = true; - this.tmrBlink.Stop(); - } - - Invalidate(); - } - } - - - [ - Category("Led"), - Description("Size of the led") - ] - public SizeF LedSize - { - get { return this.ledSize; } - set - { - this.ledSize = value; - this.CalculateDimensions(); - Invalidate(); - } - } - - - [ - Category("Led"), - Description("Label of the led") - ] - public String Label - { - get { return this.label; } - set - { - this.label = value; - Invalidate(); - } - } - - - [ - Category("Led"), - Description("Position of the label of the led") - ] - public LedLabelPosition LabelPosition - { - get { return this.labelPosition; } - set - { - this.labelPosition = value; - this.CalculateDimensions(); - Invalidate(); - } - } - - - [ - Category("Led"), - Description("Interval for the blink state of the led") - ] - public int BlinkInterval - { - get { return this.blinkInterval; } - set { this.blinkInterval = value; } - } - - [Browsable(false)] - public bool BlinkIsOn - { - get { return this.blinkIsOn; } - } - #endregion - - #region (* Events delegates *) - void OnBlink(object sender, EventArgs e) - { - if ( this.State == LedState.Blink ) - { - if ( this.blinkIsOn == false ) - this.blinkIsOn = true; - else - this.blinkIsOn = false; - - this.Invalidate(); - } - } - #endregion - - #region (* Overrided methods *) - protected override ILBRenderer CreateDefaultRenderer() - { - return new LBLedRenderer(); - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.resx deleted file mode 100644 index 59f96c4..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LBLed.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LedRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LedRenderer.cs deleted file mode 100644 index 60705bd..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Led/LedRenderer.cs +++ /dev/null @@ -1,275 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LedRenderer.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using LBSoft.IndustrialCtrls.Utils; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Leds -{ - /// - /// Base class for the led renderers - /// - public class LBLedRenderer : LBRendererBase - { - #region (* Variables *) - private RectangleF drawRect; - private RectangleF rectLed; - private RectangleF rectLabel; - #endregion - - #region (* Properies *) - /// - /// Get the associated led object - /// - public LBLed Led - { - get { return this.Control as LBLed; } - } - #endregion - - #region (* Overrided method *) - /// - /// Update the rectangles for drawing - /// - /// - public override bool Update() - { - // Check Led object - if (this.Led == null) - throw new NullReferenceException("Invalid 'Led' object"); - - // Dati del rettangolo - float x, y, w, h; - x = 0; - y = 0; - w = this.Led.Size.Width; - h = this.Led.Size.Height; - - // Rettangolo di disegno - drawRect.X = x; - drawRect.Y = y; - drawRect.Width = w - 2; - drawRect.Height = h - 2; - if (drawRect.Width <= 0) - drawRect.Width = 20; - if (drawRect.Height <= 0) - drawRect.Height = 20; - - this.rectLed = drawRect; - this.rectLabel = drawRect; - - if (this.Led.LabelPosition == LBLed.LedLabelPosition.Bottom) - { - this.rectLed.X = (this.rectLed.Width * 0.5F) - (this.Led.LedSize.Width * 0.5F); - this.rectLed.Width = this.Led.LedSize.Width; - this.rectLed.Height = this.Led.LedSize.Height; - - this.rectLabel.Y = this.rectLed.Bottom; - } - - else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Top) - { - this.rectLed.X = (this.rectLed.Width * 0.5F) - (this.Led.LedSize.Width * 0.5F); - this.rectLed.Y = this.rectLed.Height - this.Led.LedSize.Height; - this.rectLed.Width = this.Led.LedSize.Width; - this.rectLed.Height = this.Led.LedSize.Height; - - this.rectLabel.Height = this.rectLed.Top; - } - - else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Left) - { - this.rectLed.X = this.rectLed.Width - this.Led.LedSize.Width; - this.rectLed.Width = this.Led.LedSize.Width; - this.rectLed.Height = this.Led.LedSize.Height; - - this.rectLabel.Width = this.rectLabel.Width - this.rectLed.Width; - } - - else if (this.Led.LabelPosition == LBLed.LedLabelPosition.Right) - { - this.rectLed.Width = this.Led.LedSize.Width; - this.rectLed.Height = this.Led.LedSize.Height; - - this.rectLabel.X = this.rectLed.Right; - } - - return true; - } - - /// - /// Draw the led object - /// - /// - public override void Draw(Graphics Gr) - { - if (Gr == null) - throw new ArgumentNullException("Gr"); - - LBLed ctrl = this.Led; - if (ctrl == null) - throw new NullReferenceException("Associated control is not valid"); - - Rectangle rc = ctrl.Bounds; - - this.DrawBackground(Gr, rc); - - if (this.rectLed.Width <= 0) - this.rectLed.Width = rectLabel.Width; - if (this.rectLed.Height <= 0) - this.rectLed.Height = ctrl.LedSize.Height; - - this.DrawLed(Gr, this.rectLed); - - this.DrawLabel(Gr, this.rectLabel); - } - #endregion - - #region (* Virtual method *) - /// - /// Draw the background of the control - /// - /// - /// - /// - public virtual bool DrawBackground( Graphics Gr, RectangleF rc ) - { - if ( this.Led == null ) - return false; - - Color c = this.Led.BackColor; - SolidBrush br = new SolidBrush ( c ); - Pen pen = new Pen ( c ); - - Rectangle _rcTmp = new Rectangle(0, 0, this.Led.Width, this.Led.Height ); - Gr.DrawRectangle ( pen, _rcTmp ); - Gr.FillRectangle ( br, rc ); - - br.Dispose(); - pen.Dispose(); - - return true; - } - - /// - /// Draw the body of the control - /// - /// - /// - /// - public virtual bool DrawLed( Graphics Gr, RectangleF rc ) - { - if ( this.Led == null ) - return false; - - Color cDarkOff = LBColorManager.StepColor ( Color.LightGray, 20 ); - Color cDarkOn = LBColorManager.StepColor ( this.Led.LedColor, 60 ); - - LinearGradientBrush brOff = new LinearGradientBrush ( rc, - Color.Gray, - cDarkOff, - 45 ); - - LinearGradientBrush brOn = new LinearGradientBrush ( rc, - this.Led.LedColor, - cDarkOn, - 45 ); - if ( this.Led.State == LBLed.LedState.Blink ) - { - if (this.Led.BlinkIsOn == false) - { - if (this.Led.Style == LBLed.LedStyle.Circular) - Gr.FillEllipse(brOff, rc); - else if (this.Led.Style == LBLed.LedStyle.Rectangular) - Gr.FillRectangle(brOff, rc); - } - else - { - if (this.Led.Style == LBLed.LedStyle.Circular) - Gr.FillEllipse(brOn, rc); - else if (this.Led.Style == LBLed.LedStyle.Rectangular) - Gr.FillRectangle(brOn, rc); - } - } - else - { - if (this.Led.State == LBLed.LedState.Off) - { - if (this.Led.Style == LBLed.LedStyle.Circular) - Gr.FillEllipse(brOff, rc); - else if (this.Led.Style == LBLed.LedStyle.Rectangular) - Gr.FillRectangle(brOff, rc); - } - else - { - if (this.Led.Style == LBLed.LedStyle.Circular) - Gr.FillEllipse(brOn, rc); - else if (this.Led.Style == LBLed.LedStyle.Rectangular) - Gr.FillRectangle(brOn, rc); - } - } - - brOff.Dispose(); - brOn.Dispose(); - - return true; - } - - /// - /// Draw the text of the control - /// - /// - /// - /// - public virtual bool DrawLabel( Graphics Gr, RectangleF rc ) - { - if ( this.Led == null ) - return false; - - if ( this.Led.Label == String.Empty ) - return false; - - SizeF size = Gr.MeasureString ( this.Led.Label, this.Led.Font ); - - SolidBrush br1 = new SolidBrush ( this.Led.ForeColor ); - - float hPos = 0; - float vPos = 0; - switch ( this.Led.LabelPosition ) - { - case LBLed.LedLabelPosition.Top: - hPos = (float)(rc.Width*0.5F)-(float)(size.Width*0.5F); - vPos = rc.Bottom - size.Height; - break; - - case LBLed.LedLabelPosition.Bottom: - hPos = (float)(rc.Width*0.5F)-(float)(size.Width*0.5F); - break; - - case LBLed.LedLabelPosition.Left: - hPos = rc.Width - size.Width; - vPos = (float)(rc.Height*0.5F)-(float)(size.Height*0.5F); - break; - - case LBLed.LedLabelPosition.Right: - vPos = (float)(rc.Height*0.5F)-(float)(size.Height*0.5F); - break; - } - - Gr.DrawString ( this.Led.Label, - this.Led.Font, - br1, - rc.Left + hPos, - rc.Top + vPos ); - - return true; - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.Designer.cs deleted file mode 100644 index b6f7632..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.Designer.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Creato da SharpDevelop. - * Utente: lucabonotto - * Data: 03/04/2008 - * Ora: 14.34 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ -namespace LBSoft.IndustrialCtrls.Meters -{ - public partial class LBAnalogMeter - { - /// - /// Designer variable used to keep track of non-visual components. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Disposes resources used by the form. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing) { - if (components != null) { - components.Dispose(); - } - } - base.Dispose(disposing); - } - - /// - /// This method is required for Windows Forms designer support. - /// Do not change the method contents inside the source code editor. The Forms designer might - /// not be able to load this method if it was changed manually. - /// - private void InitializeComponent() - { - // - // UserControl1 - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Name = "LBAnalogMeter"; - } - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.cs deleted file mode 100644 index a044b65..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBAnalogMeter.cs +++ /dev/null @@ -1,256 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBAnalogMeter.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Meters -{ - /// - /// Class for the analog meter control - /// - public partial class LBAnalogMeter : LBIndustrialCtrlBase - { - #region (* Enumerator *) - public enum AnalogMeterStyle - { - Circular = 0, - }; - #endregion - - #region (* Properties variables *) - private AnalogMeterStyle meterStyle; - private Color bodyColor; - private Color needleColor; - private Color scaleColor; - private bool viewGlass; - private double currValue; - private double minValue; - private double maxValue; - private int scaleDivisions; - private int scaleSubDivisions; - private LBMeterThresholdCollection listThreshold; - #endregion - - #region (* Class variables *) - protected float startAngle; - protected float endAngle; - #endregion - - #region (* Costructors *) - public LBAnalogMeter() - { - // Initialization - InitializeComponent(); - - // Properties initialization - this.bodyColor = Color.Red; - this.needleColor = Color.Yellow; - this.scaleColor = Color.White; - this.meterStyle = AnalogMeterStyle.Circular; - this.viewGlass = false; - this.startAngle = 135; - this.endAngle = 405; - this.minValue = 0; - this.maxValue = 1; - this.currValue = 0; - this.scaleDivisions = 10; - this.scaleSubDivisions = 10; - - // Create the sector list - this.listThreshold = new LBMeterThresholdCollection(); - - this.CalculateDimensions(); - } - #endregion - - #region (* Properties *) - [ - Category("Analog Meter"), - Description("Style of the control") - ] - public AnalogMeterStyle MeterStyle - { - get { return meterStyle;} - set - { - meterStyle = value; - Invalidate(); - } - } - - - [ - Category("Analog Meter"), - Description("Color of the body of the control") - ] - public Color BodyColor - { - get { return bodyColor; } - set - { - bodyColor = value; - Invalidate(); - } - } - - - [ - Category("Analog Meter"), - Description("Color of the needle") - ] - public Color NeedleColor - { - get { return needleColor; } - set - { - needleColor = value; - Invalidate(); - } - } - - - [ - Category("Analog Meter"), - Description("Show or hide the glass effect") - ] - public bool ViewGlass - { - get { return viewGlass; } - set - { - viewGlass = value; - Invalidate(); - } - } - - - [ - Category("Analog Meter"), - Description("Color of the scale of the control") - ] - public Color ScaleColor - { - get { return scaleColor; } - set - { - scaleColor = value; - Invalidate(); - } - } - - - [ - Category("Analog Meter"), - Description("Value of the data") - ] - public double Value - { - get { return currValue; } - set - { - double val = value; - if ( val > maxValue ) - val = maxValue; - - if ( val < minValue ) - val = minValue; - - currValue = val; - Invalidate(); - } - } - - - [ - Category("Analog Meter"), - Description("Minimum value of the data") - ] - public double MinValue - { - get { return minValue; } - set - { - minValue = value; - Invalidate(); - } - } - - - [ - Category("Analog Meter"), - Description("Maximum value of the data") - ] - public double MaxValue - { - get { return maxValue; } - set - { - maxValue = value; - Invalidate(); - } - } - - - [ - Category("Analog Meter"), - Description("Number of the scale divisions") - ] - public int ScaleDivisions - { - get { return scaleDivisions; } - set - { - scaleDivisions = value; - this.CalculateDimensions(); - } - } - - - [ - Category("Analog Meter"), - Description("Number of the scale subdivisions") - ] - public int ScaleSubDivisions - { - get { return scaleSubDivisions; } - set - { - scaleSubDivisions = value; - this.CalculateDimensions(); - } - } - - [Browsable(false)] - public LBMeterThresholdCollection Thresholds - { - get { return this.listThreshold; } - } - #endregion - - #region (* Public methods *) - public float GetStartAngle() - { - return this.startAngle; - } - - public float GetEndAngle() - { - return this.endAngle; - } - #endregion - - #region (* Overrided methods *) - protected override ILBRenderer CreateDefaultRenderer() - { - return new LBAnalogMeterRenderer(); - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.Designer.cs deleted file mode 100644 index ec464cc..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.Designer.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace LBSoft.IndustrialCtrls.Meters -{ - partial class LBDigitalMeter - { - /// - /// Variabile di progettazione necessaria. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Liberare le risorse in uso. - /// - /// ha valore true se le risorse gestite devono essere eliminate, false in caso contrario. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Codice generato da Progettazione componenti - - /// - /// Metodo necessario per il supporto della finestra di progettazione. Non modificare - /// il contenuto del metodo con l'editor di codice. - /// - private void InitializeComponent() - { - this.SuspendLayout(); - // - // LBDigitalMeter - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Name = "LBDigitalMeter"; - this.Size = new System.Drawing.Size(385, 150); - this.ResumeLayout(false); - - } - - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.cs deleted file mode 100644 index a3b8b6d..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.cs +++ /dev/null @@ -1,323 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBDigitalMeter.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using LBSoft.IndustrialCtrls.Leds; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Meters -{ - /// - /// Class for the digital meter - /// - public partial class LBDigitalMeter : LBIndustrialCtrlBase - { - #region (* Class variables *) - protected int _dpPos = 0; - protected int _numDigits = 0; - #endregion - - #region (* Constructor *) - public LBDigitalMeter() - { - InitializeComponent(); - - // Transparent background - this.BackColor = Color.Black; - - this.Format = "000"; - } - #endregion - - #region (* Properties *) - /// - /// Background color - /// - public override Color BackColor - { - get - { - return base.BackColor; - } - set - { - base.BackColor = value; - - foreach (Control disp in this.Controls) - { - if (disp.GetType() == typeof(LB7SegmentDisplay)) - { - LB7SegmentDisplay d = disp as LB7SegmentDisplay; - - d.BackColor = value; - } - } - } - } - - /// - /// Color of the display - /// - public override Color ForeColor - { - get - { - return base.ForeColor; - } - set - { - base.ForeColor = value; - - foreach (Control disp in this.Controls) - { - if (disp.GetType() == typeof(LB7SegmentDisplay)) - { - LB7SegmentDisplay d = disp as LB7SegmentDisplay; - - d.ForeColor = value; - } - } - } - } - - /// - /// Set the sign of the display - /// - private bool _signed = false; - [ - Category("Digital meter"), - Description("Set the signed value of the meter") - ] - public bool Signed - { - set - { - if (this._signed == value) - return; - - this._signed = value; - - this.UpdateControls(); - } - - get { return this._signed; } - } - - /// - /// Set the format of the display, without the sign - /// - private string _format = string.Empty; - [ - Category("Digital meter"), - Description("Format of the display value") - ] - public string Format - { - set - { - if (this._format == value) - return; - - this._format = value; - - this.UpdateControls(); - - this.Value = this.Value; - } - - get { return this._format; } - } - - /// - /// Set the value of the display - /// - private double val = 0.0; - [ - Category("Digital meter"), - Description("Value to display") - ] - public double Value - { - set - { - this.val = value; - - string str = this.val.ToString(this.Format); - str = str.Replace ( ".", string.Empty ); - str = str.Replace ( ",", string.Empty ); - - bool sign = false; - if (str[0] == '-') - { - sign = true; - str = str.TrimStart(new char[] { '-' }); - } - - if ( str.Length > this._numDigits ) - { - foreach (LB7SegmentDisplay d in this.Controls) - d.Value = (int)'E'; - - return; - } - - int idx = 0; - for (idx = str.Length - 1; idx >= 0; idx--) - { - int id = idx; - if (this.Signed != false) - id++; - LB7SegmentDisplay d = this.Controls[id] as LB7SegmentDisplay; - d.Value = Convert.ToInt32(str[idx].ToString()); - } - - LB7SegmentDisplay s = this.Controls["digit_sign"] as LB7SegmentDisplay; - if (s != null) - { - if (sign != false) - s.Value = (int)'-'; - else - s.Value = -1; - } - } - - get { return this.val; } - } - #endregion - - #region (* Overrided methods *) - /// - /// Create the default renderer - /// - /// - protected override ILBRenderer CreateDefaultRenderer() - { - return new LBDigitalMeterRenderer(); - } - /// - /// Resize of the control - /// - /// - protected override void OnResize(EventArgs e) - { - base.OnResize(e); - this.RepositionControls(); - } - #endregion - - #region (* Protected methods *) - /// - /// Update the controls of the meter - /// - protected virtual void UpdateControls() - { - int count = this.Format.Length; - - this._dpPos = -1; - - char[] seps = new char[] { '.', ',' }; - int sepIndex = this.Format.IndexOfAny(seps); - if (sepIndex > 0) - { - count--; - this._dpPos = sepIndex - 1; - this._numDigits = count; - } - - this._numDigits = count; - - this.Controls.Clear(); - - if (this.Signed != false) - { - LB7SegmentDisplay disp = new LB7SegmentDisplay(); - disp.Name = "digit_sign"; - disp.Value = -1; - this.Controls.Add(disp); - } - - for (int idx = 0; idx < count; idx++) - { - LB7SegmentDisplay disp = new LB7SegmentDisplay(); - - disp.Name = "digit_" + idx.ToString(); - - disp.Click += this.DisplayClicked; - - if (sepIndex - 1 == idx) - disp.ShowDP = true; - - this.Controls.Add(disp); - } - - this.RepositionControls(); - } - - /// - /// Reposition of the digital displaies - /// - protected void RepositionControls() - { - Rectangle rc = this.ClientRectangle; - - if (this.Controls.Count <= 0) - return; - - int digitW = rc.Width / this.Controls.Count; - bool signFind = false; - foreach (Control disp in this.Controls) - { - if (disp.GetType() == typeof(LB7SegmentDisplay)) - { - LB7SegmentDisplay d = disp as LB7SegmentDisplay; - - int idDigit = 0; - if (d.Name.Contains("digit_sign") != false) - { - signFind = true; - } - else - { - if (d.Name.Contains("digit_") != false) - { - string s = d.Name.Remove(0, 6); - idDigit = Convert.ToInt32(s); - - if (signFind != false) - idDigit++; - } - } - - Point pos = new Point(); - pos.X = idDigit * digitW; - pos.Y = 0; - d.Location = pos; - - Size dim = new Size(); - dim.Width = digitW; - dim.Height = rc.Height; - d.Size = dim; - } - } - } - - /// - /// Event generate from the displaies in the control - /// - /// - /// - private void DisplayClicked(object sender, System.EventArgs e) - { - this.InvokeOnClick(this, e); - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.resx b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.resx deleted file mode 100644 index 19dc0dd..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeter.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeterRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeterRenderer.cs deleted file mode 100644 index 130ced4..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBDigitalMeterRenderer.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Meters -{ - public class LBDigitalMeterRenderer : LBRendererBase - { - #region (* Constructor *) - public LBDigitalMeterRenderer() - { - } - #endregion - - #region (* Overrided methods *) - public override void Draw(Graphics Gr) - { - if (this.Meter == null) - return; - - RectangleF _rc = new RectangleF(0, 0, this.Meter.Width, this.Meter.Height); - Gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; - - this.DrawBackground(Gr, _rc); - this.DrawBorder(Gr, _rc); - } - #endregion - - #region (* Properties *) - public LBDigitalMeter Meter - { - get { return this.Control as LBDigitalMeter; } - } - #endregion - - #region (* Virtual methods *) - public virtual bool DrawBackground(Graphics gr, RectangleF rc) - { - if (this.Meter == null) - return false; - - Color c = this.Meter.BackColor; - SolidBrush br = new SolidBrush(c); - Pen pen = new Pen(c); - - Rectangle _rcTmp = new Rectangle(0, 0, this.Meter.Width, this.Meter.Height); - gr.DrawRectangle(pen, _rcTmp); - gr.FillRectangle(br, rc); - - br.Dispose(); - pen.Dispose(); - - return true; - } - - public virtual bool DrawBorder(Graphics gr, RectangleF rc) - { - if (this.Meter == null) - return false; - - return true; - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBMeterThreshold.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBMeterThreshold.cs deleted file mode 100644 index 04a603d..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/LBMeterThreshold.cs +++ /dev/null @@ -1,165 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBMeterThreshold.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.Collections; -using System.Drawing; - -namespace LBSoft.IndustrialCtrls.Meters -{ - /// - /// Class for the meter threshold - /// - public class LBMeterThreshold - { - #region (* Properties variables *) - private Color color = Color.Empty; - private double startValue = 0.0; - private double endValue = 1.0; - #endregion - - #region (* Constructor *) - public LBMeterThreshold() - { - } - #endregion - - #region (* Properties *) - public Color Color - { - set { this.color = value; } - get { return this.color; } - } - - public double StartValue - { - set { this.startValue = value; } - get { return this.startValue; } - } - - public double EndValue - { - set { this.endValue = value; } - get { return this.endValue; } - } - #endregion - - #region (* Public methods *) - public bool IsInRange ( double val ) - { - if ( val > this.EndValue ) - return false; - - if ( val < this.StartValue ) - return false; - - return true; - } - #endregion - } - - /// - /// Collection of the meter thresolds - /// - public class LBMeterThresholdCollection : CollectionBase - { - #region (* Properties variables *) - private bool _IsReadOnly = false; - #endregion - - #region (* Constructor *) - public LBMeterThresholdCollection() - { - } - #endregion - - #region (* Properties *) - public virtual LBMeterThreshold this[int index] - { - get { return (LBMeterThreshold)InnerList[index]; } - set { InnerList[index] = value; } - } - - public virtual bool IsReadOnly - { - get { return _IsReadOnly; } - } - #endregion - - #region (* Public methods *) - /// - /// Add an object to the collection - /// - /// - public virtual void Add(LBMeterThreshold sector) - { - InnerList.Add(sector); - } - - /// - /// Remove an object from the collection - /// - /// - /// - public virtual bool Remove(LBMeterThreshold sector) - { - bool result = false; - - //loop through the inner array's indices - for (int i = 0; i < InnerList.Count; i++) - { - //store current index being checked - LBMeterThreshold obj = (LBMeterThreshold)InnerList[i]; - - //compare the values of the objects - if ( ( obj.StartValue == sector.StartValue ) && - ( obj.EndValue == sector.EndValue ) ) - { - //remove item from inner ArrayList at index i - InnerList.RemoveAt(i); - result = true; - break; - } - } - - return result; - } - - /// - /// Check if the object is containing in the collection - /// - /// - /// - public bool Contains(LBMeterThreshold sector) - { - //loop through the inner ArrayList - foreach (LBMeterThreshold obj in InnerList) - { - //compare the values of the objects - if ( ( obj.StartValue == sector.StartValue ) && - ( obj.EndValue == sector.EndValue ) ) - { - //if it matches return true - return true; - } - } - - //no match - return false; - } - - /// - /// Copy the collection - /// - /// - /// - public virtual void CopyTo(LBMeterThreshold[] MeterThresholdArray, int index) - { - throw new Exception("This Method is not valid for this implementation."); - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/MeterRenderer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/MeterRenderer.cs deleted file mode 100644 index 9885408..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Meters/MeterRenderer.cs +++ /dev/null @@ -1,397 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: MeterRenderer.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using LBSoft.IndustrialCtrls.Utils; -using LBSoft.IndustrialCtrls.Base; - -namespace LBSoft.IndustrialCtrls.Meters -{ - /// - /// Base class for the renderers of the analog meter - /// - public class LBAnalogMeterRenderer : LBRendererBase - { - #region (* Variables *) - protected PointF needleCenter; - protected RectangleF drawRect; - protected RectangleF glossyRect; - protected RectangleF needleCoverRect; - protected float drawRatio; - #endregion - - #region (* Properties *) - public LBAnalogMeter AnalogMeter - { - get { return this.Control as LBAnalogMeter; } - } - #endregion - - #region (* Overrided method *) - public override bool Update() - { - // Check Button object - if (this.AnalogMeter == null) - throw new NullReferenceException("Invalid 'AnalogMeter' object"); - - // Rectangle - float x, y, w, h; - x = 0; - y = 0; - w = this.AnalogMeter.Size.Width; - h = this.AnalogMeter.Size.Height; - - // Calculate ratio - drawRatio = (Math.Min(w, h)) / 200; - if (drawRatio == 0.0) - drawRatio = 1; - - // Draw rectangle - drawRect.X = x; - drawRect.Y = y; - drawRect.Width = w - 2; - drawRect.Height = h - 2; - - if (w < h) - drawRect.Height = w; - else if (w > h) - drawRect.Width = h; - - if (drawRect.Width < 10) - drawRect.Width = 10; - if (drawRect.Height < 10) - drawRect.Height = 10; - - // Calculate needle center - needleCenter.X = drawRect.X + (drawRect.Width / 2); - needleCenter.Y = drawRect.Y + (drawRect.Height / 2); - - // Needle cover rect - needleCoverRect.X = needleCenter.X - (20 * drawRatio); - needleCoverRect.Y = needleCenter.Y - (20 * drawRatio); - needleCoverRect.Width = 40 * drawRatio; - needleCoverRect.Height = 40 * drawRatio; - - // Glass effect rect - glossyRect.X = drawRect.X + (20 * drawRatio); - glossyRect.Y = drawRect.Y + (10 * drawRatio); - glossyRect.Width = drawRect.Width - (40 * drawRatio); - glossyRect.Height = needleCenter.Y + (30 * drawRatio); - - return false; - } - - public override void Draw(Graphics Gr) - { - if (Gr == null) - throw new ArgumentNullException("Gr"); - - LBAnalogMeter ctrl = this.AnalogMeter; - if (ctrl == null) - throw new NullReferenceException("Associated control is not valid"); - - this.DrawBackground(Gr, ctrl.Bounds); - this.DrawBody(Gr, drawRect); - this.DrawThresholds(Gr, drawRect); - this.DrawDivisions(Gr, drawRect); - this.DrawUM(Gr, drawRect); - this.DrawValue(Gr, drawRect); - this.DrawNeedle(Gr, drawRect); - this.DrawNeedleCover(Gr, this.needleCoverRect); - this.DrawGlass(Gr, this.glossyRect); - } - #endregion - - #region (* Virtual method *) - public virtual bool DrawBackground( Graphics gr, RectangleF rc ) - { - if ( this.AnalogMeter == null ) - return false; - - Color c = this.AnalogMeter.BackColor; - SolidBrush br = new SolidBrush ( c ); - Pen pen = new Pen ( c ); - - Rectangle _rcTmp = new Rectangle(0, 0, this.AnalogMeter.Width, this.AnalogMeter.Height ); - gr.DrawRectangle ( pen, _rcTmp ); - gr.FillRectangle ( br, rc ); - - br.Dispose(); - pen.Dispose(); - - return true; - } - - public virtual bool DrawBody( Graphics Gr, RectangleF rc ) - { - if ( this.AnalogMeter == null ) - return false; - - Color bodyColor = this.AnalogMeter.BodyColor; - Color cDark = LBColorManager.StepColor ( bodyColor, 20 ); - - LinearGradientBrush br1 = new LinearGradientBrush ( rc, - bodyColor, - cDark, - 45 ); - Gr.FillEllipse ( br1, rc ); - - RectangleF _rc = rc; - _rc.X += 3 * drawRatio; - _rc.Y += 3 * drawRatio; - _rc.Width -= 6 * drawRatio; - _rc.Height -= 6 * drawRatio; - - LinearGradientBrush br2 = new LinearGradientBrush ( _rc, - cDark, - bodyColor, - 45 ); - Gr.FillEllipse ( br2, _rc ); - - return true; - } - - public virtual bool DrawThresholds( Graphics Gr, RectangleF rc ) - { - if ( this.AnalogMeter == null ) - return false; - - RectangleF _rc = rc; - _rc.Inflate ( -18F * drawRatio, -18F * drawRatio ); - - double w = _rc.Width; - double radius = w / 2 - ( w * 0.075); - - float startAngle = this.AnalogMeter.GetStartAngle(); - float endAngle = this.AnalogMeter.GetEndAngle(); - float rangeAngle = endAngle - startAngle; - float minValue = (float)this.AnalogMeter.MinValue; - float maxValue = (float)this.AnalogMeter.MaxValue; - - double stepVal = rangeAngle / ( maxValue - minValue ); - - foreach ( LBMeterThreshold sect in this.AnalogMeter.Thresholds ) - { - - float startPathAngle = ( (float)(startAngle + ( stepVal * sect.StartValue ))); - float endPathAngle = ( (float)( ( stepVal * ( sect.EndValue - sect.StartValue )))); - - GraphicsPath pth = new GraphicsPath(); - pth.AddArc ( _rc, startPathAngle, endPathAngle ); - - Pen pen = new Pen( sect.Color, 4.5F * drawRatio ); - - Gr.DrawPath ( pen, pth ); - - pen.Dispose(); - pth.Dispose(); - } - - return false; - } - - public virtual bool DrawDivisions( Graphics Gr, RectangleF rc ) - { - if ( this.AnalogMeter == null ) - return false; - - float startAngle = this.AnalogMeter.GetStartAngle(); - float endAngle = this.AnalogMeter.GetEndAngle(); - float scaleDivisions = this.AnalogMeter.ScaleDivisions; - float scaleSubDivisions = this.AnalogMeter.ScaleSubDivisions; - double minValue = this.AnalogMeter.MinValue; - double maxValue = this.AnalogMeter.MaxValue; - Color scaleColor = this.AnalogMeter.ScaleColor; - - float cx = needleCenter.X; - float cy = needleCenter.Y; - float w = rc.Width; - float h = rc.Height; - - float incr = LBMath.GetRadian(( endAngle - startAngle ) / (( scaleDivisions - 1 )* (scaleSubDivisions + 1))); - float currentAngle = LBMath.GetRadian( startAngle ); - float radius = (float)(w / 2 - ( w * 0.08)); - float rulerValue = (float)minValue; - - Pen pen = new Pen ( scaleColor, ( 1 * drawRatio ) ); - SolidBrush br = new SolidBrush ( scaleColor ); - - PointF ptStart = new PointF(0,0); - PointF ptEnd = new PointF(0,0); - int n = 0; - for( ; n < scaleDivisions; n++ ) - { - //Draw Thick Line - ptStart.X = (float)(cx + radius * Math.Cos(currentAngle)); - ptStart.Y = (float)(cy + radius * Math.Sin(currentAngle)); - ptEnd.X = (float)(cx + (radius - w/20) * Math.Cos(currentAngle)); - ptEnd.Y = (float)(cy + (radius - w/20) * Math.Sin(currentAngle)); - Gr.DrawLine( pen, ptStart, ptEnd ); - - //Draw Strings - Font font = new Font ( this.AnalogMeter.Font.FontFamily, (float)( 6F * drawRatio ) ); - - float tx = (float)(cx + (radius - ( 20 * drawRatio )) * Math.Cos(currentAngle)); - float ty = (float)(cy + (radius - ( 20 * drawRatio )) * Math.Sin(currentAngle)); - double val = Math.Round ( rulerValue ); - String str = String.Format( "{0,0:D}", (int)val ); - - SizeF size = Gr.MeasureString ( str, font ); - Gr.DrawString ( str, - font, - br, - tx - (float)( size.Width * 0.5 ), - ty - (float)( size.Height * 0.5 ) ); - - rulerValue += (float)(( maxValue - minValue) / (scaleDivisions - 1)); - - if ( n == scaleDivisions -1) - { - font.Dispose(); - break; - } - - if ( scaleDivisions <= 0 ) - currentAngle += incr; - else - { - for (int j = 0; j <= scaleSubDivisions; j++) - { - currentAngle += incr; - ptStart.X = (float)(cx + radius * Math.Cos(currentAngle)); - ptStart.Y = (float)(cy + radius * Math.Sin(currentAngle)); - ptEnd.X = (float)(cx + (radius - w/50) * Math.Cos(currentAngle)); - ptEnd.Y = (float)(cy + (radius - w/50) * Math.Sin(currentAngle)); - Gr.DrawLine( pen, ptStart, ptEnd ); - } - } - - font.Dispose(); - } - - return true; - } - - public virtual bool DrawUM( Graphics gr, RectangleF rc ) - { - return false; - } - - public virtual bool DrawValue( Graphics gr, RectangleF rc ) - { - return false; - } - - public virtual bool DrawNeedle( Graphics Gr, RectangleF rc ) - { - if ( this.AnalogMeter == null ) - return false; - - float w, h ; - w = rc.Width; - h = rc.Height; - - double minValue = this.AnalogMeter.MinValue; - double maxValue = this.AnalogMeter.MaxValue; - double currValue = this.AnalogMeter.Value; - float startAngle = this.AnalogMeter.GetStartAngle(); - float endAngle = this.AnalogMeter.GetEndAngle(); - - float radius = (float)(w / 2 - ( w * 0.12)); - float val = (float)(maxValue - minValue); - - val = (float)((100 * ( currValue - minValue )) / val); - val = (( endAngle - startAngle ) * val) / 100; - val += startAngle; - - float angle = LBMath.GetRadian ( val ); - - float cx = needleCenter.X; - float cy = needleCenter.Y; - - PointF ptStart = new PointF(0,0); - PointF ptEnd = new PointF(0,0); - - GraphicsPath pth1 = new GraphicsPath(); - - ptStart.X = cx; - ptStart.Y = cy; - angle = LBMath.GetRadian(val + 10); - ptEnd.X = (float)(cx + (w * .09F) * Math.Cos(angle)); - ptEnd.Y = (float)(cy + (w * .09F) * Math.Sin(angle)); - pth1.AddLine ( ptStart, ptEnd ); - - ptStart = ptEnd; - angle = LBMath.GetRadian(val); - ptEnd.X = (float)(cx + radius * Math.Cos(angle)); - ptEnd.Y = (float)(cy + radius * Math.Sin(angle)); - pth1.AddLine ( ptStart, ptEnd ); - - ptStart = ptEnd; - angle = LBMath.GetRadian(val - 10); - ptEnd.X = (float)(cx + (w * .09F) * Math.Cos(angle)); - ptEnd.Y = (float)(cy + (w * .09F) * Math.Sin(angle)); - pth1.AddLine ( ptStart, ptEnd ); - - pth1.CloseFigure(); - - SolidBrush br = new SolidBrush( this.AnalogMeter.NeedleColor ); - Pen pen = new Pen ( this.AnalogMeter.NeedleColor ); - Gr.DrawPath ( pen, pth1 ); - Gr.FillPath ( br, pth1 ); - - return true; - } - - public virtual bool DrawNeedleCover( Graphics Gr, RectangleF rc ) - { - if ( this.AnalogMeter == null ) - return false; - - Color clr = this.AnalogMeter.NeedleColor; - RectangleF _rc = rc; - - Color clr1 = Color.FromArgb( 70, clr ); - - _rc.Inflate ( 5 * drawRatio, 5 * drawRatio ); - - SolidBrush brTransp = new SolidBrush ( clr1 ); - Gr.FillEllipse ( brTransp, _rc ); - - clr1 = clr; - Color clr2 = LBColorManager.StepColor ( clr, 75 ); - LinearGradientBrush br1 = new LinearGradientBrush( rc, - clr1, - clr2, - 45 ); - Gr.FillEllipse ( br1, rc ); - return true; - } - - public virtual bool DrawGlass( Graphics Gr, RectangleF rc ) - { - if ( this.AnalogMeter == null ) - return false; - - if ( this.AnalogMeter.ViewGlass == false ) - return true; - - Color clr1 = Color.FromArgb( 40, 200, 200, 200 ); - - Color clr2 = Color.FromArgb( 0, 200, 200, 200 ); - LinearGradientBrush br1 = new LinearGradientBrush( rc, - clr1, - clr2, - 45 ); - Gr.FillEllipse ( br1, rc ); - - return true; - } - #endregion - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/ColorMng.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/ColorMng.cs deleted file mode 100644 index d740e57..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/ColorMng.cs +++ /dev/null @@ -1,62 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBLed.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; -using System.Drawing; - -namespace LBSoft.IndustrialCtrls.Utils -{ - /// - /// Manager for color - /// - public class LBColorManager : Object - { - public static double BlendColour ( double fg, double bg, double alpha ) - { - double result = bg + (alpha * (fg - bg)); - if (result < 0.0) - result = 0.0; - if (result > 255) - result = 255; - return result; - } - - public static Color StepColor ( Color clr, int alpha ) - { - if ( alpha == 100 ) - return clr; - - byte a = clr.A; - byte r = clr.R; - byte g = clr.G; - byte b = clr.B; - float bg = 0; - - int _alpha = Math.Min(alpha, 200); - _alpha = Math.Max(alpha, 0); - double ialpha = ((double)(_alpha - 100.0))/100.0; - - if (ialpha > 100) - { - // blend with white - bg = 255.0F; - ialpha = 1.0F - ialpha; // 0 = transparent fg; 1 = opaque fg - } - else - { - // blend with black - bg = 0.0F; - ialpha = 1.0F + ialpha; // 0 = transparent fg; 1 = opaque fg - } - - r = (byte)(LBColorManager.BlendColour(r, bg, ialpha)); - g = (byte)(LBColorManager.BlendColour(g, bg, ialpha)); - b = (byte)(LBColorManager.BlendColour(b, bg, ialpha)); - - return Color.FromArgb ( a, r, g, b ); - } - }; -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/MathFunc.cs b/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/MathFunc.cs deleted file mode 100644 index 1d35e26..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/LBIndustrialCtrls/Utils/MathFunc.cs +++ /dev/null @@ -1,21 +0,0 @@ -/*--------------------------------------------------------------------------- - * File: LBLed.cs - * Utente: lucabonotto - * Date: 05/04/2009 - *-------------------------------------------------------------------------*/ - -using System; - -namespace LBSoft.IndustrialCtrls.Utils -{ - /// - /// Mathematic Functions - /// - public class LBMath : Object - { - public static float GetRadian ( float val ) - { - return (float)(val * Math.PI / 180); - } - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp.sln b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp.sln deleted file mode 100644 index 7f57071..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.6.33801.468 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{AA498353-353F-46AE-B5D5-96A88CBEA6ED}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LBIndustrialCtrls", "LBIndustrialCtrls\LBIndustrialCtrls.csproj", "{B4218BC9-9736-42B9-BC99-7903FDBEBA28}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AA498353-353F-46AE-B5D5-96A88CBEA6ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA498353-353F-46AE-B5D5-96A88CBEA6ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA498353-353F-46AE-B5D5-96A88CBEA6ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AA498353-353F-46AE-B5D5-96A88CBEA6ED}.Release|Any CPU.Build.0 = Release|Any CPU - {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {C763B692-31EC-48FC-AACE-97C32273C42F} - EndGlobalSection -EndGlobal diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/AssemblyInfo.cs b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/AssemblyInfo.cs deleted file mode 100644 index 963bf0c..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/AssemblyInfo.cs +++ /dev/null @@ -1,31 +0,0 @@ -#region Using directives - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -#endregion - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("TestApp")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TestApp")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose a type to COM, use [ComVisible(true)] on that type. -[assembly: ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all the values or you can use the default the Revision and -// Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("1.1.0.0")] diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.Designer.cs b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.Designer.cs deleted file mode 100644 index 31f9ba9..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.Designer.cs +++ /dev/null @@ -1,541 +0,0 @@ -/* - * Creato da SharpDevelop. - * Utente: lucabonotto - * Data: 03/04/2008 - * Ora: 14.34 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System.Windows.Forms; - -namespace TestApp -{ - partial class MainForm - { - /// - /// Designer variable used to keep track of non-visual components. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Disposes resources used by the form. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing) { - if (components != null) { - components.Dispose(); - } - } - base.Dispose(disposing); - } - - /// - /// This method is required for Windows Forms designer support. - /// Do not change the method contents inside the source code editor. The Forms designer might - /// not be able to load this method if it was changed manually. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.sdRepeat = new LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay(); - this.label4 = new System.Windows.Forms.Label(); - this.lB7SegmentDisplay1 = new LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay(); - this.lB7SegmentDisplay2 = new LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay(); - this.lbLed4 = new LBSoft.IndustrialCtrls.Leds.LBLed(); - this.lbLed3 = new LBSoft.IndustrialCtrls.Leds.LBLed(); - this.lbLed2 = new LBSoft.IndustrialCtrls.Leds.LBLed(); - this.lbLed1 = new LBSoft.IndustrialCtrls.Leds.LBLed(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.btnRepeat = new LBSoft.IndustrialCtrls.Buttons.LBButton(); - this.lbButton3 = new LBSoft.IndustrialCtrls.Buttons.LBButton(); - this.lbButton2 = new LBSoft.IndustrialCtrls.Buttons.LBButton(); - this.lbButton1 = new LBSoft.IndustrialCtrls.Buttons.LBButton(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.propertyGrid1 = new System.Windows.Forms.PropertyGrid(); - this.labelCurrCtrl = new System.Windows.Forms.Label(); - this.lbDigitalMeter1 = new LBSoft.IndustrialCtrls.Meters.LBDigitalMeter(); - this.lbAnalogMeter2 = new LBSoft.IndustrialCtrls.Meters.LBAnalogMeter(); - this.lbKnob1 = new LBSoft.IndustrialCtrls.Knobs.LBKnob(); - this.lbAnalogMeter1 = new LBSoft.IndustrialCtrls.Meters.LBAnalogMeter(); - this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.SuspendLayout(); - // - // groupBox1 - // - this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.groupBox1.BackColor = System.Drawing.Color.Transparent; - this.groupBox1.Controls.Add(this.sdRepeat); - this.groupBox1.Controls.Add(this.label4); - this.groupBox1.Controls.Add(this.lB7SegmentDisplay1); - this.groupBox1.Controls.Add(this.lB7SegmentDisplay2); - this.groupBox1.Controls.Add(this.lbLed4); - this.groupBox1.Controls.Add(this.lbLed3); - this.groupBox1.Controls.Add(this.lbLed2); - this.groupBox1.Controls.Add(this.lbLed1); - this.groupBox1.Location = new System.Drawing.Point(143, 258); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(272, 337); - this.groupBox1.TabIndex = 6; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Leds"; - // - // sdRepeat - // - this.sdRepeat.BackColor = System.Drawing.Color.Black; - this.sdRepeat.ForeColor = System.Drawing.Color.Red; - this.sdRepeat.Location = new System.Drawing.Point(32, 256); - this.sdRepeat.Name = "sdRepeat"; - this.sdRepeat.Renderer = null; - this.sdRepeat.ShowDP = false; - this.sdRepeat.Size = new System.Drawing.Size(32, 50); - this.sdRepeat.TabIndex = 18; - this.sdRepeat.Value = 2; - // - // label4 - // - this.label4.Location = new System.Drawing.Point(145, 27); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(121, 14); - this.label4.TabIndex = 17; - this.label4.Text = "7 Segments display"; - // - // lB7SegmentDisplay1 - // - this.lB7SegmentDisplay1.BackColor = System.Drawing.Color.Black; - this.lB7SegmentDisplay1.ForeColor = System.Drawing.Color.Red; - this.lB7SegmentDisplay1.Location = new System.Drawing.Point(148, 44); - this.lB7SegmentDisplay1.Name = "lB7SegmentDisplay1"; - this.lB7SegmentDisplay1.Renderer = null; - this.lB7SegmentDisplay1.ShowDP = false; - this.lB7SegmentDisplay1.Size = new System.Drawing.Size(32, 50); - this.lB7SegmentDisplay1.TabIndex = 15; - this.lB7SegmentDisplay1.Value = 2; - this.lB7SegmentDisplay1.Click += new System.EventHandler(this.OnObjectClicked); - // - // lB7SegmentDisplay2 - // - this.lB7SegmentDisplay2.BackColor = System.Drawing.Color.Black; - this.lB7SegmentDisplay2.ForeColor = System.Drawing.Color.LawnGreen; - this.lB7SegmentDisplay2.Location = new System.Drawing.Point(148, 104); - this.lB7SegmentDisplay2.Name = "lB7SegmentDisplay2"; - this.lB7SegmentDisplay2.Renderer = null; - this.lB7SegmentDisplay2.ShowDP = false; - this.lB7SegmentDisplay2.Size = new System.Drawing.Size(99, 146); - this.lB7SegmentDisplay2.TabIndex = 16; - this.lB7SegmentDisplay2.Value = 3; - this.lB7SegmentDisplay2.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbLed4 - // - this.lbLed4.BackColor = System.Drawing.Color.Transparent; - this.lbLed4.BlinkInterval = 500; - this.lbLed4.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbLed4.ForeColor = System.Drawing.Color.Black; - this.lbLed4.Label = "Fixed & Top"; - this.lbLed4.LabelPosition = LBSoft.IndustrialCtrls.Leds.LBLed.LedLabelPosition.Top; - this.lbLed4.LedColor = System.Drawing.Color.Red; - this.lbLed4.LedSize = new System.Drawing.SizeF(20F, 20F); - this.lbLed4.Location = new System.Drawing.Point(4, 59); - this.lbLed4.Margin = new System.Windows.Forms.Padding(7, 5, 7, 5); - this.lbLed4.Name = "lbLed4"; - this.lbLed4.Renderer = null; - this.lbLed4.Size = new System.Drawing.Size(103, 39); - this.lbLed4.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.On; - this.lbLed4.Style = LBSoft.IndustrialCtrls.Leds.LBLed.LedStyle.Circular; - this.lbLed4.TabIndex = 3; - this.lbLed4.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbLed3 - // - this.lbLed3.BackColor = System.Drawing.Color.Transparent; - this.lbLed3.BlinkInterval = 200; - this.lbLed3.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbLed3.ForeColor = System.Drawing.Color.Black; - this.lbLed3.Label = "Left & Blink"; - this.lbLed3.LabelPosition = LBSoft.IndustrialCtrls.Leds.LBLed.LedLabelPosition.Left; - this.lbLed3.LedColor = System.Drawing.Color.Yellow; - this.lbLed3.LedSize = new System.Drawing.SizeF(30F, 30F); - this.lbLed3.Location = new System.Drawing.Point(10, 186); - this.lbLed3.Margin = new System.Windows.Forms.Padding(6, 4, 6, 4); - this.lbLed3.Name = "lbLed3"; - this.lbLed3.Renderer = null; - this.lbLed3.Size = new System.Drawing.Size(112, 39); - this.lbLed3.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; - this.lbLed3.Style = LBSoft.IndustrialCtrls.Leds.LBLed.LedStyle.Circular; - this.lbLed3.TabIndex = 2; - this.lbLed3.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbLed2 - // - this.lbLed2.BackColor = System.Drawing.Color.Transparent; - this.lbLed2.BlinkInterval = 500; - this.lbLed2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbLed2.ForeColor = System.Drawing.Color.Black; - this.lbLed2.Label = "Right & Fixed"; - this.lbLed2.LabelPosition = LBSoft.IndustrialCtrls.Leds.LBLed.LedLabelPosition.Right; - this.lbLed2.LedColor = System.Drawing.Color.Lime; - this.lbLed2.LedSize = new System.Drawing.SizeF(20F, 20F); - this.lbLed2.Location = new System.Drawing.Point(10, 118); - this.lbLed2.Margin = new System.Windows.Forms.Padding(6, 5, 6, 5); - this.lbLed2.Name = "lbLed2"; - this.lbLed2.Renderer = null; - this.lbLed2.Size = new System.Drawing.Size(112, 29); - this.lbLed2.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; - this.lbLed2.Style = LBSoft.IndustrialCtrls.Leds.LBLed.LedStyle.Circular; - this.lbLed2.TabIndex = 1; - this.lbLed2.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbLed1 - // - this.lbLed1.BackColor = System.Drawing.Color.Transparent; - this.lbLed1.BlinkInterval = 500; - this.lbLed1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbLed1.ForeColor = System.Drawing.Color.Black; - this.lbLed1.Label = "Fixed & Bottom"; - this.lbLed1.LabelPosition = LBSoft.IndustrialCtrls.Leds.LBLed.LedLabelPosition.Bottom; - this.lbLed1.LedColor = System.Drawing.Color.Red; - this.lbLed1.LedSize = new System.Drawing.SizeF(20F, 20F); - this.lbLed1.Location = new System.Drawing.Point(4, 19); - this.lbLed1.Margin = new System.Windows.Forms.Padding(7, 5, 7, 5); - this.lbLed1.Name = "lbLed1"; - this.lbLed1.Renderer = null; - this.lbLed1.Size = new System.Drawing.Size(103, 39); - this.lbLed1.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; - this.lbLed1.Style = LBSoft.IndustrialCtrls.Leds.LBLed.LedStyle.Circular; - this.lbLed1.TabIndex = 0; - this.lbLed1.Click += new System.EventHandler(this.OnObjectClicked); - // - // groupBox2 - // - this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.groupBox2.BackColor = System.Drawing.Color.Transparent; - this.groupBox2.Controls.Add(this.btnRepeat); - this.groupBox2.Controls.Add(this.lbButton3); - this.groupBox2.Controls.Add(this.lbButton2); - this.groupBox2.Controls.Add(this.lbButton1); - this.groupBox2.Location = new System.Drawing.Point(13, 258); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(124, 337); - this.groupBox2.TabIndex = 7; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "Buttons"; - // - // btnRepeat - // - this.btnRepeat.BackColor = System.Drawing.Color.Transparent; - this.btnRepeat.ButtonColor = System.Drawing.Color.DodgerBlue; - this.btnRepeat.Font = new System.Drawing.Font("Microsoft Sans Serif", 39.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.btnRepeat.Label = "Repeat"; - this.btnRepeat.Location = new System.Drawing.Point(6, 247); - this.btnRepeat.Name = "btnRepeat"; - this.btnRepeat.Renderer = null; - this.btnRepeat.RepeatInterval = 100; - this.btnRepeat.RepeatState = true; - this.btnRepeat.Size = new System.Drawing.Size(103, 70); - this.btnRepeat.StartRepeatInterval = 500; - this.btnRepeat.State = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal; - this.btnRepeat.Style = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonStyle.Rectangular; - this.btnRepeat.TabIndex = 3; - this.btnRepeat.ButtonChangeState += new LBSoft.IndustrialCtrls.Buttons.ButtonChangeState(this.btnRepeat_ButtonChangeState); - this.btnRepeat.ButtonRepeatState += new LBSoft.IndustrialCtrls.Buttons.ButtonRepeatState(this.btnRepeat_ButtonRepeatState); - this.btnRepeat.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbButton3 - // - this.lbButton3.BackColor = System.Drawing.Color.Transparent; - this.lbButton3.ButtonColor = System.Drawing.Color.Yellow; - this.lbButton3.Font = new System.Drawing.Font("Microsoft Sans Serif", 39.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbButton3.Label = "Warn"; - this.lbButton3.Location = new System.Drawing.Point(15, 171); - this.lbButton3.Name = "lbButton3"; - this.lbButton3.Renderer = null; - this.lbButton3.RepeatInterval = 100; - this.lbButton3.RepeatState = false; - this.lbButton3.Size = new System.Drawing.Size(103, 70); - this.lbButton3.StartRepeatInterval = 500; - this.lbButton3.State = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal; - this.lbButton3.Style = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonStyle.Circular; - this.lbButton3.TabIndex = 2; - this.lbButton3.ButtonChangeState += new LBSoft.IndustrialCtrls.Buttons.ButtonChangeState(this.OnWarnStateChanged); - this.lbButton3.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbButton2 - // - this.lbButton2.BackColor = System.Drawing.Color.Transparent; - this.lbButton2.ButtonColor = System.Drawing.Color.Green; - this.lbButton2.Font = new System.Drawing.Font("Microsoft Sans Serif", 39.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbButton2.Label = "Start"; - this.lbButton2.Location = new System.Drawing.Point(15, 95); - this.lbButton2.Name = "lbButton2"; - this.lbButton2.Renderer = null; - this.lbButton2.RepeatInterval = 100; - this.lbButton2.RepeatState = false; - this.lbButton2.Size = new System.Drawing.Size(103, 70); - this.lbButton2.StartRepeatInterval = 500; - this.lbButton2.State = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal; - this.lbButton2.Style = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonStyle.Elliptical; - this.lbButton2.TabIndex = 1; - this.lbButton2.ButtonChangeState += new LBSoft.IndustrialCtrls.Buttons.ButtonChangeState(this.OnStartStateChanged); - this.lbButton2.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbButton1 - // - this.lbButton1.BackColor = System.Drawing.Color.Transparent; - this.lbButton1.ButtonColor = System.Drawing.Color.Red; - this.lbButton1.Font = new System.Drawing.Font("Microsoft Sans Serif", 39.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbButton1.Label = "Stop"; - this.lbButton1.Location = new System.Drawing.Point(15, 19); - this.lbButton1.Name = "lbButton1"; - this.lbButton1.Renderer = null; - this.lbButton1.RepeatInterval = 100; - this.lbButton1.RepeatState = false; - this.lbButton1.Size = new System.Drawing.Size(103, 70); - this.lbButton1.StartRepeatInterval = 500; - this.lbButton1.State = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal; - this.lbButton1.Style = LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonStyle.Rectangular; - this.lbButton1.TabIndex = 0; - this.lbButton1.ButtonChangeState += new LBSoft.IndustrialCtrls.Buttons.ButtonChangeState(this.OnStopStateChanged); - this.lbButton1.Click += new System.EventHandler(this.OnObjectClicked); - // - // label1 - // - this.label1.Location = new System.Drawing.Point(72, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(93, 29); - this.label1.TabIndex = 10; - this.label1.Text = "Analog meter with default renderer"; - this.label1.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // label2 - // - this.label2.Location = new System.Drawing.Point(280, 0); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(93, 29); - this.label2.TabIndex = 11; - this.label2.Text = "Analog meter with custom renderer"; - this.label2.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // label3 - // - this.label3.Location = new System.Drawing.Point(479, 0); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(93, 29); - this.label3.TabIndex = 12; - this.label3.Text = "Knob for change the analog values"; - this.label3.TextAlign = System.Drawing.ContentAlignment.TopCenter; - // - // propertyGrid1 - // - this.propertyGrid1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.propertyGrid1.HelpVisible = false; - this.propertyGrid1.Location = new System.Drawing.Point(424, 258); - this.propertyGrid1.Name = "propertyGrid1"; - this.propertyGrid1.Size = new System.Drawing.Size(251, 337); - this.propertyGrid1.TabIndex = 13; - this.propertyGrid1.ToolbarVisible = false; - // - // labelCurrCtrl - // - this.labelCurrCtrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labelCurrCtrl.Location = new System.Drawing.Point(420, 233); - this.labelCurrCtrl.Name = "labelCurrCtrl"; - this.labelCurrCtrl.Size = new System.Drawing.Size(257, 14); - this.labelCurrCtrl.TabIndex = 14; - this.labelCurrCtrl.Text = "Click to the controls to view the properties"; - // - // lbDigitalMeter1 - // - this.lbDigitalMeter1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.lbDigitalMeter1.BackColor = System.Drawing.Color.Black; - this.lbDigitalMeter1.ForeColor = System.Drawing.Color.Red; - this.lbDigitalMeter1.Format = "0000.00"; - this.lbDigitalMeter1.Location = new System.Drawing.Point(441, 147); - this.lbDigitalMeter1.Name = "lbDigitalMeter1"; - this.lbDigitalMeter1.Renderer = null; - this.lbDigitalMeter1.Signed = false; - this.lbDigitalMeter1.Size = new System.Drawing.Size(233, 71); - this.lbDigitalMeter1.TabIndex = 15; - this.lbDigitalMeter1.Value = 0; - this.lbDigitalMeter1.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbAnalogMeter2 - // - this.lbAnalogMeter2.BackColor = System.Drawing.Color.Transparent; - this.lbAnalogMeter2.BodyColor = System.Drawing.Color.DodgerBlue; - this.lbAnalogMeter2.Location = new System.Drawing.Point(12, 32); - this.lbAnalogMeter2.MaxValue = 100; - this.lbAnalogMeter2.MeterStyle = LBSoft.IndustrialCtrls.Meters.LBAnalogMeter.AnalogMeterStyle.Circular; - this.lbAnalogMeter2.MinValue = 0; - this.lbAnalogMeter2.Name = "lbAnalogMeter2"; - this.lbAnalogMeter2.NeedleColor = System.Drawing.Color.Yellow; - this.lbAnalogMeter2.Renderer = null; - this.lbAnalogMeter2.ScaleColor = System.Drawing.Color.GreenYellow; - this.lbAnalogMeter2.ScaleDivisions = 11; - this.lbAnalogMeter2.ScaleSubDivisions = 10; - this.lbAnalogMeter2.Size = new System.Drawing.Size(211, 201); - this.lbAnalogMeter2.TabIndex = 9; - this.lbAnalogMeter2.Value = 0; - this.lbAnalogMeter2.ViewGlass = true; - this.lbAnalogMeter2.Click += new System.EventHandler(this.OnObjectClicked); - // - // lbKnob1 - // - this.lbKnob1.BackColor = System.Drawing.Color.Transparent; - this.lbKnob1.DrawRatio = 0.415F; - this.lbKnob1.IndicatorColor = System.Drawing.Color.DarkRed; - this.lbKnob1.IndicatorOffset = 8F; - this.lbKnob1.KnobCenter = ((System.Drawing.PointF)(resources.GetObject("lbKnob1.KnobCenter"))); - this.lbKnob1.KnobColor = System.Drawing.Color.DarkOrange; - this.lbKnob1.KnobRect = ((System.Drawing.RectangleF)(resources.GetObject("lbKnob1.KnobRect"))); - this.lbKnob1.Location = new System.Drawing.Point(485, 32); - this.lbKnob1.MaxValue = 100F; - this.lbKnob1.MinValue = 0F; - this.lbKnob1.Name = "lbKnob1"; - this.lbKnob1.Renderer = null; - this.lbKnob1.ScaleColor = System.Drawing.Color.DimGray; - this.lbKnob1.Size = new System.Drawing.Size(87, 83); - this.lbKnob1.StepValue = 0.2F; - this.lbKnob1.Style = LBSoft.IndustrialCtrls.Knobs.LBKnob.KnobStyle.Circular; - this.lbKnob1.TabIndex = 8; - this.lbKnob1.Value = 0F; - this.lbKnob1.Click += new System.EventHandler(this.OnObjectClicked); - this.lbKnob1.KnobChangeValue += new LBSoft.IndustrialCtrls.Knobs.KnobChangeValue(this.OnKnobChangeValue); - // - // lbAnalogMeter1 - // - this.lbAnalogMeter1.BackColor = System.Drawing.Color.Transparent; - this.lbAnalogMeter1.BodyColor = System.Drawing.Color.DodgerBlue; - this.lbAnalogMeter1.Font = new System.Drawing.Font("Verdana", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lbAnalogMeter1.ForeColor = System.Drawing.Color.Red; - this.lbAnalogMeter1.Location = new System.Drawing.Point(228, 32); - this.lbAnalogMeter1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.lbAnalogMeter1.MaxValue = 100; - this.lbAnalogMeter1.MeterStyle = LBSoft.IndustrialCtrls.Meters.LBAnalogMeter.AnalogMeterStyle.Circular; - this.lbAnalogMeter1.MinValue = 0; - this.lbAnalogMeter1.Name = "lbAnalogMeter1"; - this.lbAnalogMeter1.NeedleColor = System.Drawing.Color.Yellow; - this.lbAnalogMeter1.Renderer = null; - this.lbAnalogMeter1.ScaleColor = System.Drawing.Color.GreenYellow; - this.lbAnalogMeter1.ScaleDivisions = 11; - this.lbAnalogMeter1.ScaleSubDivisions = 5; - this.lbAnalogMeter1.Size = new System.Drawing.Size(206, 201); - this.lbAnalogMeter1.TabIndex = 2; - this.lbAnalogMeter1.Value = 0; - this.lbAnalogMeter1.ViewGlass = true; - this.lbAnalogMeter1.Click += new System.EventHandler(this.OnObjectClicked); - // - // MainForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.DarkKhaki; - this.ClientSize = new System.Drawing.Size(688, 607); - this.Controls.Add(this.lbDigitalMeter1); - this.Controls.Add(this.labelCurrCtrl); - this.Controls.Add(this.propertyGrid1); - this.Controls.Add(this.label3); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.lbAnalogMeter2); - this.Controls.Add(this.lbKnob1); - this.Controls.Add(this.groupBox2); - this.Controls.Add(this.groupBox1); - this.Controls.Add(this.lbAnalogMeter1); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "MainForm"; - this.Text = "TestApp"; - this.groupBox1.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.ResumeLayout(false); - - } - private System.Windows.Forms.Label labelCurrCtrl; - private System.Windows.Forms.PropertyGrid propertyGrid1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label1; - private LBSoft.IndustrialCtrls.Leds.LBLed lbLed4; - private LBSoft.IndustrialCtrls.Meters.LBAnalogMeter lbAnalogMeter2; - private LBSoft.IndustrialCtrls.Knobs.LBKnob lbKnob1; - private LBSoft.IndustrialCtrls.Buttons.LBButton lbButton1; - private LBSoft.IndustrialCtrls.Buttons.LBButton lbButton2; - private LBSoft.IndustrialCtrls.Buttons.LBButton lbButton3; - private LBSoft.IndustrialCtrls.Leds.LBLed lbLed1; - private LBSoft.IndustrialCtrls.Leds.LBLed lbLed2; - private LBSoft.IndustrialCtrls.Leds.LBLed lbLed3; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.GroupBox groupBox1; - private LBSoft.IndustrialCtrls.Meters.LBAnalogMeter lbAnalogMeter1; - - void OnWarnStateChanged(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) - { - if ( e.State == LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Pressed ) - this.lbLed3.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Blink; - else - this.lbLed3.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; - } - - void OnStartStateChanged(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) - { - if ( e.State == LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Pressed ) - this.lbLed2.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.On; - else - this.lbLed2.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; - } - - void OnStopStateChanged(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) - { - if ( e.State == LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Pressed ) - { - this.lbLed1.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.On; - this.lbLed4.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; - } - else - { - this.lbLed1.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.Off; - this.lbLed4.State = LBSoft.IndustrialCtrls.Leds.LBLed.LedState.On; - } - } - - void OnKnobChangeValue(object sender, LBSoft.IndustrialCtrls.Knobs.LBKnobEventArgs e) - { - this.lbAnalogMeter1.Value = e.Value; - this.lbAnalogMeter2.Value = e.Value; - this.lbDigitalMeter1.Value = e.Value * 10; - - int v = (int)(e.Value / 10) - 1; - if ( v < 0 ) - v = 0; - if ( v > 9 ) - v = 9; - this.lB7SegmentDisplay1.Value = v; - this.lB7SegmentDisplay2.Value = v; - } - - void OnObjectClicked(object sender, System.EventArgs e) - { - this.propertyGrid1.CollapseAllGridItems(); - this.propertyGrid1.Refresh(); - - this.propertyGrid1.SelectedObject = sender; - } - - private LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay lB7SegmentDisplay1; - private LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay lB7SegmentDisplay2; - private Label label4; - private LBSoft.IndustrialCtrls.Meters.LBDigitalMeter lbDigitalMeter1; - private LBSoft.IndustrialCtrls.Leds.LB7SegmentDisplay sdRepeat; - private LBSoft.IndustrialCtrls.Buttons.LBButton btnRepeat; - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.cs b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.cs deleted file mode 100644 index fe5be26..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.cs +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Creato da SharpDevelop. - * Utente: lucabonotto - * Data: 03/04/2008 - * Ora: 14.34 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Windows.Forms; -using LBSoft.IndustrialCtrls; -using LBSoft.IndustrialCtrls.Meters; -using LBSoft.IndustrialCtrls.Utils; - -namespace TestApp -{ - /// - /// Description of MainForm. - /// - public partial class MainForm : Form - { - private LBMyAnalogMeterRenderer myRenderer; - - public MainForm() - { - // - // The InitializeComponent() call is required for Windows Forms designer support. - // - InitializeComponent(); - - this.myRenderer = new LBMyAnalogMeterRenderer(); - - LBMeterThreshold threshold = new LBMeterThreshold(); - threshold.Color = Color.Yellow; - threshold.StartValue = 50; - threshold.EndValue = 70; - this.lbAnalogMeter1.Thresholds.Add ( threshold ); - threshold = new LBMeterThreshold(); - threshold.Color = Color.Red; - threshold.StartValue = 70; - threshold.EndValue = 100; - this.lbAnalogMeter1.Thresholds.Add ( threshold ); - this.lbAnalogMeter1.Renderer = this.myRenderer; - - threshold = new LBMeterThreshold(); - threshold.Color = Color.Yellow; - threshold.StartValue = 50; - threshold.EndValue = 70; - this.lbAnalogMeter2.Thresholds.Add ( threshold ); - threshold = new LBMeterThreshold(); - threshold.Color = Color.Red; - threshold.StartValue = 70; - threshold.EndValue = 100; - this.lbAnalogMeter2.Thresholds.Add ( threshold ); - } - - private void btnRepeat_ButtonChangeState(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) - { - if (e.State != LBSoft.IndustrialCtrls.Buttons.LBButton.ButtonState.Normal) - return; - - this.sdRepeat.Value = 0; - } - - private void btnRepeat_ButtonRepeatState(object sender, LBSoft.IndustrialCtrls.Buttons.LBButtonEventArgs e) - { - int v = this.sdRepeat.Value; - v++; - if (v > 9) - v = 0; - - this.sdRepeat.Value = v; - } - } - - /// - /// Custom renderer class - /// - public class LBMyAnalogMeterRenderer : LBAnalogMeterRenderer - { - public override bool DrawBody( Graphics Gr, RectangleF rc ) - { - return true; - } - - public override bool DrawGlass( Graphics Gr, RectangleF rc ) - { - return true; - } - - public override bool DrawDivisions( Graphics Gr, RectangleF rc ) - { - if ( this.AnalogMeter == null ) - return false; - - float startAngle = this.AnalogMeter.GetStartAngle(); - float endAngle = this.AnalogMeter.GetEndAngle(); - float scaleDivisions = this.AnalogMeter.ScaleDivisions; - float scaleSubDivisions = this.AnalogMeter.ScaleSubDivisions; - double minValue = this.AnalogMeter.MinValue; - double maxValue = this.AnalogMeter.MaxValue; - Color scaleColor = this.AnalogMeter.ScaleColor; - - float cx = needleCenter.X; - float cy = needleCenter.Y; - float w = rc.Width; - float h = rc.Height; - - float incr = LBMath.GetRadian(( endAngle - startAngle ) / (( scaleDivisions - 1 )* (scaleSubDivisions + 1))); - float currentAngle = LBMath.GetRadian( startAngle ); - float radius = (float)(w / 2 - ( w * 0.08)); - float rulerValue = (float)minValue; - - Pen pen = new Pen ( scaleColor, ( 2 * drawRatio ) ); - SolidBrush br = new SolidBrush ( scaleColor ); - - PointF ptStart = new PointF(0,0); - PointF ptEnd = new PointF(0,0); - PointF ptCenter = new PointF(0,0); - RectangleF rcTick = new RectangleF(0,0,0,0); - SizeF sizeMax = new SizeF( 10 * drawRatio, 10 * drawRatio ); - SizeF sizeMin = new SizeF( 4 * drawRatio, 4 * drawRatio ); - - int n = 0; - for( ; n < scaleDivisions; n++ ) - { - //Draw Thick Line - ptCenter.X = (float)(cx + (radius - w/90) * Math.Cos(currentAngle)); - ptCenter.Y = (float)(cy + (radius - w/90) * Math.Sin(currentAngle)); - ptStart.X = ptCenter.X - ( 5 * drawRatio ); - ptStart.Y = ptCenter.Y - ( 5 * drawRatio ); - rcTick.Location = ptStart; - rcTick.Size = sizeMax; - Gr.FillEllipse( br, rcTick ); - - //Draw Strings - Font font = new Font ( this.AnalogMeter.Font.FontFamily, (float)( 8F * drawRatio ), FontStyle.Italic ); - - float tx = (float)(cx + (radius - ( 20 * drawRatio )) * Math.Cos(currentAngle)); - float ty = (float)(cy + (radius - ( 20 * drawRatio )) * Math.Sin(currentAngle)); - double val = Math.Round ( rulerValue ); - String str = String.Format( "{0,0:D}", (int)val ); - - SizeF size = Gr.MeasureString ( str, font ); - Gr.DrawString ( str, - font, - br, - tx - (float)( size.Width * 0.5 ), - ty - (float)( size.Height * 0.5 ) ); - - rulerValue += (float)(( maxValue - minValue) / (scaleDivisions - 1)); - - if ( n == scaleDivisions -1) - break; - - if ( scaleDivisions <= 0 ) - currentAngle += incr; - else - { - for (int j = 0; j <= scaleSubDivisions; j++) - { - currentAngle += incr; - - ptCenter.X = (float)(cx + (radius - w/90) * Math.Cos(currentAngle)); - ptCenter.Y = (float)(cy + (radius - w/90) * Math.Sin(currentAngle)); - ptStart.X = ptCenter.X - ( 2 * drawRatio ); - ptStart.Y = ptCenter.Y - ( 2 * drawRatio ); - rcTick.Location = ptStart; - rcTick.Size = sizeMin; - Gr.FillEllipse( br, rcTick ); - } - } - } - - return true; - } - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.resx b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.resx deleted file mode 100644 index 2674f1e..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/MainForm.resx +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0 - dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJh - d2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAmQgAAIkIL - - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0 - dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABlTeXN0ZW0uRHJh - d2luZy5SZWN0YW5nbGVGBAAAAAF4AXkFd2lkdGgGaGVpZ2h0AAAAAAsLCwsCAAAAzcwEQc3MBEHNzIRC - zcyAQgs= - - - \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/Program.cs b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/Program.cs deleted file mode 100644 index e76f8ce..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/Program.cs +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Creato da SharpDevelop. - * Utente: lucabonotto - * Data: 03/04/2008 - * Ora: 14.34 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; -using System.Windows.Forms; - -namespace TestApp -{ - /// - /// Class with program entry point. - /// - internal sealed class Program - { - /// - /// Program entry point. - /// - [STAThread] - private static void Main(string[] args) - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new MainForm()); - } - - } -} diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/TestApp.csproj b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/TestApp.csproj deleted file mode 100644 index 70bda3e..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/TestApp.csproj +++ /dev/null @@ -1,132 +0,0 @@ - - - {AA498353-353F-46AE-B5D5-96A88CBEA6ED} - Debug - AnyCPU - WinExe - TestApp - TestApp - False - False - 4 - false - - - - - 3.5 - v4.5.2 - false - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - bin\Debug\ - true - Full - False - True - DEBUG;TRACE - - - bin\Release\ - False - None - True - False - TRACE - - - False - Auto - 4194304 - AnyCPU - 4096 - - - MinimumRecommendedRules.ruleset - false - - - MinimumRecommendedRules.ruleset - false - - - true - - - - - - - - - - - - - Form - - - MainForm.cs - - - - MainForm.cs - - - - - {B4218BC9-9736-42B9-BC99-7903FDBEBA28} - LBIndustrialCtrls - - - - - False - .NET Framework Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - false - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - - \ No newline at end of file diff --git a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/app.config b/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/app.config deleted file mode 100644 index ff99501..0000000 --- a/MidiShapeShifter/LBIndustrialCtrls_src/TestApp/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/MidiShapeShifter/MidiShapeShifter.sln b/MidiShapeShifter/MidiShapeShifter.sln index bf70f8e..34e3af9 100644 --- a/MidiShapeShifter/MidiShapeShifter.sln +++ b/MidiShapeShifter/MidiShapeShifter.sln @@ -5,6 +5,7 @@ VisualStudioVersion = 17.2.32519.379 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MidiShapeShifter", "MidiShapeShifter\MidiShapeShifter.csproj", "{D19470F9-7D1E-4385-AD34-C7D826649F89}" ProjectSection(ProjectDependencies) = postProject + {2541686B-1673-43BF-AF89-3163945DB009} = {2541686B-1673-43BF-AF89-3163945DB009} {B4218BC9-9736-42B9-BC99-7903FDBEBA28} = {B4218BC9-9736-42B9-BC99-7903FDBEBA28} EndProjectSection EndProject @@ -18,7 +19,9 @@ Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "MidiShapeShifterInstaller", {D19470F9-7D1E-4385-AD34-C7D826649F89} = {D19470F9-7D1E-4385-AD34-C7D826649F89} EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LBIndustrialCtrls", "LBIndustrialCtrls_src\LBIndustrialCtrls\LBIndustrialCtrls.csproj", "{B4218BC9-9736-42B9-BC99-7903FDBEBA28}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LBIndustrialCtrls", "..\SDK\LBIndustrialCtrls\LBIndustrialCtrls\LBIndustrialCtrls.csproj", "{B4218BC9-9736-42B9-BC99-7903FDBEBA28}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZedGraph", "..\SDK\ZedGraphs\ZedGraph.csproj", "{2541686B-1673-43BF-AF89-3163945DB009}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -93,6 +96,22 @@ Global {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|Any CPU.Build.0 = Release|Any CPU {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|x64.ActiveCfg = Release|Any CPU {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|x64.Build.0 = Release|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.All|Any CPU.ActiveCfg = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.All|Any CPU.Build.0 = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.All|x64.ActiveCfg = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.All|x64.Build.0 = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Debug|x64.ActiveCfg = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Debug|x64.Build.0 = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Deploy|x64.ActiveCfg = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Deploy|x64.Build.0 = Debug|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Release|Any CPU.Build.0 = Release|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Release|x64.ActiveCfg = Release|Any CPU + {2541686B-1673-43BF-AF89-3163945DB009}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj index 51600dc..0eabd16 100644 --- a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj +++ b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj @@ -82,10 +82,6 @@ - - False - ..\lib\ZedGraph.dll -
@@ -400,10 +396,14 @@ - + {b4218bc9-9736-42b9-bc99-7903fdbeba28} LBIndustrialCtrls + + {2541686b-1673-43bf-af89-3163945db009} + ZedGraph + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SDK/NUnit/bin/net-2.0/NUnitTests.nunit b/SDK/NUnit/bin/net-2.0/NUnitTests.nunit deleted file mode 100644 index bb80dd6..0000000 --- a/SDK/NUnit/bin/net-2.0/NUnitTests.nunit +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/SDK/NUnit/bin/net-2.0/TestResult.xml b/SDK/NUnit/bin/net-2.0/TestResult.xml deleted file mode 100644 index 058d42b..0000000 --- a/SDK/NUnit/bin/net-2.0/TestResult.xml +++ /dev/null @@ -1,5971 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/agent.conf b/SDK/NUnit/bin/net-2.0/agent.conf deleted file mode 100644 index b4cf550..0000000 --- a/SDK/NUnit/bin/net-2.0/agent.conf +++ /dev/null @@ -1,4 +0,0 @@ - - 8080 - . - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/agent.log.conf b/SDK/NUnit/bin/net-2.0/agent.log.conf deleted file mode 100644 index d340cad..0000000 --- a/SDK/NUnit/bin/net-2.0/agent.log.conf +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/SDK/NUnit/bin/net-2.0/framework/nunit.framework.dll b/SDK/NUnit/bin/net-2.0/framework/nunit.framework.dll deleted file mode 100644 index 6856e51ef08a8e681896c3a84ccbeea8975d5947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139264 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
jGx_)XGKVSL!mZ7A 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 s;idf~4WfA}|OOnpsbG<<@nYpjdJ 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 K#)0=F2mTF_u(`ni diff --git a/SDK/NUnit/bin/net-2.0/framework/nunit.framework.xml b/SDK/NUnit/bin/net-2.0/framework/nunit.framework.xml deleted file mode 100644 index c98e5ad..0000000 --- a/SDK/NUnit/bin/net-2.0/framework/nunit.framework.xml +++ /dev/null @@ -1,10407 +0,0 @@ - - - - nunit.framework - - - - - Attribute used to apply a category to a test - - - - - The name of the category - - - - - Construct attribute for a given category based on - a name. The name may not contain the characters ',', - '+', '-' or '!'. However, this is not checked in the - constructor since it would cause an error to arise at - as the test was loaded without giving a clear indication - of where the problem is located. The error is handled - in NUnitFramework.cs by marking the test as not - runnable. - - The name of the category - - - - Protected constructor uses the Type name as the name - of the category. - - - - - The name of the category - - - - - Used to mark a field for use as a datapoint when executing a theory - within the same fixture that requires an argument of the field's Type. - - - - - Used to mark an array as containing a set of datapoints to be used - executing a theory within the same fixture that requires an argument - of the Type of the array elements. - - - - - Attribute used to provide descriptive text about a - test case or fixture. - - - - - Construct the attribute - - Text describing the test - - - - Gets the test description - - - - - Enumeration indicating how the expected message parameter is to be used - - - - Expect an exact match - - - Expect a message containing the parameter string - - - Match the regular expression provided as a parameter - - - Expect a message that starts with the parameter string - - - - ExpectedExceptionAttribute - - - - - - Constructor for a non-specific exception - - - - - Constructor for a given type of exception - - The type of the expected exception - - - - Constructor for a given exception name - - The full name of the expected exception - - - - Gets or sets the expected exception type - - - - - Gets or sets the full Type name of the expected exception - - - - - Gets or sets the expected message text - - - - - Gets or sets the user message displayed in case of failure - - - - - Gets or sets the type of match to be performed on the expected message - - - - - Gets the name of a method to be used as an exception handler - - - - - ExplicitAttribute marks a test or test fixture so that it will - only be run if explicitly executed from the gui or command line - or if it is included by use of a filter. The test will not be - run simply because an enclosing suite is run. - - - - - Default constructor - - - - - Constructor with a reason - - The reason test is marked explicit - - - - The reason test is marked explicit - - - - - Attribute used to mark a test that is to be ignored. - Ignored tests result in a warning message when the - tests are run. - - - - - Constructs the attribute without giving a reason - for ignoring the test. - - - - - Constructs the attribute giving a reason for ignoring the test - - The reason for ignoring the test - - - - The reason for ignoring a test - - - - - Abstract base for Attributes that are used to include tests - in the test run based on environmental settings. - - - - - Constructor with no included items specified, for use - with named property syntax. - - - - - Constructor taking one or more included items - - Comma-delimited list of included items - - - - Name of the item that is needed in order for - a test to run. Multiple itemss may be given, - separated by a comma. - - - - - Name of the item to be excluded. Multiple items - may be given, separated by a comma. - - - - - The reason for including or excluding the test - - - - - PlatformAttribute is used to mark a test fixture or an - individual method as applying to a particular platform only. - - - - - Constructor with no platforms specified, for use - with named property syntax. - - - - - Constructor taking one or more platforms - - Comma-deliminted list of platforms - - - - CultureAttribute is used to mark a test fixture or an - individual method as applying to a particular Culture only. - - - - - Constructor with no cultures specified, for use - with named property syntax. - - - - - Constructor taking one or more cultures - - Comma-deliminted list of cultures - - - - Marks a test to use a combinatorial join of any argument data - provided. NUnit will create a test case for every combination of - the arguments provided. This can result in a large number of test - cases and so should be used judiciously. This is the default join - type, so the attribute need not be used except as documentation. - - - - - PropertyAttribute is used to attach information to a test as a name/value pair.. - - - - - Construct a PropertyAttribute with a name and string value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and int value - - The name of the property - The property value - - - - Construct a PropertyAttribute with a name and double value - - The name of the property - The property value - - - - Constructor for derived classes that set the - property dictionary directly. - - - - - Constructor for use by derived classes that use the - name of the type as the property name. Derived classes - must ensure that the Type of the property value is - a standard type supported by the BCL. Any custom - types will cause a serialization Exception when - in the client. - - - - - Gets the property dictionary for this attribute - - - - - Default constructor - - - - - Marks a test to use pairwise join of any argument data provided. - NUnit will attempt too excercise every pair of argument values at - least once, using as small a number of test cases as it can. With - only two arguments, this is the same as a combinatorial join. - - - - - Default constructor - - - - - Marks a test to use a sequential join of any argument data - provided. NUnit will use arguements for each parameter in - sequence, generating test cases up to the largest number - of argument values provided and using null for any arguments - for which it runs out of values. Normally, this should be - used with the same number of arguments for each parameter. - - - - - Default constructor - - - - - Summary description for MaxTimeAttribute. - - - - - Construct a MaxTimeAttribute, given a time in milliseconds. - - The maximum elapsed time in milliseconds - - - - RandomAttribute is used to supply a set of random values - to a single parameter of a parameterized test. - - - - - ValuesAttribute is used to provide literal arguments for - an individual parameter of a test. - - - - - Abstract base class for attributes that apply to parameters - and supply data for the parameter. - - - - - Gets the data to be provided to the specified parameter - - - - - The collection of data to be returned. Must - be set by any derived attribute classes. - We use an object[] so that the individual - elements may have their type changed in GetData - if necessary. - - - - - Construct with one argument - - - - - - Construct with two arguments - - - - - - - Construct with three arguments - - - - - - - - Construct with an array of arguments - - - - - - Get the collection of values to be used as arguments - - - - - Construct a set of doubles from 0.0 to 1.0, - specifying only the count. - - - - - - Construct a set of doubles from min to max - - - - - - - - Construct a set of ints from min to max - - - - - - - - Get the collection of values to be used as arguments - - - - - RangeAttribute is used to supply a range of values to an - individual parameter of a parameterized test. - - - - - Construct a range of ints using default step of 1 - - - - - - - Construct a range of ints specifying the step size - - - - - - - - Construct a range of longs - - - - - - - - Construct a range of doubles - - - - - - - - Construct a range of floats - - - - - - - - RepeatAttribute may be applied to test case in order - to run it multiple times. - - - - - Construct a RepeatAttribute - - The number of times to run the test - - - - RequiredAddinAttribute may be used to indicate the names of any addins - that must be present in order to run some or all of the tests in an - assembly. If the addin is not loaded, the entire assembly is marked - as NotRunnable. - - - - - Initializes a new instance of the class. - - The required addin. - - - - Gets the name of required addin. - - The required addin name. - - - - Summary description for SetCultureAttribute. - - - - - Construct given the name of a culture - - - - - - Summary description for SetUICultureAttribute. - - - - - Construct given the name of a culture - - - - - - Attribute used to mark a class that contains one-time SetUp - and/or TearDown methods that apply to all the tests in a - namespace or an assembly. - - - - - SetUpFixtureAttribute is used to identify a SetUpFixture - - - - - Attribute used to mark a static (shared in VB) property - that returns a list of tests. - - - - - Attribute used to identify a method that is called - immediately after each test is run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - publc void TestDescriptionMethod() - {} - } - - - - - - Descriptive text for this test - - - - - TestCaseAttribute is used to mark parameterized test cases - and provide them with their arguments. - - - - - The ITestCaseData interface is implemented by a class - that is able to return complete testcases for use by - a parameterized test method. - - NOTE: This interface is used in both the framework - and the core, even though that results in two different - types. However, sharing the source code guarantees that - the various implementations will be compatible and that - the core is able to reflect successfully over the - framework implementations of ITestCaseData. - - - - - Gets the argument list to be provided to the test - - - - - Gets the expected result - - - - - Gets the expected exception Type - - - - - Gets the FullName of the expected exception - - - - - Gets the name to be used for the test - - - - - Gets the description of the test - - - - - Gets a value indicating whether this is ignored. - - true if ignored; otherwise, false. - - - - Gets the ignore reason. - - The ignore reason. - - - - Construct a TestCaseAttribute with a list of arguments. - This constructor is not CLS-Compliant - - - - - - Construct a TestCaseAttribute with a single argument - - - - - - Construct a TestCaseAttribute with a two arguments - - - - - - - Construct a TestCaseAttribute with a three arguments - - - - - - - - Gets the list of arguments to a test case - - - - - Gets or sets the expected result. - - The result. - - - - Gets a list of categories associated with this test; - - - - - Gets or sets the category associated with this test. - May be a single category or a comma-separated list. - - - - - Gets or sets the expected exception. - - The expected exception. - - - - Gets or sets the name the expected exception. - - The expected name of the exception. - - - - Gets or sets the expected message of the expected exception - - The expected message of the exception. - - - - Gets or sets the type of match to be performed on the expected message - - - - - Gets or sets the description. - - The description. - - - - Gets or sets the name of the test. - - The name of the test. - - - - Gets or sets the ignored status of the test - - - - - Gets or sets the ignored status of the test - - - - - Gets the ignore reason. - - The ignore reason. - - - - FactoryAttribute indicates the source to be used to - provide test cases for a test method. - - - - - Construct with the name of the factory - for use with languages - that don't support params arrays. - - An array of the names of the factories that will provide data - - - - Construct with a Type and name - for use with languages - that don't support params arrays. - - The Type that will provide data - The name of the method, property or field that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - [TestFixture] - public class ExampleClass - {} - - - - - Default constructor - - - - - Construct with a object[] representing a set of arguments. - In .NET 2.0, the arguments may later be separated into - type arguments and constructor arguments. - - - - - - Descriptive text for this fixture - - - - - Gets and sets the category for this fixture. - May be a comma-separated list of categories. - - - - - Gets a list of categories for this fixture - - - - - The arguments originally provided to the attribute - - - - - Gets or sets a value indicating whether this should be ignored. - - true if ignore; otherwise, false. - - - - Gets or sets the ignore reason. May set Ignored as a side effect. - - The ignore reason. - - - - Get or set the type arguments. If not set - explicitly, any leading arguments that are - Types are taken as type arguments. - - - - - Attribute used to identify a method that is - called before any tests in a fixture are run. - - - - - Attribute used to identify a method that is called after - all the tests in a fixture have run. The method is - guaranteed to be called, even if an exception is thrown. - - - - - Adding this attribute to a method within a - class makes the method callable from the NUnit test runner. There is a property - called Description which is optional which you can provide a more detailed test - description. This class cannot be inherited. - - - - [TestFixture] - public class Fixture - { - [Test] - public void MethodToTest() - {} - - [Test(Description = "more detailed description")] - publc void TestDescriptionMethod() - {} - } - - - - - - WUsed on a method, marks the test with a timeout value in milliseconds. - The test will be run in a separate thread and is cancelled if the timeout - is exceeded. Used on a method or assembly, sets the default timeout - for all contained test methods. - - - - - Construct a TimeoutAttribute given a time in milliseconds - - The timeout value in milliseconds - - - - Marks a test that must run in the STA, causing it - to run in a separate thread if necessary. - - On methods, you may also use STAThreadAttribute - to serve the same purpose. - - - - - Construct a RequiresSTAAttribute - - - - - Marks a test that must run in the MTA, causing it - to run in a separate thread if necessary. - - On methods, you may also use MTAThreadAttribute - to serve the same purpose. - - - - - Construct a RequiresMTAAttribute - - - - - Marks a test that must run on a separate thread. - - - - - Construct a RequiresThreadAttribute - - - - - Construct a RequiresThreadAttribute, specifying the apartment - - - - - ValueSourceAttribute indicates the source to be used to - provide data for one parameter of a test method. - - - - - Construct with the name of the factory - for use with languages - that don't support params arrays. - - The name of the data source to be used - - - - Construct with a Type and name - for use with languages - that don't support params arrays. - - The Type that will provide data - The name of the method, property or field that will provide data - - - - The name of a the method, property or fiend to be used as a source - - - - - A Type to be used as a source - - - - - AttributeExistsConstraint tests for the presence of a - specified attribute on a Type. - - - - - The Constraint class is the base of all built-in constraints - within NUnit. It provides the operator overloads used to combine - constraints. - - - - - The IConstraintExpression interface is implemented by all - complete and resolvable constraints and expressions. - - - - - Return the top-level constraint for this expression - - - - - - Static UnsetObject used to detect derived constraints - failing to set the actual value. - - - - - The actual value being tested against a constraint - - - - - The display name of this Constraint for use by ToString() - - - - - Argument fields used by ToString(); - - - - - The builder holding this constraint - - - - - Construct a constraint with no arguments - - - - - Construct a constraint with one argument - - - - - Construct a constraint with two arguments - - - - - Sets the ConstraintBuilder holding this constraint - - - - - Write the failure message to the MessageWriter provided - as an argument. The default implementation simply passes - the constraint and the actual value to the writer, which - then displays the constraint description and the value. - - Constraints that need to provide additional details, - such as where the error occured can override this. - - The MessageWriter on which to display the message - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Test whether the constraint is satisfied by an - ActualValueDelegate that returns the value to be tested. - The default implementation simply evaluates the delegate - but derived classes may override it to provide for delayed - processing. - - An ActualValueDelegate - True for success, false for failure - - - - Test whether the constraint is satisfied by a given reference. - The default implementation simply dereferences the value but - derived classes may override it to provide for delayed processing. - - A reference to the value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - Default override of ToString returns the constraint DisplayName - followed by any arguments within angle brackets. - - - - - - Returns the string representation of this constraint - - - - - This operator creates a constraint that is satisfied only if both - argument constraints are satisfied. - - - - - This operator creates a constraint that is satisfied if either - of the argument constraints is satisfied. - - - - - This operator creates a constraint that is satisfied if the - argument constraint is not satisfied. - - - - - Returns a DelayedConstraint with the specified delay time. - - The delay in milliseconds. - - - - - Returns a DelayedConstraint with the specified delay time - and polling interval. - - The delay in milliseconds. - The interval at which to test the constraint. - - - - - The display name of this Constraint for use by ToString(). - The default value is the name of the constraint with - trailing "Constraint" removed. Derived classes may set - this to another name in their constructors. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending And - to the current constraint. - - - - - Returns a ConstraintExpression by appending Or - to the current constraint. - - - - - Class used to detect any derived constraints - that fail to set the actual value in their - Matches override. - - - - - Constructs an AttributeExistsConstraint for a specific attribute Type - - - - - - Tests whether the object provides the expected attribute. - - A Type, MethodInfo, or other ICustomAttributeProvider - True if the expected attribute is present, otherwise false - - - - Writes the description of the constraint to the specified writer - - - - - AttributeConstraint tests that a specified attribute is present - on a Type or other provider and that the value of the attribute - satisfies some other constraint. - - - - - Abstract base class used for prefixes - - - - - The base constraint - - - - - Construct given a base constraint - - - - - - Constructs an AttributeConstraint for a specified attriute - Type and base constraint. - - - - - - - Determines whether the Type or other provider has the - expected attribute and if its value matches the - additional constraint specified. - - - - - Writes a description of the attribute to the specified writer. - - - - - Writes the actual value supplied to the specified writer. - - - - - Returns a string representation of the constraint. - - - - - BasicConstraint is the abstract base for constraints that - perform a simple comparison to a constant value. - - - - - Initializes a new instance of the class. - - The expected. - The description. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - NullConstraint tests that the actual value is null - - - - - Initializes a new instance of the class. - - - - - TrueConstraint tests that the actual value is true - - - - - Initializes a new instance of the class. - - - - - FalseConstraint tests that the actual value is false - - - - - Initializes a new instance of the class. - - - - - NaNConstraint tests that the actual value is a double or float NaN - - - - - Test that the actual value is an NaN - - - - - - - Write the constraint description to a specified writer - - - - - - BinaryConstraint is the abstract base of all constraints - that combine two other constraints in some fashion. - - - - - The first constraint being combined - - - - - The second constraint being combined - - - - - Construct a BinaryConstraint from two other constraints - - The first constraint - The second constraint - - - - AndConstraint succeeds only if both members succeed. - - - - - Create an AndConstraint from two other constraints - - The first constraint - The second constraint - - - - Apply both member constraints to an actual value, succeeding - succeeding only if both of them succeed. - - The actual value - True if the constraints both succeeded - - - - Write a description for this contraint to a MessageWriter - - The MessageWriter to receive the description - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - OrConstraint succeeds if either member succeeds - - - - - Create an OrConstraint from two other constraints - - The first constraint - The second constraint - - - - Apply the member constraints to an actual value, succeeding - succeeding as soon as one of them succeeds. - - The actual value - True if either constraint succeeded - - - - Write a description for this contraint to a MessageWriter - - The MessageWriter to receive the description - - - - CollectionConstraint is the abstract base class for - constraints that operate on collections. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Determines whether the specified enumerable is empty. - - The enumerable. - - true if the specified enumerable is empty; otherwise, false. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Protected method to be implemented by derived classes - - - - - - - CollectionItemsEqualConstraint is the abstract base class for all - collection constraints that apply some notion of item equality - as a part of their operation. - - - - - Construct an empty CollectionConstraint - - - - - Construct a CollectionConstraint - - - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Compares two collection members for equality - - - - - Return a new CollectionTally for use in making tests - - The collection to be included in the tally - - - - Flag the constraint to ignore case and return self. - - - - - EmptyCollectionConstraint tests whether a collection is empty. - - - - - Check that the collection is empty - - - - - - - Write the constraint description to a MessageWriter - - - - - - UniqueItemsConstraint tests whether all the items in a - collection are unique. - - - - - Check that all items are unique. - - - - - - - Write a description of this constraint to a MessageWriter - - - - - - CollectionContainsConstraint is used to test whether a collection - contains an expected object as a member. - - - - - Construct a CollectionContainsConstraint - - - - - - Test whether the expected item is contained in the collection - - - - - - - Write a descripton of the constraint to a MessageWriter - - - - - - CollectionEquivalentCOnstraint is used to determine whether two - collections are equivalent. - - - - - Construct a CollectionEquivalentConstraint - - - - - - Test whether two collections are equivalent - - - - - - - Write a description of this constraint to a MessageWriter - - - - - - CollectionSubsetConstraint is used to determine whether - one collection is a subset of another - - - - - Construct a CollectionSubsetConstraint - - The collection that the actual value is expected to be a subset of - - - - Test whether the actual collection is a subset of - the expected collection provided. - - - - - - - Write a description of this constraint to a MessageWriter - - - - - - CollectionOrderedConstraint is used to test whether a collection is ordered. - - - - - Construct a CollectionOrderedConstraint - - - - - Modifies the constraint to use an IComparer and returns self. - - - - - Modifies the constraint to use an IComparer<T> and returns self. - - - - - Modifies the constraint to use a Comparison<T> and returns self. - - - - - Modifies the constraint to test ordering by the value of - a specified property and returns self. - - - - - Test whether the collection is ordered - - - - - - - Write a description of the constraint to a MessageWriter - - - - - - Returns the string representation of the constraint. - - - - - - If used performs a reverse comparison - - - - - CollectionTally counts (tallies) the number of - occurences of each object in one or more enumerations. - - - - - Construct a CollectionTally object from a comparer and a collection - - - - - Try to remove an object from the tally - - The object to remove - True if successful, false if the object was not found - - - - Try to remove a set of objects from the tally - - The objects to remove - True if successful, false if any object was not found - - - - The number of objects remaining in the tally - - - - - ComparisonAdapter class centralizes all comparisons of - values in NUnit, adapting to the use of any provided - IComparer, IComparer<T> or Comparison<T> - - - - - Returns a ComparisonAdapter that wraps an IComparer - - - - - Returns a ComparisonAdapter that wraps an IComparer<T> - - - - - Returns a ComparisonAdapter that wraps a Comparison<T> - - - - - Compares two objects - - - - - Gets the default ComparisonAdapter, which wraps an - NUnitComparer object. - - - - - Construct a ComparisonAdapter for an IComparer - - - - - Compares two objects - - - - - - - - Construct a default ComparisonAdapter - - - - - ComparisonAdapter<T> extends ComparisonAdapter and - allows use of an IComparer<T> or Comparison<T> - to actually perform the comparison. - - - - - Construct a ComparisonAdapter for an IComparer<T> - - - - - Compare a Type T to an object - - - - - Construct a ComparisonAdapter for a Comparison<T> - - - - - Compare a Type T to an object - - - - - Abstract base class for constraints that compare values to - determine if one is greater than, equal to or less than - the other. - - - - - The value against which a comparison is to be made - - - - - If true, less than returns success - - - - - if true, equal returns success - - - - - if true, greater than returns success - - - - - The predicate used as a part of the description - - - - - ComparisonAdapter to be used in making the comparison - - - - - Initializes a new instance of the class. - - The value against which to make a comparison. - if set to true less succeeds. - if set to true equal succeeds. - if set to true greater succeeds. - String used in describing the constraint. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Modifies the constraint to use an IComparer and returns self - - - - - Modifies the constraint to use an IComparer<T> and returns self - - - - - Modifies the constraint to use a Comparison<T> and returns self - - - - - Tests whether a value is greater than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is greater than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is less than the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Tests whether a value is less than or equal to the value supplied to its constructor - - - - - Initializes a new instance of the class. - - The expected value. - - - - Delegate used to delay evaluation of the actual value - to be used in evaluating a constraint - - - - - ConstraintBuilder maintains the stacks that are used in - processing a ConstraintExpression. An OperatorStack - is used to hold operators that are waiting for their - operands to be reognized. a ConstraintStack holds - input constraints as well as the results of each - operator applied. - - - - - Initializes a new instance of the class. - - - - - Appends the specified operator to the expression by first - reducing the operator stack and then pushing the new - operator on the stack. - - The operator to push. - - - - Appends the specified constraint to the expresson by pushing - it on the constraint stack. - - The constraint to push. - - - - Sets the top operator right context. - - The right context. - - - - Reduces the operator stack until the topmost item - precedence is greater than or equal to the target precedence. - - The target precedence. - - - - Resolves this instance, returning a Constraint. If the builder - is not currently in a resolvable state, an exception is thrown. - - The resolved constraint - - - - Gets a value indicating whether this instance is resolvable. - - - true if this instance is resolvable; otherwise, false. - - - - - OperatorStack is a type-safe stack for holding ConstraintOperators - - - - - Initializes a new instance of the class. - - The builder. - - - - Pushes the specified operator onto the stack. - - The op. - - - - Pops the topmost operator from the stack. - - - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Gets the topmost operator without modifying the stack. - - The top. - - - - ConstraintStack is a type-safe stack for holding Constraints - - - - - Initializes a new instance of the class. - - The builder. - - - - Pushes the specified constraint. As a side effect, - the constraint's builder field is set to the - ConstraintBuilder owning this stack. - - The constraint. - - - - Pops this topmost constrait from the stack. - As a side effect, the constraint's builder - field is set to null. - - - - - - Gets a value indicating whether this is empty. - - true if empty; otherwise, false. - - - - Gets the topmost constraint without modifying the stack. - - The topmost constraint - - - - ConstraintExpression represents a compound constraint in the - process of being constructed from a series of syntactic elements. - - Individual elements are appended to the expression as they are - reognized. Once an actual Constraint is appended, the expression - returns a resolvable Constraint. - - - - - ConstraintExpressionBase is the abstract base class for the - generated ConstraintExpression class, which represents a - compound constraint in the process of being constructed - from a series of syntactic elements. - - NOTE: ConstraintExpressionBase is aware of some of its - derived classes, which is an apparent violation of - encapsulation. Ideally, these classes would be a - single class, but they must be separated in order to - allow parts to be generated under .NET 1.x and to - provide proper user feedback in syntactically - aware IDEs. - - - - - The ConstraintBuilder holding the elements recognized so far - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. - - The builder. - - - - Returns a string representation of the expression as it - currently stands. This should only be used for testing, - since it has the side-effect of resolving the expression. - - - - - - Appends an operator to the expression and returns the - resulting expression itself. - - - - - Appends a self-resolving operator to the expression and - returns a new ResolvableConstraintExpression. - - - - - Appends a constraint to the expression and returns that - constraint, which is associated with the current state - of the expression being built. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the - class passing in a ConstraintBuilder, which may be pre-populated. - - The builder. - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns the constraint provided as an argument - used to allow custom - custom constraints to easily participate in the syntax. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the suppled argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - With is currently a NOP - reserved for future use. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the suppled argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a new ContainsConstraint. This constraint - will, in turn, make use of the appropriate second-level - constraint, depending on the type of the actual argument. - This overload is only used if the item sought is a string, - since any other type implies that we are looking for a - collection member. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. - - - - - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - The ConstraintOperator class is used internally by a - ConstraintBuilder to represent an operator that - modifies or combines constraints. - - Constraint operators use left and right precedence - values to determine whether the top operator on the - stack should be reduced before pushing a new operator. - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - The syntax element preceding this operator - - - - - The syntax element folowing this operator - - - - - The precedence value used when the operator - is about to be pushed to the stack. - - - - - The precedence value used when the operator - is on the top of the stack. - - - - - PrefixOperator takes a single constraint and modifies - it's action in some way. - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Returns the constraint created by applying this - prefix to another constraint. - - - - - - - Negates the test of the constraint it wraps. - - - - - Constructs a new NotOperator - - - - - Returns a NotConstraint applied to its argument. - - - - - Abstract base for operators that indicate how to - apply a constraint to items in a collection. - - - - - Constructs a CollectionOperator - - - - - Represents a constraint that succeeds if all the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - they all succeed. - - - - - Represents a constraint that succeeds if any of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - any of them succeed. - - - - - Represents a constraint that succeeds if none of the - members of a collection match a base constraint. - - - - - Returns a constraint that will apply the argument - to the members of a collection, succeeding if - none of them succeed. - - - - - Represents a constraint that simply wraps the - constraint provided as an argument, without any - further functionality, but which modifes the - order of evaluation because of its precedence. - - - - - Constructor for the WithOperator - - - - - Returns a constraint that wraps its argument - - - - - Abstract base class for operators that are able to reduce to a - constraint whether or not another syntactic element follows. - - - - - Operator used to test for the presence of a named Property - on an object and optionally apply further tests to the - value of that property. - - - - - Constructs a PropOperator for a particular named property - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Gets the name of the property to which the operator applies - - - - - Operator that tests for the presence of a particular attribute - on a type and optionally applies further tests to the attribute. - - - - - Construct an AttributeOperator for a particular Type - - The Type of attribute tested - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Operator that tests that an exception is thrown and - optionally applies further tests to the exception. - - - - - Construct a ThrowsOperator - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - Abstract base class for all binary operators - - - - - Reduce produces a constraint from the operator and - any arguments. It takes the arguments from the constraint - stack and pushes the resulting constraint on it. - - - - - - Abstract method that produces a constraint by applying - the operator to its left and right constraint arguments. - - - - - Gets the left precedence of the operator - - - - - Gets the right precedence of the operator - - - - - Operator that requires both it's arguments to succeed - - - - - Construct an AndOperator - - - - - Apply the operator to produce an AndConstraint - - - - - Operator that requires at least one of it's arguments to succeed - - - - - Construct an OrOperator - - - - - Apply the operator to produce an OrConstraint - - - - - ContainsConstraint tests a whether a string contains a substring - or a collection contains an object. It postpones the decision of - which test to use until the type of the actual argument is known. - This allows testing whether a string is contained in a collection - or as a substring of another string using the same syntax. - - - - - Initializes a new instance of the class. - - The expected. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to ignore case and return self. - - - - - Applies a delay to the match so that a match can be evaluated in the future. - - - - - Creates a new DelayedConstraint - - The inner constraint two decorate - The time interval after which the match is performed - If the value of is less than 0 - - - - Creates a new DelayedConstraint - - The inner constraint two decorate - The time interval after which the match is performed - The time interval used for polling - If the value of is less than 0 - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - Test whether the constraint is satisfied by a delegate - - The delegate whose value is to be tested - True for if the base constraint fails, false if it succeeds - - - - Test whether the constraint is satisfied by a given reference. - Overridden to wait for the specified delay period before - calling the base constraint with the dereferenced value. - - A reference to the value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a MessageWriter. - - The writer on which the actual value is displayed - - - - Returns the string representation of the constraint. - - - - - EmptyDirectoryConstraint is used to test that a directory is empty - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - EmptyConstraint tests a whether a string or collection is empty, - postponing the decision about which test is applied until the - type of the actual argument is known. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - EqualConstraint is able to compare an actual value with the - expected value provided in its constructor. Two objects are - considered equal if both are null, or if both have the same - value. NUnit has special semantics for some object types. - - - - - If true, strings in error messages will be clipped - - - - - NUnitEqualityComparer used to test equality. - - - - - Initializes a new instance of the class. - - The expected value. - - - - Flag the constraint to use a tolerance when determining equality. - - Tolerance value to be used - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied Comparison object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Flag the constraint to use the supplied IEqualityComparer object. - - The IComparer object to use. - Self. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write a failure message. Overridden to provide custom - failure messages for EqualConstraint. - - The MessageWriter to write to - - - - Write description of this constraint - - The MessageWriter to write to - - - - Display the failure information for two collections that did not match. - - The MessageWriter on which to display - The expected collection. - The actual collection - The depth of this failure in a set of nested collections - - - - Displays a single line showing the types and sizes of the expected - and actual collections or arrays. If both are identical, the value is - only shown once. - - The MessageWriter on which to display - The expected collection or array - The actual collection or array - The indentation level for the message line - - - - Displays a single line showing the point in the expected and actual - arrays at which the comparison failed. If the arrays have different - structures or dimensions, both values are shown. - - The MessageWriter on which to display - The expected array - The actual array - Index of the failure point in the underlying collections - The indentation level for the message line - - - - Flag the constraint to ignore case and return self. - - - - - Flag the constraint to suppress string clipping - and return self. - - - - - Flag the constraint to compare arrays as collections - and return self. - - - - - Switches the .Within() modifier to interpret its tolerance as - a distance in representable values (see remarks). - - Self. - - Ulp stands for "unit in the last place" and describes the minimum - amount a given value can change. For any integers, an ulp is 1 whole - digit. For floating point values, the accuracy of which is better - for smaller numbers and worse for larger numbers, an ulp depends - on the size of the number. Using ulps for comparison of floating - point results instead of fixed tolerances is safer because it will - automatically compensate for the added inaccuracy of larger numbers. - - - - - Switches the .Within() modifier to interpret its tolerance as - a percentage that the actual values is allowed to deviate from - the expected value. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in days. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in hours. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in minutes. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in seconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in milliseconds. - - Self - - - - Causes the tolerance to be interpreted as a TimeSpan in clock ticks. - - Self - - - - EqualityAdapter class handles all equality comparisons - that use an IEqualityComparer, IEqualityComparer<T> - or a ComparisonAdapter. - - - - - Compares two objects, returning true if they are equal - - - - - Returns an EqualityAdapter that wraps an IComparer. - - - - - Returns an EqualityAdapter that wraps an IEqualityComparer. - - - - - Returns an EqualityAdapter that wraps an IEqualityComparer<T>. - - - - - Returns an EqualityAdapter that wraps an IComparer<T>. - - - - - Returns an EqualityAdapter that wraps a Comparison<T>. - - - - Helper routines for working with floating point numbers - - - The floating point comparison code is based on this excellent article: - http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm - - - "ULP" means Unit in the Last Place and in the context of this library refers to - the distance between two adjacent floating point numbers. IEEE floating point - numbers can only represent a finite subset of natural numbers, with greater - accuracy for smaller numbers and lower accuracy for very large numbers. - - - If a comparison is allowed "2 ulps" of deviation, that means the values are - allowed to deviate by up to 2 adjacent floating point values, which might be - as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. - - - - - Compares two floating point values for equality - First floating point value to be compared - Second floating point value t be compared - - Maximum number of representable floating point values that are allowed to - be between the left and the right floating point values - - True if both numbers are equal or close to being equal - - - Floating point values can only represent a finite subset of natural numbers. - For example, the values 2.00000000 and 2.00000024 can be stored in a float, - but nothing inbetween them. - - - This comparison will count how many possible floating point values are between - the left and the right number. If the number of possible values between both - numbers is less than or equal to maxUlps, then the numbers are considered as - being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - Compares two double precision floating point values for equality - First double precision floating point value to be compared - Second double precision floating point value t be compared - - Maximum number of representable double precision floating point values that are - allowed to be between the left and the right double precision floating point values - - True if both numbers are equal or close to being equal - - - Double precision floating point values can only represent a limited series of - natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 - can be stored in a double, but nothing inbetween them. - - - This comparison will count how many possible double precision floating point - values are between the left and the right number. If the number of possible - values between both numbers is less than or equal to maxUlps, then the numbers - are considered as being equal. - - - Implementation partially follows the code outlined here: - http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ - - - - - - Reinterprets the memory contents of a floating point value as an integer value - - - Floating point value whose memory contents to reinterpret - - - The memory contents of the floating point value interpreted as an integer - - - - - Reinterprets the memory contents of a double precision floating point - value as an integer value - - - Double precision floating point value whose memory contents to reinterpret - - - The memory contents of the double precision floating point value - interpreted as an integer - - - - - Reinterprets the memory contents of an integer as a floating point value - - Integer value whose memory contents to reinterpret - - The memory contents of the integer value interpreted as a floating point value - - - - - Reinterprets the memory contents of an integer value as a double precision - floating point value - - Integer whose memory contents to reinterpret - - The memory contents of the integer interpreted as a double precision - floating point value - - - - Union of a floating point variable and an integer - - - The union's value as a floating point variable - - - The union's value as an integer - - - The union's value as an unsigned integer - - - Union of a double precision floating point variable and a long - - - The union's value as a double precision floating point variable - - - The union's value as a long - - - The union's value as an unsigned long - - - - MessageWriter is the abstract base for classes that write - constraint descriptions and messages in some form. The - class has separate methods for writing various components - of a message, allowing implementations to tailor the - presentation as needed. - - - - - Construct a MessageWriter given a culture - - - - - Method to write single line message with optional args, usually - written to precede the general failure message. - - The message to be written - Any arguments used in formatting the message - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The constraint that failed - - - - Display Expected and Actual lines for given values. This - method may be called by constraints that need more control over - the display of actual and expected values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given values, including - a tolerance value on the Expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in locating the point where the strings differ - If true, the strings should be clipped to fit the line - - - - Writes the text for a connector. - - The connector. - - - - Writes the text for a predicate. - - The predicate. - - - - Writes the text for an expected value. - - The expected value. - - - - Writes the text for a modifier - - The modifier. - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Abstract method to get the max line length - - - - - Static methods used in creating messages - - - - - Static string used when strings are clipped - - - - - Returns the representation of a type as used in NUnitLite. - This is the same as Type.ToString() except for arrays, - which are displayed with their declared sizes. - - - - - - - Converts any control characters in a string - to their escaped representation. - - The string to be converted - The converted string - - - - Return the a string representation for a set of indices into an array - - Array of indices for which a string is needed - - - - Get an array of indices representing the point in a collection or - array corresponding to a single int index into the collection. - - The collection to which the indices apply - Index in the collection - Array of indices - - - - Clip a string to a given length, starting at a particular offset, returning the clipped - string with ellipses representing the removed parts - - The string to be clipped - The maximum permitted length of the result string - The point at which to start clipping - The clipped string - - - - Clip the expected and actual strings in a coordinated fashion, - so that they may be displayed together. - - - - - - - - - Shows the position two strings start to differ. Comparison - starts at the start index. - - The expected string - The actual string - The index in the strings at which comparison should start - Boolean indicating whether case should be ignored - -1 if no mismatch found, or the index where mismatch found - - - - The Numerics class contains common operations on numeric values. - - - - - Checks the type of the object, returning true if - the object is a numeric type. - - The object to check - true if the object is a numeric type - - - - Checks the type of the object, returning true if - the object is a floating point numeric type. - - The object to check - true if the object is a floating point numeric type - - - - Checks the type of the object, returning true if - the object is a fixed point numeric type. - - The object to check - true if the object is a fixed point numeric type - - - - Test two numeric values for equality, performing the usual numeric - conversions and using a provided or default tolerance. If the tolerance - provided is Empty, this method may set it to a default tolerance. - - The expected value - The actual value - A reference to the tolerance in effect - True if the values are equal - - - - Compare two numeric values, performing the usual numeric conversions. - - The expected value - The actual value - The relationship of the values to each other - - - - NUnitComparer encapsulates NUnit's default behavior - in comparing two objects. - - - - - Compares two objects - - - - - - - - Returns the default NUnitComparer. - - - - - NUnitEqualityComparer encapsulates NUnit's handling of - equality tests between objects. - - - - - If true, all string comparisons will ignore case - - - - - If true, arrays will be treated as collections, allowing - those of different dimensions to be compared - - - - - If non-zero, equality comparisons within the specified - tolerance will succeed. - - - - - Comparison object used in comparisons for some constraints. - - - - - Compares two objects for equality. - - - - - Helper method to compare two arrays - - - - - Method to compare two DirectoryInfo objects - - first directory to compare - second directory to compare - true if equivalent, false if not - - - - Returns the default NUnitEqualityComparer - - - - - Gets and sets a flag indicating whether case should - be ignored in determining equality. - - - - - Gets and sets a flag indicating that arrays should be - compared as collections, without regard to their shape. - - - - - Gets and sets an external comparer to be used to - test for equality. It is applied to members of - collections, in place of NUnit's own logic. - - - - - Gets and sets a tolerance used to compare objects of - certin types. - - - - - Gets the list of failure points for the last Match performed. - - - - - PathConstraint serves as the abstract base of constraints - that operate on paths and provides several helper methods. - - - - - The expected path used in the constraint - - - - - The actual path being tested - - - - - Flag indicating whether a caseInsensitive comparison should be made - - - - - Construct a PathConstraint for a give expected path - - The expected path - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Returns true if the expected path and actual path match - - - - - Returns the string representation of this constraint - - - - - Canonicalize the provided path - - - The path in standardized form - - - - Test whether two paths are the same - - The first path - The second path - Indicates whether case should be ignored - - - - - Test whether one path is under another path - - The first path - supposed to be the parent path - The second path - supposed to be the child path - Indicates whether case should be ignored - - - - - Test whether one path is the same as or under another path - - The first path - supposed to be the parent path - The second path - supposed to be the child path - - - - - Modifies the current instance to be case-insensitve - and returns it. - - - - - Modifies the current instance to be case-sensitve - and returns it. - - - - - Summary description for SamePathConstraint. - - - - - Initializes a new instance of the class. - - The expected path - - - - Test whether the constraint is satisfied by a given value - - The expected path - The actual path - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - SubPathConstraint tests that the actual path is under the expected path - - - - - Initializes a new instance of the class. - - The expected path - - - - Test whether the constraint is satisfied by a given value - - The expected path - The actual path - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - SamePathOrUnderConstraint tests that one path is under another - - - - - Initializes a new instance of the class. - - The expected path - - - - Test whether the constraint is satisfied by a given value - - The expected path - The actual path - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Predicate constraint wraps a Predicate in a constraint, - returning success if the predicate is true. - - - - - Construct a PredicateConstraint from a predicate - - - - - Determines whether the predicate succeeds when applied - to the actual value. - - - - - Writes the description to a MessageWriter - - - - - NotConstraint negates the effect of some other constraint - - - - - Initializes a new instance of the class. - - The base constraint to be negated. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for if the base constraint fails, false if it succeeds - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a MessageWriter. - - The writer on which the actual value is displayed - - - - AllItemsConstraint applies another constraint to each - item in a collection, succeeding if they all succeed. - - - - - Construct an AllItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - Write a description of this constraint to a MessageWriter - - - - - - SomeItemsConstraint applies another constraint to each - item in a collection, succeeding if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - succeeding if any item succeeds. - - - - - - - Write a description of this constraint to a MessageWriter - - - - - - NoItemConstraint applies another constraint to each - item in a collection, failing if any of them succeeds. - - - - - Construct a SomeItemsConstraint on top of an existing constraint - - - - - - Apply the item constraint to each item in the collection, - failing if any item fails. - - - - - - - Write a description of this constraint to a MessageWriter - - - - - - PropertyExistsConstraint tests that a named property - exists on the object provided through Match. - - Originally, PropertyConstraint provided this feature - in addition to making optional tests on the vaue - of the property. The two constraints are now separate. - - - - - Initializes a new instance of the class. - - The name of the property. - - - - Test whether the property exists for a given object - - The object to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a - MessageWriter. - - The writer on which the actual value is displayed - - - - Returns the string representation of the constraint. - - - - - - PropertyConstraint extracts a named property and uses - its value as the actual value for a chained constraint. - - - - - Initializes a new instance of the class. - - The name. - The constraint to apply to the property. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - Returns the string representation of the constraint. - - - - - - RangeConstraint tests whethe two values are within a - specified range. - - - - - Initializes a new instance of the class. - - From. - To. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Modifies the constraint to use an IComparer and returns self. - - - - - Modifies the constraint to use an IComparer<T> and returns self. - - - - - Modifies the constraint to use a Comparison<T> and returns self. - - - - - ResolvableConstraintExpression is used to represent a compound - constraint being constructed at a point where the last operator - may either terminate the expression or may have additional - qualifying constraints added to it. - - It is used, for example, for a Property element or for - an Exception element, either of which may be optionally - followed by constraints that apply to the property or - exception. - - - - - Create a new instance of ResolvableConstraintExpression - - - - - Create a new instance of ResolvableConstraintExpression, - passing in a pre-populated ConstraintBuilder. - - - - - Resolve the current expression to a Constraint - - - - - Appends an And Operator to the expression - - - - - Appends an Or operator to the expression. - - - - - ReusableConstraint wraps a resolved constraint so that it - may be saved and reused as needed. - - - - - Construct a ReusableConstraint - - The constraint or expression to be reused - - - - Conversion operator from a normal constraint to a ReusableConstraint. - - The original constraint to be wrapped as a ReusableConstraint - - - - - Returns the string representation of the constraint. - - A string representing the constraint - - - - Resolves the ReusableConstraint by returning the constraint - that it originally wrapped. - - A resolved constraint - - - - SameAsConstraint tests whether an object is identical to - the object passed to its constructor - - - - - Initializes a new instance of the class. - - The expected object. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - BinarySerializableConstraint tests whether - an object is serializable in binary format. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - Returns the string representation - - - - - BinarySerializableConstraint tests whether - an object is serializable in binary format. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - Returns the string representation of this constraint - - - - - StringConstraint is the abstract base for constraints - that operate on strings. It supports the IgnoreCase - modifier for string operations. - - - - - The expected value - - - - - Indicates whether tests should be case-insensitive - - - - - Constructs a StringConstraint given an expected value - - The expected value - - - - Modify the constraint to ignore case in matching. - - - - - EmptyStringConstraint tests whether a string is empty. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - NullEmptyStringConstraint tests whether a string is either null or empty. - - - - - Constructs a new NullOrEmptyStringConstraint - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - SubstringConstraint can test whether a string contains - the expected substring. - - - - - Initializes a new instance of the class. - - The expected. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - StartsWithConstraint can test whether a string starts - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - EndsWithConstraint can test whether a string ends - with an expected substring. - - - - - Initializes a new instance of the class. - - The expected string - - - - Test whether the constraint is matched by the actual value. - This is a template method, which calls the IsMatch method - of the derived class. - - - - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - RegexConstraint can test whether a string matches - the pattern provided. - - - - - Initializes a new instance of the class. - - The pattern. - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True for success, false for failure - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - ThrowsConstraint is used to test the exception thrown by - a delegate by applying a constraint to it. - - - - - Initializes a new instance of the class, - using a constraint to be applied to the exception. - - A constraint to apply to the caught exception. - - - - Executes the code of the delegate and captures any exception. - If a non-null base constraint was provided, it applies that - constraint to the exception. - - A delegate representing the code to be tested - True if an exception is thrown and the constraint succeeds, otherwise false - - - - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. - - - - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - Returns the string representation of this constraint - - - - - Get the actual exception thrown - used by Assert.Throws. - - - - - ThrowsNothingConstraint tests that a delegate does not - throw an exception. - - - - - Test whether the constraint is satisfied by a given value - - The value to be tested - True if no exception is thrown, otherwise false - - - - Converts an ActualValueDelegate to a TestDelegate - before calling the primary overload. - - - - - - - Write the constraint description to a MessageWriter - - The writer on which the description is displayed - - - - Write the actual value for a failing constraint test to a - MessageWriter. The default implementation simply writes - the raw value of actual, leaving it to the writer to - perform any formatting. - - The writer on which the actual value is displayed - - - - Modes in which the tolerance value for a comparison can - be interpreted. - - - - - The tolerance was created with a value, without specifying - how the value would be used. This is used to prevent setting - the mode more than once and is generally changed to Linear - upon execution of the test. - - - - - The tolerance is used as a numeric range within which - two compared values are considered to be equal. - - - - - Interprets the tolerance as the percentage by which - the two compared values my deviate from each other. - - - - - Compares two values based in their distance in - representable numbers. - - - - - The Tolerance class generalizes the notion of a tolerance - within which an equality test succeeds. Normally, it is - used with numeric types, but it can be used with any - type that supports taking a difference between two - objects and comparing that difference to a value. - - - - - Constructs a linear tolerance of a specdified amount - - - - - Constructs a tolerance given an amount and ToleranceMode - - - - - Tests that the current Tolerance is linear with a - numeric value, throwing an exception if it is not. - - - - - Returns an empty Tolerance object, equivalent to - specifying an exact match. - - - - - Gets the ToleranceMode for the current Tolerance - - - - - Gets the value of the current Tolerance instance. - - - - - Returns a new tolerance, using the current amount as a percentage. - - - - - Returns a new tolerance, using the current amount in Ulps. - - - - - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of days. - - - - - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of hours. - - - - - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of minutes. - - - - - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of seconds. - - - - - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of milliseconds. - - - - - Returns a new tolerance with a TimeSpan as the amount, using - the current amount as a number of clock ticks. - - - - - Returns true if the current tolerance is empty. - - - - - TypeConstraint is the abstract base for constraints - that take a Type as their expected value. - - - - - The expected Type used by the constraint - - - - - Construct a TypeConstraint for a given Type - - - - - - Write the actual value for a failing constraint test to a - MessageWriter. TypeConstraints override this method to write - the name of the type. - - The writer on which the actual value is displayed - - - - ExactTypeConstraint is used to test that an object - is of the exact type provided in the constructor - - - - - Construct an ExactTypeConstraint for a given Type - - The expected Type. - - - - Test that an object is of the exact type specified - - The actual value. - True if the tested object is of the exact type provided, otherwise false. - - - - Write the description of this constraint to a MessageWriter - - The MessageWriter to use - - - - InstanceOfTypeConstraint is used to test that an object - is of the same type provided or derived from it. - - - - - Construct an InstanceOfTypeConstraint for the type provided - - The expected Type - - - - Test whether an object is of the specified type or a derived type - - The object to be tested - True if the object is of the provided type or derives from it, otherwise false. - - - - Write a description of this constraint to a MessageWriter - - The MessageWriter to use - - - - AssignableFromConstraint is used to test that an object - can be assigned from a given Type. - - - - - Construct an AssignableFromConstraint for the type provided - - - - - - Test whether an object can be assigned from the specified type - - The object to be tested - True if the object can be assigned a value of the expected Type, otherwise false. - - - - Write a description of this constraint to a MessageWriter - - The MessageWriter to use - - - - AssignableToConstraint is used to test that an object - can be assigned to a given Type. - - - - - Construct an AssignableToConstraint for the type provided - - - - - - Test whether an object can be assigned to the specified type - - The object to be tested - True if the object can be assigned a value of the expected Type, otherwise false. - - - - Write a description of this constraint to a MessageWriter - - The MessageWriter to use - - - - Thrown when an assertion failed. - - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Thrown when a test executes inconclusively. - - - - - The error message that explains - the reason for the exception - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Thrown when an assertion failed. - - - - - - - The error message that explains - the reason for the exception - The exception that caused the - current exception - - - - Serialization Constructor - - - - - Delegate used by tests that execute code and - capture any thrown exception. - - - - - The Assert class contains a collection of static methods that - implement the most common assertions used in NUnit. - - - - - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Helper for Assert.AreEqual(double expected, double actual, ...) - allowing code generation to work consistently. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - The message to initialize the with. - - - - Throws a with the message and arguments - that are passed in. This allows a test to be cut short, with a result - of success returned to NUnit. - - - - - Throws an with the message and arguments - that are passed in. This is used by the other Assert functions. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This is used by the other Assert functions. - - The message to initialize the with. - - - - Throws an . - This is used by the other Assert functions. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as ignored. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as ignored. - - - - - Throws an with the message and arguments - that are passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - Arguments to be used in formatting the message - - - - Throws an with the message that is - passed in. This causes the test to be reported as inconclusive. - - The message to initialize the with. - - - - Throws an . - This causes the test to be reported as Inconclusive. - - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - The message that will be displayed on failure - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - The message that will be displayed on failure - - - - Verifies that a delegate throws a particular exception when called. - - A constraint to be satisfied by the exception - A TestSnippet delegate - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestSnippet delegate - The message that will be displayed on failure - - - - Verifies that a delegate throws a particular exception when called. - - The exception Type expected - A TestSnippet delegate - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestSnippet delegate - The message that will be displayed on failure - - - - Verifies that a delegate throws a particular exception when called. - - Type of the expected exception - A TestSnippet delegate - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - The message that will be displayed on failure - - - - Verifies that a delegate throws an exception when called - and returns it. - - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - The message that will be displayed on failure - - - - Verifies that a delegate throws an exception of a certain Type - or one derived from it when called and returns it. - - The expected Exception Type - A TestDelegate - - - - Verifies that a delegate does not throw an exception - - A TestSnippet delegate - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Verifies that a delegate does not throw an exception. - - A TestSnippet delegate - The message that will be displayed on failure - - - - Verifies that a delegate does not throw an exception. - - A TestSnippet delegate - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display in case of failure - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - The message to display in case of failure - - - - Asserts that a condition is false. If the condition is true the method throws - an . - - The evaluated condition - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - - - - Verifies that the object that is passed in is not equal to null - If the object is null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - The message to display in case of failure - - - - Verifies that the object that is passed in is equal to null - If the object is not null then an - is thrown. - - The object that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - The message to display in case of failure - - - - Verifies that the double that is passed in is an NaN value. - If the object is not NaN then an - is thrown. - - The value that is to be tested - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - The message to display in case of failure - - - - Assert that a string is empty - that is equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing ICollection - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - The message to display in case of failure - - - - Assert that a string is not empty - that is not equal to string.Empty - - The string to be tested - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - The message to display in case of failure - - - - Assert that an array, list or other collection is not empty - - An array, list or other collection implementing ICollection - - - - Assert that a string is either null or equal to string.Empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is either null or equal to string.Empty - - The string to be tested - The message to display in case of failure - - - - Assert that a string is either null or equal to string.Empty - - The string to be tested - - - - Assert that a string is not null or empty - - The string to be tested - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Assert that a string is not null or empty - - The string to be tested - The message to display in case of failure - - - - Assert that a string is not null or empty - - The string to be tested - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - - - - Asserts that an object may be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - The message to display in case of failure - - - - Asserts that an object may not be assigned a value of a given Type. - - The expected Type. - The object under examination - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - - - - Asserts that an object is an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - The message to display in case of failure - - - - Asserts that an object is not an instance of a given type. - - The expected Type - The object being examined - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are equal. If they are not, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - The message to display in case of failure - - - - Verifies that two doubles are equal considering a delta. If the - expected value is infinity then the delta value is ignored. If - they are not equal then an is - thrown. - - The expected value - The actual value - The maximum acceptable difference between the - the expected and the actual - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - - - - Verifies that two objects are equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are not equal an is thrown. - - The value that is expected - The actual value - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - The message to display in case of failure - - - - Verifies that two values are not equal. If they are equal, then an - is thrown. - - The expected value - The actual value - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - The message to display in case of failure - - - - Verifies that two objects are not equal. Two objects are considered - equal if both are null, or if both have the same value. NUnit - has special semantics for some object types. - If they are equal an is thrown. - - The value that is expected - The actual value - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - - - - Asserts that two objects refer to the same object. If they - are not the same an is thrown. - - The expected object - The actual object - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - The message to display in case of failure - - - - Asserts that two objects do not refer to the same object. If they - are the same an is thrown. - - The expected object - The actual object - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than the second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - The message to display in case of failure - - - - Verifies that the first value is greater than or equal tothe second - value. If it is not, then an - is thrown. - - The first value, expected to be greater - The second value, expected to be less - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - The message to display in case of failure - - - - Verifies that the first value is less than or equal to the second - value. If it is not, then an - is thrown. - - The first value, expected to be less - The second value, expected to be greater - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - The message to display in case of failure - Array of objects to be used in formatting the message - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - The message to display in case of failure - - - - Asserts that an object is contained in a list. - - The expected object - The list to be examined - - - - Gets the number of assertions executed so far and - resets the counter to zero. - - - - - AssertionHelper is an optional base class for user tests, - allowing the use of shorter names for constraints and - asserts and avoiding conflict with the definition of - , from which it inherits much of its - behavior, in certain mock object frameworks. - - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. Works - identically to - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. Works - identically to - - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. Works - identically to - - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - The message that will be displayed on failure - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an assertion exception on failure. - - A Constraint to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to - . - - The evaluated condition - The message to display if the condition is false - - - - Asserts that a condition is true. If the condition is false the method throws - an . Works Identically to . - - The evaluated condition - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - Returns a ListMapper based on a collection. - - The original collection - - - - - Provides static methods to express the assumptions - that must be met for a test to give a meaningful - result. If an assumption is not met, the test - should produce an inconclusive result. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - An ActualValueDelegate returning the value to be tested - The message that will be displayed on failure - - - - Apply a constraint to an actual value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - An ActualValueDelegate returning the value to be tested - A Constraint expression to be applied - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - - - - Apply a constraint to a referenced value, succeeding if the constraint - is satisfied and throwing an InconclusiveException on failure. - - A Constraint expression to be applied - The actual value to test - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - Arguments to be used in formatting the message - - - - Asserts that a condition is true. If the condition is false the method throws - an . - - The evaluated condition - The message to display if the condition is false - - - - Asserts that a condition is true. If the condition is false the - method throws an . - - The evaluated condition - - - - Asserts that the code represented by a delegate throws an exception - that satisfies the constraint provided. - - A TestDelegate to be executed - A ThrowsConstraint used in the test - - - - A set of Assert methods operationg on one or more collections - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - - - - Asserts that all items contained in collection are of the type specified by expectedType. - - IEnumerable containing objects to be considered - System.Type that all objects in collection must be instances of - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable containing objects to be considered - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable containing objects to be considered - The message that will be displayed on failure - - - - Asserts that all items contained in collection are not equal to null. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - The message that will be displayed on failure - - - - Ensures that every object contained in collection exists within the collection - once and only once. - - IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are exactly equal. The collections must have the same count, - and contain the exact same objects in the same order. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - - - - Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - - - - Asserts that expected and actual are not exactly equal. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not exactly equal. - If comparer is not null then it will be used to compare the objects. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The IComparer to use in comparing objects from each IEnumerable - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - - - - Asserts that expected and actual are not equivalent. - - The first IEnumerable of objects to be considered - The second IEnumerable of objects to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - - - - Asserts that collection contains actual as an item. - - IEnumerable of objects to be considered - Object to be found within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure - - - - Asserts that collection does not contain actual as an item. - - IEnumerable of objects to be considered - Object that cannot exist within collection - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that superset is not a subject of subset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that superset is not a subject of subset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - - - - Asserts that superset is not a subject of subset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Asserts that superset is a subset of subset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - - - - Asserts that superset is a subset of subset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - - - - Asserts that superset is a subset of subset. - - The IEnumerable superset to be considered - The IEnumerable subset to be considered - The message that will be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is empty - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - - - - Assert that an array,list or other collection is empty - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - The message to be displayed on failure - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure - Arguments to be used in formatting the message - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - The message to be displayed on failure - - - - Assert that an array, list or other collection is ordered - - An array, list or other collection implementing IEnumerable - A custom comparer to perform the comparisons - - - - Static helper class used in the constraint-based syntax - - - - - Creates a new SubstringConstraint - - The value of the substring - A SubstringConstraint - - - - Creates a new CollectionContainsConstraint. - - The item that should be found. - A new CollectionContainsConstraint - - - - Summary description for DirectoryAssert - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. - - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A directory path string containing the value that is expected - A directory path string containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A directory path string containing the value that is expected - A directory path string containing the actual value - The message to display if directories are not equal - - - - Verifies that two directories are equal. Two directories are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A directory path string containing the value that is expected - A directory path string containing the actual value - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - The message to display if directories are not equal - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory containing the value that is expected - A directory containing the actual value - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory path string containing the value that is expected - A directory path string containing the actual value - The message to display if directories are equal - Arguments to be used in formatting the message - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory path string containing the value that is expected - A directory path string containing the actual value - The message to display if directories are equal - - - - Asserts that two directories are not equal. If they are equal - an is thrown. - - A directory path string containing the value that is expected - A directory path string containing the actual value - - - - Asserts that the directory is empty. If it is not empty - an is thrown. - - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory is empty. If it is not empty - an is thrown. - - A directory to search - The message to display if directories are not equal - - - - Asserts that the directory is empty. If it is not empty - an is thrown. - - A directory to search - - - - Asserts that the directory is empty. If it is not empty - an is thrown. - - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory is empty. If it is not empty - an is thrown. - - A directory to search - The message to display if directories are not equal - - - - Asserts that the directory is empty. If it is not empty - an is thrown. - - A directory to search - - - - Asserts that the directory is not empty. If it is empty - an is thrown. - - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory is not empty. If it is empty - an is thrown. - - A directory to search - The message to display if directories are not equal - - - - Asserts that the directory is not empty. If it is empty - an is thrown. - - A directory to search - - - - Asserts that the directory is not empty. If it is empty - an is thrown. - - A directory to search - The message to display if directories are not equal - Arguments to be used in formatting the message - - - - Asserts that the directory is not empty. If it is empty - an is thrown. - - A directory to search - The message to display if directories are not equal - - - - Asserts that the directory is not empty. If it is empty - an is thrown. - - A directory to search - - - - Asserts that path contains actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - Arguments to be used in formatting the message - - - - Asserts that path contains actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - - - - Asserts that path contains actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - - - - Asserts that path contains actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - Arguments to be used in formatting the message - - - - Asserts that path contains actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - - - - Asserts that path contains actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - - - - Asserts that path does not contain actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - Arguments to be used in formatting the message - - - - Asserts that path does not contain actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - - - - Asserts that path does not contain actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - - - - Asserts that path does not contain actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - Arguments to be used in formatting the message - - - - Asserts that path does not contain actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - The message to display if directory is not within the path - - - - Asserts that path does not contain actual as a subdirectory or - an is thrown. - - A directory to search - sub-directory asserted to exist under directory - - - - Summary description for FileAssert. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - We don't actually want any instances of this object, but some people - like to inherit from it to add other static methods. Hence, the - protected constructor disallows any instances of this object. - - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - The message to display if objects are not equal - - - - Verifies that two Streams are equal. Two Streams are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The expected Stream - The actual Stream - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if objects are not equal - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - A file containing the value that is expected - A file containing the actual value - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if objects are not equal - - - - Verifies that two files are equal. Two files are considered - equal if both are null, or if both have the same value byte for byte. - If they are not equal an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - The message to be displayed when the two Stream are the same. - Arguments to be used in formatting the message - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - The message to be displayed when the Streams are the same. - - - - Asserts that two Streams are not equal. If they are equal - an is thrown. - - The expected Stream - The actual Stream - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - The message to display if objects are not equal - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - A file containing the value that is expected - A file containing the actual value - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if Streams are not equal - Arguments to be used in formatting the message - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - The message to display if objects are not equal - - - - Asserts that two files are not equal. If they are equal - an is thrown. - - The path to a file containing the value that is expected - The path to a file containing the actual value - - - - GlobalSettings is a place for setting default values used - by the framework in performing asserts. - - - - - Default tolerance for floating point equality - - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a new PropertyConstraintExpression, which will either - test for the existence of the named property on the object - being tested or apply any following constraint to that property. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new AttributeConstraint checking for the - presence of a particular attribute on an object. - - - - - Returns a new CollectionContainsConstraint checking for the - presence of a particular object in the collection. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if at least one of them succeeds. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them fail. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Length property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Count property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the Message property of the object being tested. - - - - - Returns a new ConstraintExpression, which will apply the following - constraint to the InnerException property of the object being tested. - - - - - Interface implemented by a user fixture in order to - validate any expected exceptions. It is only called - for test methods marked with the ExpectedException - attribute. - - - - - Method to handle an expected exception - - The exception to be handled - - - - Helper class with properties and methods that supply - a number of constraints used in Asserts. - - - - - Returns a constraint that tests two items for equality - - - - - Returns a constraint that tests that two references are the same object - - - - - Returns a constraint that tests whether the - actual value is greater than the suppled argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is greater than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument - - - - - Returns a constraint that tests whether the - actual value is less than or equal to the suppled argument - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual - value is of the exact type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is of the type supplied as an argument or a derived type. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is assignable from the type supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a collection containing the same elements as the - collection supplied as an argument. - - - - - Returns a constraint that tests whether the actual value - is a subset of the collection supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. - - - - - Returns a constraint that tests whether the path provided - is the same as an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the path provided - is the same path or under an expected path after canonicalization. - - - - - Returns a constraint that tests whether the actual value falls - within a specified range. - - - - - Returns a ConstraintExpression that negates any - following constraint. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - Returns a constraint that tests for null - - - - - Returns a constraint that tests for True - - - - - Returns a constraint that tests for False - - - - - Returns a constraint that tests for NaN - - - - - Returns a constraint that tests for empty - - - - - Returns a constraint that tests whether a collection - contains all unique items. - - - - - Returns a constraint that tests whether an object graph is serializable in binary format. - - - - - Returns a constraint that tests whether an object graph is serializable in xml format. - - - - - Returns a constraint that tests whether a collection is ordered - - - - - The Iz class is a synonym for Is intended for use in VB, - which regards Is as a keyword. - - - - - The List class is a helper class with properties and methods - that supply a number of constraints used with lists and collections. - - - - - List.Map returns a ListMapper, which can be used to map - the original collection to another collection. - - - - - - - ListMapper is used to transform a collection used as an actual argument - producing another collection to be used in the assertion. - - - - - Construct a ListMapper based on a collection - - The collection to be transformed - - - - Produces a collection containing all the values of a property - - The collection of property values - - - - - Randomizer returns a set of random values in a repeatable - way, to allow re-running of tests if necessary. - - - - - Get a randomizer for a particular member, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. - - - - - Get a randomizer for a particular parameter, returning - one that has already been created if it exists. - This ensures that the same values are generated - each time the tests are reloaded. - - - - - Construct a randomizer using a random seed - - - - - Construct a randomizer using a specified seed - - - - - Return an array of random doubles between 0.0 and 1.0. - - - - - - - Return an array of random doubles with values in a specified range. - - - - - Return an array of random ints with values in a specified range. - - - - - Get a random seed for use in creating a randomizer. - - - - - The SpecialValue enum is used to represent TestCase arguments - that cannot be used as arguments to an Attribute. - - - - - Null represents a null value, which cannot be used as an - argument to an attriute under .NET 1.x - - - - - Basic Asserts on strings. - - - - - The Equals method throws an AssertionException. This is done - to make sure there is no mistake by calling this function. - - - - - - - override the default ReferenceEquals to throw an AssertionException. This - implementation makes sure there is no mistake in calling this function - as part of Assert. - - - - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - The message to display in case of failure - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string is not found within another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - The message to display in case of failure - - - - Asserts that a string is found within another string. - - The expected string - The string to be examined - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - The message to display in case of failure - - - - Asserts that a string starts with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - The message to display in case of failure - - - - Asserts that a string does not start with another string. - - The expected string - The string to be examined - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - The message to display in case of failure - - - - Asserts that a string ends with another string. - - The expected string - The string to be examined - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - The message to display in case of failure - - - - Asserts that a string does not end with another string. - - The expected string - The string to be examined - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - - - - Asserts that two strings are equal, without regard to case. - - The expected string - The actual string - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that two strings are Notequal, without regard to case. - - The expected string - The actual string - The message to display in case of failure - - - - Asserts that two strings are not equal, without regard to case. - - The expected string - The actual string - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - The message to display in case of failure - - - - Asserts that a string matches an expected regular expression pattern. - - The regex pattern to be matched - The actual string - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - The message to display in case of failure - Arguments used in formatting the message - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - The message to display in case of failure - - - - Asserts that a string does not match an expected regular expression pattern. - - The regex pattern to be used - The actual string - - - - The TestCaseData class represents a set of arguments - and other parameter info to be used for a parameterized - test case. It provides a number of instance modifiers - for use in initializing the test case. - - Note: Instance modifiers are getters that return - the same instance after modifying it's state. - - - - - The argument list to be provided to the test - - - - - The expected result to be returned - - - - - The expected exception Type - - - - - The FullName of the expected exception - - - - - The name to be used for the test - - - - - The description of the test - - - - - A dictionary of properties, used to add information - to tests without requiring the class to change. - - - - - If true, indicates that the test case is to be ignored - - - - - The reason for ignoring a test case - - - - - Initializes a new instance of the class. - - The arguments. - - - - Initializes a new instance of the class. - - The argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - - - - Initializes a new instance of the class. - - The first argument. - The second argument. - The third argument. - - - - Sets the expected result for the test - - The expected result - A modified TestCaseData - - - - Sets the expected exception type for the test - - Type of the expected exception. - The modified TestCaseData instance - - - - Sets the expected exception type for the test - - FullName of the expected exception. - The modified TestCaseData instance - - - - Sets the name of the test case - - The modified TestCaseData instance - - - - Sets the description for the test case - being constructed. - - The description. - The modified TestCaseData instance. - - - - Applies a category to the test - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Applies a named property to the test - - - - - - - - Ignores this TestCase. - - - - - - Ignores this TestCase, specifying the reason. - - The reason. - - - - - Gets the argument list to be provided to the test - - - - - Gets the expected result - - - - - Gets the expected exception Type - - - - - Gets the FullName of the expected exception - - - - - Gets the name to be used for the test - - - - - Gets the description of the test - - - - - Gets a value indicating whether this is ignored. - - true if ignored; otherwise, false. - - - - Gets the ignore reason. - - The ignore reason. - - - - Gets a list of categories associated with this test. - - - - - Gets the property dictionary for this test - - - - - Provide the context information of the current test - - - - - Constructs a TestContext using the provided context dictionary - - A context dictionary - - - - Get the current test context. This is created - as needed. The user may save the context for - use within a test, but it should not be used - outside the test for which it is created. - - - - - Gets a TestAdapter representing the currently executing test in this context. - - - - - Gets a ResultAdapter representing the current result for the test - executing in this context. - - - - - Gets the current directory for this TestContext - - - - - TestAdapter adapts a Test for consumption by - the user test code. - - - - - Constructs a TestAdapter for this context - - The context dictionary - - - - The name of the test. - - - - - The FullName of the test - - - - - The properties of the test. - - - - - ResultAdapter adapts a TestResult for consumption by - the user test code. - - - - - Construct a ResultAdapter for a context - - The context holding the result - - - - The TestState of current test. This maps to the ResultState - used in nunit.core and is subject to change in the future. - - - - - The TestStatus of current test. This enum will be used - in future versions of NUnit and so is to be preferred - to the TestState value. - - - - - The ResultState enum indicates the result of running a test - - - - - The result is inconclusive - - - - - The test was not runnable. - - - - - The test has been skipped. - - - - - The test has been ignored. - - - - - The test succeeded - - - - - The test failed - - - - - The test encountered an unexpected exception - - - - - The test was cancelled by the user - - - - - The TestStatus enum indicates the result of running a test - - - - - The test was inconclusive - - - - - The test has skipped - - - - - The test succeeded - - - - - The test failed - - - - - Helper class with static methods used to supply constraints - that operate on strings. - - - - - Returns a constraint that succeeds if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value contains the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value starts with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that fails if the actual - value ends with the substring supplied as an argument. - - - - - Returns a constraint that succeeds if the actual - value matches the Regex pattern supplied as an argument. - - - - - Returns a constraint that fails if the actual - value matches the pattern supplied as an argument. - - - - - Returns a ConstraintExpression, which will apply - the following constraint to all members of a collection, - succeeding if all of them succeed. - - - - - TextMessageWriter writes constraint descriptions and messages - in displayable form as a text stream. It tailors the display - of individual message components to form the standard message - format of NUnit assertion failure messages. - - - - - Prefix used for the expected value line of a message - - - - - Prefix used for the actual value line of a message - - - - - Length of a message prefix - - - - - Construct a TextMessageWriter - - - - - Construct a TextMessageWriter, specifying a user message - and optional formatting arguments. - - - - - - - Method to write single line message with optional args, usually - written to precede the general failure message, at a givel - indentation level. - - The indentation level of the message - The message to be written - Any arguments used in formatting the message - - - - Display Expected and Actual lines for a constraint. This - is called by MessageWriter's default implementation of - WriteMessageTo and provides the generic two-line display. - - The constraint that failed - - - - Display Expected and Actual lines for given values. This - method may be called by constraints that need more control over - the display of actual and expected values than is provided - by the default implementation. - - The expected value - The actual value causing the failure - - - - Display Expected and Actual lines for given values, including - a tolerance value on the expected line. - - The expected value - The actual value causing the failure - The tolerance within which the test was made - - - - Display the expected and actual string values on separate lines. - If the mismatch parameter is >=0, an additional line is displayed - line containing a caret that points to the mismatch point. - - The expected string value - The actual string value - The point at which the strings don't match or -1 - If true, case is ignored in string comparisons - If true, clip the strings to fit the max line length - - - - Writes the text for a connector. - - The connector. - - - - Writes the text for a predicate. - - The predicate. - - - - Write the text for a modifier. - - The modifier. - - - - Writes the text for an expected value. - - The expected value. - - - - Writes the text for an actual value. - - The actual value. - - - - Writes the text for a generalized value. - - The value. - - - - Writes the text for a collection value, - starting at a particular point, to a max length - - The collection containing elements to write. - The starting point of the elements to write - The maximum number of elements to write - - - - Write the generic 'Expected' line for a constraint - - The constraint that failed - - - - Write the generic 'Expected' line for a given value - - The expected value - - - - Write the generic 'Expected' line for a given value - and tolerance. - - The expected value - The tolerance within which the test was made - - - - Write the generic 'Actual' line for a constraint - - The constraint for which the actual value is to be written - - - - Write the generic 'Actual' line for a given value - - The actual value causing a failure - - - - Gets or sets the maximum line length for this writer - - - - - Helper class with properties and methods that supply - constraints that operate on exceptions. - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the exact type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Creates a constraint specifying the type of exception expected - - - - - Creates a constraint specifying an expected exception - - - - - Creates a constraint specifying an exception with a given InnerException - - - - - Creates a constraint specifying an expected TargetInvocationException - - - - - Creates a constraint specifying an expected TargetInvocationException - - - - - Creates a constraint specifying an expected TargetInvocationException - - - - - Creates a constraint specifying that no exception is thrown - - - - diff --git a/SDK/NUnit/bin/net-2.0/framework/nunit.mocks.dll b/SDK/NUnit/bin/net-2.0/framework/nunit.mocks.dll deleted file mode 100644 index 6ee2c1cc20dba59e4fbe2948a130b2593145d790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 diff --git a/SDK/NUnit/bin/net-2.0/framework/pnunit.framework.dll b/SDK/NUnit/bin/net-2.0/framework/pnunit.framework.dll deleted file mode 100644 index 6c105d70f908dc7047aad6fbeba58162189c6070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 zcmeHLZ)_aZ5udlacX2N95sYIJu#-(4sx*PC^AA)tC3ftD7!t?$9FsJa!uq^+Ho3cX zclVMw(IF#9X{4$RQX3K!74e}}KeQE6X+agBh)VuKiQq#~3sp%4MXf+;K}ZFJpud^7 zdp_rYkk8Gt_qQ`|=FOX#H}CE4?fmvBGKt8-_35WXPvg$5Tkwlv8shBo-)HH``7f?` zTJ3mo#qa?yv?l|9B5+D}!6}#h$R2g=pi;KIvfZ~UZnuak-W8)|lf9_|*`+O${KYlo0o-4Z`; zO#GnLuNtjYgk<4{Xsp_dW(8R@w8*NMOpAOPak87ldHX8+h`iB#+^dteVBReYDd>eO zVLPTdCZfz5O2=b5FottY#&Mpvmgxn-L~YFK(+C~8NykdZd8xGiab8m&OPQwCkAAV1 z>0_m#_S4I#Sw74|5Bs*uqWy8MW(RTH!C5$0=YhEjab$c1KgUPYN0o4ojCt+z$E-&F zlx!2E7P*)cEr%!>OLWk2sSX!$tYZ)oo#d1!Mov+>&Dsl7J1KSk#d`1rS-1{4SoT@= zu8HkgDIfkob6Kkt1M;>df9Dnz?_53y4zJ5~TGr((ef!3Rb1(q&f@f4~0H0__#U;-``MA0{^9+M!CMHo}ob- zF4Fgwyh20h*KH>CR~o6~-lBcHp3-JgZ;>Ob#q3P#9r7@bZZoM5F%COb+Ds~~CiVJ* zXYMd^kjPrp2%_F&GtaZ1ARM~VW>R@|3Xiex+sv};7qpm`tVp2r8y@m$;1GGtROV4t}JLlaR ztxyBp^Fggg(_pbt)SUiR&@^cy(4x)26zYU^ZV*jv^Cv=ck3o;rSz!Cd9Gjo-=L&iS zaeqy4E$~(PhR{8N{epK3?iF+dJ;Cn^P6^%*e4S1LhfpPq4+~yP%dIz2oi|%A12+oY zD|ol`IMzSWe^BVdf+wtZu$oL`O$FJ*v-C^rBh;8h&A=u+3A5OB-=Z96^>QMio_erUgvZgu9M9qtyKY<(C1)WXJ02Td6Xnu#v z(C`{&9;09JAl)|Y^v5bi_jZ~rSISv+V%oQR(pnC!@a(8%TS5q|LN8b2UJaIoF ziq+x#ECVyqtWEY*rs@epw=`Ou5{7$+{h>-(q8xOPmr$IM$kERVwDqW4s6_6VB$4{V zd?n6QxXtm3mB6JwH!K9+WaRm<$EZq8#b z$Dt6CUYuU^iaT+9TaOl8ZMh`NP>Pp}z=n}ihUq)phb?-5K?tisBqS7JWyPXyiu>{MRg8ex`%OCj8?|UE04KHsUS5J z=zTXDZo z#1jo08V=}CG;la}mhk>m1|OlnEZVlnZEzK_MQewl%^IvZ4m&K<^Ln5>vF-x*oD;o?anon6vTgET<9WAA(5i3>WSwmfac!*E0}kLi2B z4O8n@X!qeGo!KGeft5^~lw~WGO#wR0dA12`YD(LN%C@wp_?AthGn;KP(;Zne-LfcS zr@&@AvMq~vP)np|Sd8D%R)0@cd z)@oPrOJsn*f#heS>AA|hZuoX2YUpRZ?YQ=IZ;eT;wpAn6g{wz9Oh+F?{z$wCIc{4mxwVC@cdx#T_?aZEl zJd2I18{a&$x+BmHpsi0y)>(^p)h=8cKy~3QJ4fq5uak@AJMdkkBszVbl@SYG7l9?% z!Y><$uo9myIh>jtGfR%( diff --git a/SDK/NUnit/bin/net-2.0/launcher.log.conf b/SDK/NUnit/bin/net-2.0/launcher.log.conf deleted file mode 100644 index d340cad..0000000 --- a/SDK/NUnit/bin/net-2.0/launcher.log.conf +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/SDK/NUnit/bin/net-2.0/lib/Failure.png b/SDK/NUnit/bin/net-2.0/lib/Failure.png deleted file mode 100644 index 2e400b276fcd227a2f056b4a2c704a3a17776bf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRKUo{$jk&pOzh0e>?|xCtgIXy9AX@7f`WolBEl*>9IAX==Hfz@lA;O<3Z|x} z=H}*(GUDEnLVmJhVG{fi(t<7u(jH2(0Sb~Ks&cUk;@+wXk-8eO#(GKWa-pH2$ss|h zp~2Ke@2e>~Y_E0LUi+wv!C_DH6K+N)-Azt;nV<2oIOl71F3|2`ko~DZ zhsz<3S3;eyg}dH}_PiDAeIw52M!etQ;dFk&lg!9x zxiPQH(%x6+%xtKg)mS&HsqSDyX-iAX#EBDU&z?PJ&YbPrx9{1r=fZ^x*REXy2Gl4R zej%{GtG*hT1sF<#{DS|FY`_rwom~|e!<+>kk;T9Q2$?i7*PM82?WL(g zN`WPzD}+VwdMv!tclO`E`;B||X1=U6{T!X0cGlpZ__Dns(^Q{q33<@@B{==%nWLWe zk1k$d-u?gaXS02Y?em%@UT;|X`Le6Q9%a@~-wSg4Dw&gQuTA7S^0aqm1jFsXn`gLK zuT`(x(RJ!s_RG_k0(5hn3;4_C?KACI9eX3|FH6Gy)$UIicifXYyG!~|)yo?vi~jBW z6jT{=a3z2Dp~83PY7E{_76^TyV3HAkJ?rKNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sR3IV3CMCuuBf%yw#V#+yE-S?^FDoh|Eg>f-CoeCrq`;x7$f=^tsj9-Mp$sFr8r9QJqWp9JN1n((vk4)9WYVZyYLZYHDh3Zk{%6 z+U(i0=ggV2ZQHi(+qd7_JNN$nxepFbyLRo`{rmS{9XSXL&rvXhLg0aY?KWVZVkimn z3;sW{0YmV2c2!{1aTa()76S{QYaq-xA-{4CP*9@8HKHUqKdq!Zu_%=xATcwqM94ZLo|YufAq6S9Qc#sYAG36YapyLLGk>-bH|RITgV`K;&Dp4 zNJ!Ykgrw`OD?F|zU))eouw`|VL?6U#FuR-@+LO+}L)C2jq= zW9lKJMyAYvZGncJoU;!7nZ(AJnZTH=KEFa&Q!q6Ac)=+(gsSzopr024hF%>V!Z diff --git a/SDK/NUnit/bin/net-2.0/lib/Inconclusive.png b/SDK/NUnit/bin/net-2.0/lib/Inconclusive.png deleted file mode 100644 index 4807b7cedbc70436d121f9052bdf719cf2e692ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1436 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8s(!-;v$fu>mr>!iYtt6tUDypL{qOT^Vt0bYJBB8A!rKK*Rt0Qk@EN!c;ps%fD zpr>e}r)s39Zm6$mXsBy!qvh-)o9Lz!=xO8cZ4?%09~ER96Q+?FW|$Ufk(q2+7U~t1 z=2@KXSDY14R#9G2TT@$KU!QH+Sm7{nsr{u{5j$FQC(J5Yy}V@qDzB>xV-BnhxV}E< z#)i-v%af09O1ru(@y_;?I~y}E@65QjJNy2g{QDbfj%}(txux>_&a!K}Dy|)>dfd>^ z(9+z}+uPgU-#@iw?zFaf)22*=ZP=V$w$ot^OV-0Y|Km*2m- z@a@fIuWzh)|6=3yms@T*mXFhFlJ$A(H^yZVhQkhwqa=!#$zBDQ}POMF^Q*x%A)1RPa-{KM&m0#}=i4RPCS&+>>!C^t~!qAdQeH&7owuBmZcyF7% zZ)WnIu7;vLi+5U|2w1SyZCYPoRaxJ(g$ddJ|CjR_noWKjV8CD6W_kCvu1AyiFkkj&ff-?id-yQAc$CUKbKq=bO)z4*}Q$iB}HW4*& diff --git a/SDK/NUnit/bin/net-2.0/lib/Skipped.png b/SDK/NUnit/bin/net-2.0/lib/Skipped.png deleted file mode 100644 index 7c9fc64e3874e15f3f22a234083c1da3ce8d62b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1405 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRN(9D>+kO$5D*X;7#I{36d4&A6B82~8=H`jker;HmX?;8nVFT9m6MZ`o12@T zpI=Z=P*_-4R8&-4TwGF8Qe9nLQ&Ur0TU%FGS6^S>(9qD>*x1z6)ZEoQeotUc4CddXRJaa_yUX@}NK6`G*Q rap=JLd&hddy85ua{(ro-{sHGx)snNf1MdKfN(Kf`S3j3^P6NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1l8sRKUo{$iT$F$i&FP&cejS#KytK&dtus&&t8a!79qiDb2|%%gbWKB5xwEsi|pi zZ!hR5DCQ_8m>_8BYiS!{tB|drnWkx$Z|30O;F9a&R^cQtT|ji2DC;^_{!RSCn}wye zOUdq#Rq0dFZPT@#YOA+736d-j|;b5^fjy?y)kzB9co_gm(kXq|kyZOXm=d3UF- zxj1e8wK-eQ%-ni$?$wK1u3ftZ42n@O(n8?#y__;&7GNj|@(cbyvH?TzcXm}^{Bss~ zL>2=JAYg{zy~a2pzj6*xP@=>&q9iy!t)x7$D3u`~F*C13&(AePq0Cs%*lgwVM<9)7 zJY5_^G=h_V^s`AE_`@OZ??1oe|Np)J|Fd&fNJ?d7NlEPTHmYb~z2o!biRe_3R0~Oo zAC63MYDEjzm0f!k!^6X*pexu`^zUIJBcBZq&!IL!2S)kYxVsM~C}^^=74jO(FKAdU zz&yERfxa~J{Kb8}>K+cQQyU%qTN*E3I(bV>4OIj9Z-1nd_^+fC85L>3(lN5 zaNymeob{wrblmH;2j<40nnP d7?&t8Fes)~X?EOwb{gm}22WQ%mvv4FO#qjX@@4=4 diff --git a/SDK/NUnit/bin/net-2.0/lib/fit.dll b/SDK/NUnit/bin/net-2.0/lib/fit.dll deleted file mode 100644 index 40bbef0e292de5f8c0d5f291bdcb6d48dd00cac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49152 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 diff --git a/SDK/NUnit/bin/net-2.0/lib/log4net.dll b/SDK/NUnit/bin/net-2.0/lib/log4net.dll deleted file mode 100644 index 20a2e1c47dea6ee52dc38cfd4eee0cfde7894faa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258048 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%0D;`JV-CiezL={Iboek_WYW8}# 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 MEl{<<|Cbi{PnGciH~;_u diff --git a/SDK/NUnit/bin/net-2.0/lib/nunit-gui-runner.dll b/SDK/NUnit/bin/net-2.0/lib/nunit-gui-runner.dll deleted file mode 100644 index 35efa737c3957ac14e4480d2a559ff4127298597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188416 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 diff --git a/SDK/NUnit/bin/net-2.0/lib/nunit.core.dll b/SDK/NUnit/bin/net-2.0/lib/nunit.core.dll deleted file mode 100644 index a1dd69866dfe9f4a0ea9975d961b02230aa66969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139264 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˜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Ê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 QFk*ob3yfIc^DOZH0B8(6)c^nh diff --git a/SDK/NUnit/bin/net-2.0/lib/nunit.fixtures.dll b/SDK/NUnit/bin/net-2.0/lib/nunit.fixtures.dll deleted file mode 100644 index 8fd1932d757ee0bdc41cc8a4af94c6ed2230a146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9728 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 UG&KHr_lvrH_9GSlM?Bd71>;s!w*UYD diff --git a/SDK/NUnit/bin/net-2.0/lib/nunit.uiexception.dll b/SDK/NUnit/bin/net-2.0/lib/nunit.uiexception.dll deleted file mode 100644 index 610c1700ed22be35144f6522175332e291d288c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 zcmeFa2bfgF(m&jDCeLgRvw=@acS({n95}OpvMwx$1jz;zBnc>>hdk5=(XqEm(tMLO>99>0A&|F_3qo!92d z4~yGW*nG4@l|Elhv9#Sj=gW~BIzK&N?QdrfJ@s4jN_8)f8kv4=(?cuw?)c`NB0loj)%9NZUH8C)S<`pYdot$CnL{r>AEsUaX>B5HVB4Rx*o*h@pnjViH12 zoHrVYo|~pHM|LTp0X62Jf{J@%fL3D>_~Q_`Y_x*5$UJVJuoEwnaDx}9!3&|q;FUg5B@{?8~-7F zNz;E;-=_DZ?_o5e;!lL?3ZYbsPe8{eD3=-r52b*xY7(iIS_1eIXoK;1VjCw~n6k*xaY9A~_8hfJaY9#wa&E zD6NE=4wN`4v`4_&ti419WB}zyOS&eKnFtfCPZ8-Nr@e@TC}?LzRKOELK&H5xCY0f} zXInfjUxJy6c14+_bY`_QpkQ4TF$DSSA^Bjm7LVK4?T+e%qdMlhR)?}AxKEcvGF1m4 zRmWVsI^cu&>|>EWUkT{*cEPckX9#YtWD#?bhyTpldx1QbkoK_1 ziYpeiEOL5oD%vs7NrLyO!7S-HDoS?6-!y4XrC5?wmW7q2HAb36yB{I9gXFM>IOt?% zwLI7e7!L%ZwxIerLv-r0Wh-~Kgcq60AyXYg)o4N&^C$rxoxlSgCR+Hx)#Wm1phTCN zg&^D)1$}2D=C;|@96ZYbu83!>CEAkxm23f6X~3XtVLsu=l(v&3O4c#-ZxXOp@;d>0 z518;AGDx<#D8&zL*a}fHbtm>|v|q^Ws}vBL z8FoiwzfC&j&ZC$)1FA~>kLdA_4|munnXLJU1}vVa=VDOr@PqI#k!;2*~!8YZHcxncOtYbkG3V`##*B-2rYsE zn}~J+az(qMo$L{AS~%a!(H2=`Lf%bcNCYk=MtG}0)M0p5rKi6dLT_~hn8DPbhvDaBKh@==(pW_5U#QLP{x2XO%M}<2 z*)ztW_fvjFQEQ?A6=o^@py3PP1V|Tf2}T(f(E(*(E=72%87h3&N{ymQ*%WVW@J#GE zBF}}gh>zm24fDgFxV&|#G`(uN{y`uxMI+v%Oub&RzULePG z1hoMp%!O1F#aj)gBn`q+$QBW=tAp#HuocP1@M2c$!rVbL_BTRIMF$`~HK906hvGm% zs06hcfiQ~}(1jPaL}@MXD91W+h-bmY!#Xj0TXJ%+v0PG5X0;U(h!Z$+s?>3|Io<~= zr6wZ^O1#~W6>n=~b;p>zZSWiv1fhBYp>CHn06!G#Qbz>Ku*m}DI3>py*}i5k6pm`J zB$!aaPD>hcsU3+6>IY#$Emn36>Ys;EU-UfKfVUH9UFrDG=I@NC+wO%^cfreb#RFp{ z)M+auLy<)}ifJIUB$g!J&;jL;O@TTa8uNAoPu;qhTvABWk%;?<0%U$$mbyycl1M7h#I? zf(g-_8RIX!7qzubT10T&tX?XEbF z+i9dd{XGra!)>zM&PTTY-}8~}`u8-lz5bp?w!@t?A-d7)ey4syX=L61o<`RF?`dS+ z|DHzH{qJdH-T$6O);&P8(NjdZ5{gKM#3CvssfcKji^%JgD55&16j3cQUkvzOb0Ik+ z#q7_8gDoUQBA!QaVvM0}I82bxY7Zb0C$!p=;&4l_MLUnrSh-`Z*$Zfwg7rdgM66yv z+?kueJ`BR|+rm8IzMjJ2xoN>-3sY<>mbOhDX0;Y37MM~?L^GSi>`?0hg}e_S?;yot z^^QY!omZZ}FR=cvfKmG)hWTPbZnz^MH_U0*xjbuA`y(Y5RfvW&j;&-9ubBjPJ*eLm zTW>{T=BqCw6XdkkqSB1kI~GB>Vzzn*fRWQX8lYR)c_~rre(<8z#FAJCX7cKJq*+u< zPHdJ#k22PV95o@=pEdbHd#8zuMp={AM75hxKFj=@mZ3RGzU~#Ce z0jOvj8+cv7BQ`81%sUVQMcZ>jQGv-`HkSVO0wc}dAt-W$QyoerOL`D}9Vp+T!Y1yN zJ)|x{!9$i<^M>hyJaZF*@IHW9JPc)J+}VCff%da%sew3+oGzDHt&K{B`J!xEc_fiz zc9nA^1y9TdtKuQ;azqdRC;;I;;p9Ek>X4%($zjp% zUbck`lN?><5&BxFN6^1J#B%U}N~1-D6&->40&TmvSPP_vA0PPm7i%WWzFcD7m;vMC-Gjf`B_xrLF#fryL17l6(w>XWG2uSt z;7#-Y&d@_?(x0N3%eo3F%~lAp7Cmy)gt3FNVEe`72`L{eW>CpACOGUj6=(|k%0!9%H>3kJ%5pU%0P;yO&#-)t!(h*5)e* zzg~#C=GTGh!r+!2-svdSW!J0horFX;{I5D05$^x{Pp3xP#?_;aZjZKO;mBA=wB6X% zw-1v-C<6si1Y#EU&>o+3ktXU5Zu~rcRJr{bg zdy9~9P?)5&^Z;TC5P9L2#NJsBrGR_@?H5qbcSTsUfufE@DC&Q1mE0Chs{o%BipITJk-jAk>ctY@v0iVkYzh5fehMxXcV)G8If&HBbb}_5wN!_WW(sX)D=Z|X~^1@~Pt(Lw03kK)-o9FZa&K_=Kc*5VBFb%?gOeHF2* zYjfke8U4lNh!KR^I~)`&h}{hEN{@6 z6Y}8QDH(HIy>fb^uu|D8X7-i5|M5b*)C=&+=S zzDzeg6smKPIV%Nzfa=D#5wgg3sX`24q~M{UKZJ)PwwS&1kRu<>V=5##Gnjz6!tDu| zR~O4cFz1j7!5o}Gd)3RJ3;GM}Rr`0LMGLDTqf$Vj|1eOqNLh`1zIA4e4GqpTkFiBRClARu>s)u%!+wE?J$f|&G3^=X0(8!dLGfn|c6)6ska zeMMwZ8z=>Y51e4&oL%v$*n1?bF1>mh5{LQX9CG@A2?q8?&FVR-hl3{z$aU^?f`exY z;Z7I_5O$|ANsz4~u`v=*{Lhf+ivz;S`9h{B)sBaD^lf=>0VV|*S&8aV6v(4{107>l zkC6=0t`yM@b#k&@Y2yN8yv%D>j}s*flIkTz58)cQ=@EjL@J|JXxU+gj+KIj z2A=n-2|_~{d81_BItC5-YK-aRN5IqU-HEbXX7978bat#PLplRqeELiYu%JYVkJBDS zYsULugo{((LV$HhL0vGG$w~p{rxsd%*z|L~_`>>>s(4=pE*n13Wb^)u>K1b1XUGZn zMRi0+GW2T}gCHjq0soYRF`ue$R^LInS(w|?vDlUQ5vCih=_p2`C;G3f%$s zK)g%Irs4VE`w2wnF+kdX6jS|f7r!!I~fR~Y8oL-6Fj#ZYi!QQR;{ zRCy9-Qy*jlC?Lzg4H*pZ&5F}f0uPi5(7gJQKyuN(s3n_HvadJ31 zA?xN1(t|xd2diB&6gw-?SU$k~nL1V|cJ*~`0z3Ck;jp&l&dr4cNYjjQQ74L$nQx7IH$LNMz zSa2BJ854pVVmRr17YQo&wm5Wis)0y{>&eIw1T2^WSXKid` z1;x8Wfo%(yy8eHpc#$bG_CjdyQz7w16i4foLtRiS4E4d7+*9x%3%nrt&EmrISSbBq zSJ3d^J*xRqhi|@S`E2n< z@W@H4EsvK(#@tm}9A;}S15-TLq$VT~x4q6VP;*YY9jU@GyLkO{_e{28#RPcWE-YO& za2eBYDI+oFBJ&K+gqQO1)Eu_i#ZyE^lTbvA)02xxc$y1Z#R%vg{sH$2PJV=ET!OR(slwi-2Rd$R*6iq<15G{$ZUZ!}A8p%{0gfMK65hz!; z1Ilw18qedL)Kvg^9)ob1ZSX}K>gGzx}!Y$Q@k6XcRc-=z_|)BRKi(l+b{`?i&Hle zstuvkR}fVSD6Vcov>XN$jDT=vHrS&2Do}Kr=U?1q!(y#u!gi9I2`u41_lAPGH

y*fMd@bs400P|VpAOs6Ar#z=_?&=jkYZb7fz3gK?uB=ol_b~;CwOK%7=P%%ymF7 zo?9|xw0B@Sa*T9=%5FDk-V3s%m6yRj)DS^VYwRV^4W>vi7g;;n5x_atP|Vc!Am+xL zh}*6#-Pty_X%$~9yHUL$u9}cYS-}LZV3@;(<$$cBacCM+sS^U_e1LLz;xJoYpmu~@ zpyoay*WD4~p&9c2G|Bw{B_;4mbjm{$NCAA2UQ}IaM zBVPx&y>O%K2JK|o)Hk}I?1pSla=fA=fOxmB5j;&f*^W3109Wo6W@9!>ROp|{*jA(d zOpbw8+Ssu}%3kD0&z189jC`UI^BU=X^9+1-Of!1A7~1&QhYA7 znPC#-3uyk~CVnAJJclaEopqkERR=@*h73uuc(3r&>it$Xtl*ki_bDCG(>S-WMvapE zJKc`QfJ5bW4&oJ&2YE08(c0B*9+w31<8GQ|t>`_7h7yN2IL@PZ#YX z;+HzIVr_i5uXryI>LaKUJajd}$I1DIl-Iitsk*#oF&X7!G>;bP&bcNzoM~<02WTwg z(&j+>rd9StZ5(5hWT~s{$r>)lgRF!slNNac!FWzDCQs2G;ndV%>Y!k1nl_75y&oH* zNDo}iCq>dk(p*TY<54LWka;=G?CEW}ufwYYYO&@e~ZfxL-_oU${;{h;tWuyS!L_QGyNUcli^ z+jWCb#Y~SR(D63{c%0Z`&1X|1_$eh(qa-m&l|YxC*=^FCBNg?AXk@FT4D=>!S>yIS zYsw-w0nt67qhhqA>HsYPIEY(}hS2x>{va#IEN}Tr-jZIIgLJAs z4;cgWgfUB%htgM({F#33o%HLdnxXW~B|T|ObwVKl{)92BF49pbeQXH5`%d~WrtgCV zuJ>0Im1U-#C+}}mD!XsIzhx26L3b@eos0&llLK_4F6zd!uU`z629YvJW!bfG>gbrFSf&MZ#S2)jTsMt6gPhl7Jto8Ps7w z-Lg4XQ^DLT$CCO(=A#6MBm}!_AVIq=2f>^}CIoYE0`1#0gu|ouRJ;esOmT<(anvAV zGX-Z5gxm-j24+h7kc^p>h6#|Kh92Q698PJtE#gcMm)A8$FtIBHGmoYKPDMy-k^ZF-1YjRPlF*H(qK0PgK~#(n?&-ZkX2E?2Udo9Q zi3N76%q+A~v>~HzdsJ&KhUPFZV#D7NK4j0fNii+K{bMdG`zgwT)TCL+V3yitjhYQ* z2Gn!A-S@pm*@O=*yI4uoZowS@B2`%&ludw?^KZ&-E&CjXXrta{0i!nRT}+8yq3;8j zd6CY00aVKoa(7@vPgb$;l_R>^P>Lml4riL6BP{5sRk1uYRDn_6A@_!-vq4p}KAL>MU za~Ic-+a96{sUJ*8JX~$5xjXbT1I)t|hmC1i1CoUG%Ph(1#g~yfm*ufqLHzJv#7~;o`WK#qgg}rFfoJ22MBRY;v3Dm=my)GKRbiV&TI^fZ6+5as8DH=&yigB(lx14MRZaS+N`g<#!aE(kIh= zBtTEVo%D9G*Ca$+qL;^6O2IH9EFk|w=j`wSUYfqj%@CKZ4m5>LI)1B7Dc~7Ouxr5j zqd`ljcHC2B%A?>y=kv5(18cxeT}ZZ>KqTaaWRwWKOWmH;>q5gT1>C<2Xf~wZrIL*G zRPNdZG&8zes_fM?OVU$Ct#@v(lHu^CleBUykyRnYomDZ&$&KJ*PiO{-3e8fi3N$sl zn~<^!G)uc%s;mOd*o-Q`Y+9ml>UPvWFrv^uGG)CzaM_4VoVG`>fl^uT0TP*=rdzlU zM(P$UK`b-$`HWd~1>g2TzBsnj`DWp51dHJjXoJ9>9f`u1le(6%U}+eX*^YAT-s8ad ztlrOqsUmZ9y0eG|M)uQ*J&S1MOb;)jfiDw#!gl^P1+`OP4?RKajJ1c?4U5p1y7?f+ zQg;TStz;-SZP_r#kfrW8qVRu#f(!i=Eub(##hxdPbrLuk1d>#E8rCWuJ8}+r?AVxT zjAKXmRk@d|_d6owH-7n6gLH3B;XTc~aK|B-{-w?y^)lv>Xh&NAP+bCgPe3|)POY57Y4-WH&O_{_{po+fj=vGo8C3q;{~P{CzRz(XIS=&EN2lxYy+a}=ak z-o>?Op9kVr?fXDH!lIdN29e@#6yRJy{LO_AQYjqwpMgMy4*?bydL7=Eiuc=}glize z0>azqnv4st$k40q(H1A~(b8KuM|BS8h{HtUV2!mAi?nE4v}GX{vdn{0?CMvcJfdv@ zCPzZWC?F;gA#&gvF7u!S$35jR#yI(Hn~u~z{wk<4s~+uXrM^OU+^9X7U$FjMMcR5Z zs!Zb2=9>Xi(VWh&<-2UmAh_?Q(0L5q$48l@W|vLA;Y=mig38sS#LVUoC`=w;AV1k$ zG@enn$tY_e(>+MHgru`z7a*ukM0@{zK+{mtkOjfw@jrY`6ZSPq0U;Hew+;m5cZ@u9 z`(YWcUIZ8UCdp%nvGK`$Td#cS3LM^*nFIT_X8Jw=?F}0`HTydSRL=d7(q(l?d9ZY#*{a+U_(Ofg9x#V0=lXEQnX~nqJbQtCgbvi*TNJ69>}R) zMsDm^RI%9|e3LzuH$%yyJ=&vSxe5mEoYRQ*HlrMR-~wQv`rOuAh|EL;r;3~IC{BXjeRS-C#+TxlFj1?t@nk3 zkj_L=+E#aE50xE7cCV0@475|#7CJ?sZS|H6z*WoW6ah;Q@dj)ibeYSe%LVHY*blE7 zQm&m<9bzC7!CP=tl`Y6(PrxnbkUWwvT{nIm+$x30XjiYGVj)6G1aq_CR?qNIR)I?J z&E;(&tf(@@1PdYptkOeS1!^x@CGbafAh|J4NuLn9=Wh{DppovQHe_eyCa2sS9vpA9 z!7}MpzU(kN@89z!e7F2|Mu?)KEvz~=B{~*y;UyH^|A$cNx?+CMaYE)6f zvP*_q5N!YEd|pY%qSL<7$zsbgL#WHPyG(Mj;<0P_iu@VAcScRliM)0xyT z*B4W&fOe$9;E(QQAZ)^+YG4};^JN=)Bx5qNGyCum_Hw|)0lqCye-oR$hFg0Q!ux+f z1t*3m*aj-8c^XcGa|#;VbhFPi%sp_{5(f3?^PS0%MAw1b1MDGnP;@(9pZ`n=;uYT4 z=*ewB=c^?H;}tKl+`b%%!}75e+RnzWPRkS3C|qr26oovL@a*Q^epRmNS!S)O6K^Xr zOUY$Uc@)fNE?f~*w4Dr2jjaooQ9oUYEIy(4PjNmF9yoRz*LE* z{-p5ykmt5a0pb0*;Gs{acr3vBOX^db4B2D~<*Nof=QC@MB0)cM4HkeU>wREF+rQrK zB$wjtVz8z)Y+2-wWc|v0as67%-M>8rTAFVU!uW#~Bi%uHHdv-nkiRGRhda$`A1cm2 zhDzg?v19RWA-=~|>qD@iIoktBQT+(Q>{&^;{7Ur>`ap-;14)-3>|M#hdpw zq30fmxI>Q*M*Mar{yZRQbPJ(Zhr_kX*bRxr#GjH zncwi2Qd$bgx0&T<19({m9xd>~B&385n|TQ;GFKTE3`~gi;(aCReM*F-@DV(bm29j8 z+Dl(^7XfRj3QtAJIP5_CNL!@)@0(#4^k+B&taN7)Hy*1CvG~BIz$C~~IESJI6l&{X zKuPKpl1|6G0!(r-%obou6vMm;jHei82QUf6Ft_mSwBnfe?x3MLba9#w?x5Ls2j;*X zm{0G(9J>Q^;ttH0cVND{19R~X%#}MZ-`|0ufiSU{Ht0K`Da9~1kSkSUxSgeM?k#;Y zwGB5c_BMiT2D*v2U+&;$l?{z#_EqHj`$#^s4L)Q?NxxcKceS#Xa%%Sv3pbX%=v`Fy(wx)TunkK$MrOu%AVd!Vbv%b zYf15vu7aaH+0ni3Oj+nXJbf(v1${s=SD4?NMp&pwW^;Tf-+LYH$}&H$c>ALW;B>u7 zr^cEz8yXrcl(GecGS5NXOx_#F&AQB-N(T~5%pu#DIZypDKv0f+Gigpmn#2F%(KH1|=nhrX}l8dY8F% zQ3ZS$M62tD%`BDAk%BvSiDMxr#co61d()*@vjMoX8GSgpK_#A%gfBwnj4 zBOa}#j3j7zGLoqElaVBCgp4F>6J(@>_Na`cXivyUs+rv_E8|tmY15;mc|9GE!bEEhAp7ri@h3n#xF~)>=kia(lXLPt12TM zwYoCWNoy)2owd#!!9~DdsLwoy{(%WA?QJAsmAM3y8$#I=)L*Fs89O7vo$)UeuSTwb zhP!~DaZ2B}3OU(dv>`{a0uUaAlw+eJii8jY*zakBAck>A(wh&CxRZiS2rAqxef)0_ z0OJs5i?rNHaQj-y1dZlD(j7)C1yo9MRjjSK9Hw>RpqL@MUc7VzHuZOK)Ym~4x;JX< zClfJBqGFQqB0roJaW%7Z^^Paml;XH?*9RY_oc!h4yQdc# z>7j$qYUIVLX^nh5j|Y_3flj_AfE*s!T1ZHFAO1zX4u(&}C%gk{wagoqhArh;Ku9dF z$T4Buk@aNEBe@>C42zrM$I4+c!n*+Xu>!{oU3O$~*x!FMBRhUGNpVWw#VG@j3qQ{6O zB_-&o$;qAs|AS0eqC}#OOi4-7W2vdhdd&Y25y@f_5`x7Tj1m%zSRy#eqVG|Rk(`oZ z#8Oj@SZFbciNRtF$rBO`Arn1DEGfx|B_|uP(8?IN)KnuDT1rwV)pox0~NS^dD({|69J) zf$zUI*4LH-;C z$)Hcl1D~+KX^Q;)28D|TsQ(;AXwinn81JCu)HBMniZdobcNwW2g6|DjwAd(Pd<@k^ ztfkgS(8pLf+-8tg{%bS@d%x5mltNw9m#T!(-ZF>0QHBT zY6l(`X$#+g4=o3Y^%Zc2IAn&ZmDH$U(}^JOG-MMAVYOZjQaI>B{~gUOCxdUB6 zp=)3CKGfIpeJHG316_fvU)o}Ik={*;L2E`2WN?!VA>D5dRh1pf#=t62E}Jp9^P)~) zDoYndGU?;IMWmpPBV?Ug2J4{(zd4GJ`M_{A+AmVw5Z9$6XiJF^Zd-g#INtYnV!lEL zd}I`Xt&n#hu07nIkcW-uaeh8xY67hXHY-11=4n%^7E}z6>+k>)} zzcVYD3l+n;acp;I?tS=%Ccj2UWb`u&zN!xW#kv5dq!h_vbL1uD>W2t)R)6;M_5BAzbF18j-(cW*O-)c{aGtK`eYqG7K_N8y9Cl+d z8iJU{!goSofMg@YU2dFf{UEaT9m&mpTqz)~l0qq<-26e6;P@o(h>rX>Y=ia**%XWy z7s=z|Ou8Jt^hynG^FE2NtQ&)mo)U&Wu#i<8JWsZWBQTaxRGzOh=H_f8m8ygr(b_i^ zEHuENBIb*gQ_L2OTGEbkB7;C3UXFmu9v@cgQ84ty-~cm9!RSivmQS%)g#woNFkfGM zoUEMLZWI}1L{X$PXz-&q8tJq?gwKA(Z0D-Ms;FY%%`e$qEo_H0o)X6W;W$A}7E8l~4-32aanHcouF#vjpcy5y+>?cBKSQ@I7vYkNZN> z5`t-F{=JGZln(|$8EIaX%JVAdb_PnKzQj{`{LInqbE#v-$SCJ55LAC3(}ge2*rdv! zbg-bs8CF~I`b(Em-9UaGeBaU{79jsvlEtju-QVao|KHca3J7StReOgHlB5pY z_Wwu+Nq?_{e4~9)n;tZIsYI^2Ulq3zomkmpL>pJhG@?B!rJK?2x;a#hG20S#pqHT~ z-8>TMTX*#4H#JCN9xq9smKI{@=&?Y@@JFEW3jYP0m4`ImHPm9%Bgm)1ppErBk*JY0 zJOzG7M((dh$^P;x(sf^~(6?*lK7a76D)9R)=0YOHOnNPqB)^{!1A3hgm4n}63KnGe zcHJkx7A(giwj-ZL<$JJa!xG{eE@ot&LL&1u5@x%@u21WN$JTVKfzsvi0KXi=^pb^5 zjUgWRMi0K^$|r;NWEHo}TxG-X6CI`1w)<$GU&1qI5NSC8DjnhN7XWH5Xj3dD;al*#SG&_I!3$wI!b zZWfinKcDO8-2@6;_@s$gvYLR};DR9!SZH;(&108`K0b>afRK;I9&Cw;aWa2UKFYvL ziLhEzkbX}QK_}}G=Ie#`IH3^C>`-duc$q~XL38vjPnY9P~ZQ)wti{#>`7*QR#` zIU~5OUy+dn`Y%k+IH#lbkvi6mgVxpkkv=|X1N06JEjT@z3-&47lvg5tyk$c-N!|!B z0TulY4srD-lYL->D}iSrk=RsBmR&T662z83I+gd~Cs29vRwopqH9<-IxfWtYZ@2eh z1U?@})e-27R$L6f-M>MEbty9X|!Q4Lz)I8>*oAXHgUm9nnP;eUqb4QS>cD zNj1zn3}sZ3@>51u3+?4#(M7*&Mmiz9{6tvspNYd^>N@ZX_vJd}m%{jfOE~G0D_r#pR&xtKPo#K>V6T^}V_QV_= zSem87)8T7kR3W+kEG>r4rk`q|`pIuw$@bB^9X>W|_LqYOC+a#dqmo7&(p#+9Fe)EN z1`jj+_L$zrvROk(@MExkFOeIQ0npwmA;c#ieg6)Ys$wDjjqLi6KY!4uoGyd>>Nst{ zAb%j%Wl+C?gS4!SQT_p{HgZ`1tc>o1H2*Mlbp0whmFT~$jHcs8=8w|`)gL`*T)x(C zWL8F}as5XQ8_;&pL*3L7gGSfyU$bVv>I16Rs9d{hwLz6?)h>N!VdF;U4;wYeD81{T zeA+ay;~xn)RHtvI^_wtk^pKn;!}3S<8XrIc?boSs zGyFg7xxZEp4L`gm;X?TFJxRlzn8~&TO~Jp} zkQv`r93}c;TVoK8T2y>a_#sSzRm4YPyK4;GsESmLjsftO6C`d9q=rNdUlyU~1dO8QO#P?}~#c7@7znh{{nMu;s)QD$}O z&@$YWjIm0Dw{F#p<|I&`2zNl|VtiV)#(0?gU0OB~8$U_848Ss^aeE+No$vm$pA~S% zfL2}F3o)^r5Jl63_#LRCOPDyovwhPSAIy3NKL9so>Gsa`kdT<)JU73qIyiqqKW&ic z)Nk16{G1NWyJd{8np3sL`iti<&o@Q3Zq~S4t&Vda&z|>QrKm>>rX8%`Vq>Sot(7*n zbcAJxRjU>rR_(`lB|N-oxO?r5&&Smq_1UNu)sidx{ML%G5#>godpIU`S=OZZ9lxK9 z{IY1*kXjel)a|&!Ip;>j_x4P5mi*}8iCfN1&Q-}7O}?u$=cnZLyEA`CJKXoxsf{;1 z|767m@6BsH@2}D6>%=n^>TW#Te*4xUp3T7K)!3UHGgW+?%n%N?Ad>E?}5|%4t=@*)3XOYJ9qfl`6Hiyee}eI&re-C z@#W=HXRmzu)wgHA{_gz6?=M{b;nJ1sSFYZ;`u$JeU;p{~kH7x-^KU=@`p2)o|M|zC zII8&P?;j2PH)&wm2W`l$I>)ri!{Rhz7yUDBT{z+@kpG7N6!pk|Cf*;vYlf*PL+sp? z8L@Qhu3PC_%DuH}W>(tR*=?7ei+b~TvzV81cW0HW{8-~=hh}%!yehi!kySA}BHy}b zjrW)PqZBFZzr)$IaNOP5&_LFf2eGeyI=C0WZO-O@tzi3ZQt*R)t}Y!h@`?KrKX8}2 z)_V0J@9!VBs+K%AJ+sB?Lzl`Q99k{8;jl7MCH@?k(dXKtto~6mn>kCxIWy;6*|Vp{ z@xEb+k5sk|8Zi2i-ihx$b|Udj@0;UlrrkPFyRhwNFJH{RGOS~H_1EWzs4Lzn{PN2` z8a{n!>XmnYOKvl`*YPhtY+h%~r~ys0o4*io;8^srZzi7YasM~-V%i*7zw)yy{t8{{ zX1~-cFLu(>2S2+}-Lh_4{+TaEG+Sdn_IjVu!G9e#UsQk@GU)(#xmv-I^bW8F`6&+pu$ zL-n!)dOp_f{ei3ZTpHMQ{Oc>K+!%iO(ud<8JMzgVYNw;q(#!YxsmpoK%x(j^t;sc) z{q1PWo+Z14KTvMb!X7=3T-jUSIyZmSTeCB-%zFIQ?AUGLr9MlHf9S=3b!^+e`PEHP zqk6twy;SX41(AK`WIk2nv$hLQENoT1MeO1^r)vMX^!dH1QS0}t+dD8VJ#Ssywphx# zc*7HOo@i5{3iDb2>6RN2x6(dKOg?~WzPNpSz31nA{X(0Cms_n#UOnr`&yQQ|TsVBrV@n*DI3AvF-+yzRs{ zOH1r?cJefP@obM}k?(AsK4M&hU(Y3P9Cx`xMx7_Rlp4MvdhyKJ^S|EzM5)(U;Psyt zj_lL6&BEHu`Mx?M7hU>uW9rKK3@+Q4dcZn<^TpD!+Y+b_5PQ_dS6d9+?CyKwo9FlT zD$`}|p=KTCSRYCw84q6={gQulm4$y~beY?E;fr}aFZPegE8YCN8Bk2~Z$5sUD)5^u zW=Xq>g};`YJLKizb6cI-II72`-1!xor!_(u?bqx-)&1hh+zt)n7eusZ{>86XXAM32 zVwdxcxtUP@?>{%IHlk;R>rt$hwSOG%Rl0fFbSmP-!K0ondwpA8=`ItFzJA}jxV)Jl zS<Y12ne6^$2*Din6vvim8sjs)mpL8s3WtYRdhL#%l=Ii_2+Ok`T(?;Z;KX|QD^TCb- zk+Z(om)#!SWPARb%R6YXolEDuJAG8Cti7YICH}r@Se0Ah+u}>9`J;TJ-<$iy%%MB4 z{M4z|p-Ug-y!hP0y|ubEulw`UU59t5@U`c@k1B4OKlZ)Zzg4w;T{-{Co(Gdx@A!CO z%LWw}9%%Yb##<{M_s~ys(;LUy zj;{B?)=dx8o0s9AaQ5?CGnZ~3omu_$>W2>=tlr~^?JKU&erejrgRUHYs!Hm@vsE6^ z-YF_NuybwS%D*N)>}Vin?`(2yQm^L!YW6^PM^d{1;|8I-2)&+4WQ7+TTC7O+2{s&Attuv0s=v zVdsf6FK?aw$H@dwd>U`km$NC@6Us$O00bU`PsvkOh|5jvtN}h<9kOp*>e-iD4-~E4)%8s4YnEr??_c;sA$k=fUa<=^3bwJxjJqzucxM`Po0#9sRO|d*LtVu6}2l@W`7x zmz{|iQ+I3lN!RGsGh1y?r`4MlS)tkQ*Q$P7YF4Y#<*Pi|#*sSgt8TUr_U<~{xN?I< ze;nvE;mb-}^20j4m)@oS*N-mGow;;g*JoU#Z8fKS7=5_zxy#9)fB1Orsz+L-mDygY zz~8e?Sh>g3TYmm$`%%>@JvjHpD-}EE-De)PFK1Q7`$s+ZXxpQoPVLzJ(8=b$OZmNz zZEgNdne38ot^C+|t#0P+jT?6UyR@8`KU#kNV9eQ97sT%U>g@X$#Am&~S^dqI6W5=6 zIP$mQ+t;s|_;9JYWhxA|$M?=1KWhG^J=%sRl{{~kq&5QwF3e8-YjeMgC42m}uTPKH zYbQ6BoCy+xkuBtGlOuI=MsNg<0i$b$_t#Gp&Yf=r-$o>-Y2WTTVQZ z*D~4JzE?!@(%jtzk2;SOszaXJ|9Jkv`rpmnerwj09j0>InqFMCdK|A0{yQc*c!lh) zt14QpNAg6c?$M{(0Qi4$wJtX6tM!Fb!gpslnlF2|dG5|($7hYIBYd@He{lcz5uZLb zs>zY#7bo{`^Ihqq7mhvq+h6I?ql%i(x1a1+!->Ac>L2v_GdKfg7j zT8(QJwmf;b)8J1(sC{c+$>Rw=cUoi-xUf9O%~%!!V6v87z4zB$zD#-w4@lE&rdFWt1pd%1t&k|i&FKBQK+K0Cu_ zZ#mHKl`TKl{&?{HXMTLRapxVi*Ch-&^l8|XEeXB5yxMfSY1R+#EW5n%r3VL(H-Ge6 z$>l?qw)W1kd|G(_5AUA)t>LScYN^Y{maY>!bmM@llb#s1v1z+`f4%ik{>Y7Q<{lg8 z7}_K4#U(A<99qz7=rc=~w5YbEX|2Z}ZMgE?D_zfS|LDx&#irHcS{?6LeMxq=m)dvB z3{OdI+jsN4s05eQu^{QE?UQEr%9%g$?f091t%X;7<-X&QO$Jwa`QS@8UwHfN&pKrm zo;!Qiyy)$s#aX+P2V``rVB2TwZ}Vmk-E^#I-_BE~>e^=P*&jKw<9APue;}*rj>6_O z?tk~fqJ42ImcH;{^4sk@|7*e5VdutLk9CQ8Zd2Hbh7oVnb*=3>^}XoEReqY;d-ex$ z6|?Ie?AW8uUzXZG%sk#c+V@hzj{a3Peb@Hn!oFLqzdaB(zumPPKhK+eC3ft;4J08#im=`!=`cbPLyPaR@S%ja{&L>9GbDFeiv)%cTMr$Hbvn6Z>*_J zbIH(iTkc;}zk{W6*rOLWk8$O7G-tP;Q*s{^55&{#9=lM%>0Gzo;qLDyx-A?A;Xi;HhJUS7G0O^iGFhX=KfQz z{xopZn4^gi%YD(^>c0MV(PjUQT0U)gR`;3JJ{y+OcwCKPk!OxCt^aA|XO}jZI&aVy zPo5rJe|{BTvnAhDo44}$ErY+`-{s2-Wj32~xA$!R%@^aYF5cc~#B0Z_J$kOqIoP9x zHsz@HihJ|Vi^fh_bo%**k;8`kF}u!Rw#+VP>>nvx=&19*#C;FB$JmYAnZnJczJ9|5 zY@q+&GxdMNs>Lp{YH!y8eOJ0`<^O)})~6Ge|MkF_Gk@MX_fGt+u{|c9IseqH6+3SI zdh2_fUqnv6d8^@#gI8}=?LO**jr|V%R-*5tJEmN_Ipcv_Z=Cw;r-siz)L{JkBj$g3 z^VazTw{E?$%{<-3dt%+}*duLGHn-y!_`1RK7EpOedxb6DalaKDc zdh3a<1IE7j=GenaZjHMUd8^`z?N=su>AvgMfPGDGrROHi?P=B=-Gml`h_*!Rh`l->1V#D}OU_ERgYtzZwVF63%5>vAVXW7L1ERu5*LYMd!GyQIn9P&bEmZZ;uu0$FQ;7x6b`5&L%##E0&ap*qC}*L`g9`B zYbjrDPJwrFg1%%z?9Qs8|T@j0M)d~x$D zru+_&6(`sd5(+_G#8pm<0hANG&%I212uBFQQ#_2GQRiyThtsF3Eziz+4s zl)aH+MO_B;#NGs!Ybha3#e75xL{t-kuyS05V%B->c$TPK(i@Z6#`T=P7GP$Vox=t@|Lym1L@5T+)qL+ItO zasu(6hOma%n@Ca}wavmCDG@Fj#M@h_&Ay8R<%6EJV3ZUG;{5YNMiho=SG#p*l^J`K_+Y{g+04*PPb zayXI0=^Q?eyxogdaJY%X_c%O=&?LT0^H@#dD~^AcRs!)K)5;>enRXg=zd!vjYTZAb zv@x8+2^>yK?+%&;=@Sq>lU|5$dHQsW{KpWQ#MN}NlV3Re3-oB^48lB?u@9-TraxwU zg*fTipo}d^G?HG@RE+%vG_n^oD;19`UH5U=AK}3a3>)H+#AenQdL&hvrx-V!r#J4n5D%Ivv`@&~Y6)!jPks_Y%8W$1$GdHYDZeaL@%tRLEoLZE~8 z8F;(yJ(-WC4ikUsT>h{>iTO_)t?0ybN0ehRpe!9K>sWyiyqSbVHAg2vb9AUZpa^k9 zhlV(ca2Kl@U2_!|OjLTbcv6R`^jJ#3-=6TN9UFPYz!2p87og*k(n)FY;#z>qzW|-| z66JL9vSS7oE8&=N0^&O0&Km#i3Ezr*L1>qwe+Wc869beVAuR|UbF|~HBT@36@QaSO zLZDw9yF{{x4=FEMWHGeILFFZjb~;4mC5s~rUEn&D5Z~$$l~+R4!Yx|p#YyF*h)z00 z<)w%XIz;8AiroxNcRcJo59p*0EpT1}bV-L^bY8`8CE&xC_?zx{&v_kCiVmGbTDqvM zLq8!cU36k-8g%xn$Pkwp+AR{XKr1Ew)S+rFo2j%|lSMpti+V^aBfe#5ifDr`p_dgO z)3r-o^JPW59EKbz?oy_*VxSIHaF+)(Mu%#+vrXm1OdV?It^(*u9U@JX7aMelG*Mn` z)uC4ItC&ll(4k&9vGxiJ*1c3)s(S@dUWcge6+|Z;qPk}a`k67Jq`GH{r8+bQJbhw^ z4ov}1pSYw$k0UKhxN!-P@~uW%mZ+vfn~|0+?$@Drk(Morbm$<`a>QyKI)k(v@v#m? z+iRIBifa-QKf4>5Dv2oG@SHBpVXZJjsU#tXE3A{Lis+_8X$(E6Lp2#%szaR^+NneR z7&@;*8bgjMvJOQIW$Dm@u=`L#CmmYFP`(arW9S(jI>^vlI`kz&XLRU0hAdTO3BNN` zo}q<_d&>WgqPxm8*x7ZgMsmXcL2H` zamDn20fkc!=pTTn2lN+bLdqK;j?|*$3r?aOAimWhq8uRF)#fzR{e9Cw(F^ZLkS3_~ zp<;{=?IVVpt#n6poQYw z$g;|0F%$bt1pNu<5n*XW&=h>bva&KmWa&^MpjqMphNPBei=hlj4bB$%0jRMuTU?V6 zTfux$zOlgHbTKHZylK9ur$eLg%WVt9Gk`MC{}xAeRh|&9>d+QIPl}Ip=qjM6#8*1x zitef`5`O{$PaYAT7VDZYQL9{{(uHHm1#qxdn?a~DLV9UbbmlkN=PgK zv{-zrLo1_W@av|D%_!d#u|9gJvP2AIXqw~0XjNG%9@e4Hqw@jLUj{~!qQ6?u>Z?&~nI< z0b8QdpA&EB5S6}49Ar7AmR5^15^~Ip-J+}(zcO^eN#(5;QO$|%1t*oaTBPU@Nxeo? z(;JaWAxGIZ#}*uBaI(MyLu1N5@UYb`0y#tPF$;nyJ= z)m{+`7@8)|#(tt~!kMt7ybQ`$#a@P{h+krlDE|^m+fbU+*=s^;OVAXd#$8oj6A$aq zqPU^T7BQ2d>5k8%e^lNO8+7QkxZePUwPP-h9dSP@TSX-u`Uq)T#R47r3~AfMIvqNT zv~A)~hNg(CaWQz~GNJ=o#IcK#xvaABBc{kqPzxX%oTKq zde!@)NQbCby)PV{nNl>f_gD6apLB?3u^)&sT_|me*d6~Cpp!cE1)#kmm!0htaV@@? z`9rZ)hklJ8s(d6I-6)@&?|w{C{Ot)hdpeneP>iR02t?Wqq*+VhCmBB$naqVWIKjMM zbdr!`p{E^oz=rA&&GHV4A{|=cDKZ}v&oHz{jEb5Lh&~68(!~bkJ0ucyXsc%iwt0AswRL ze@dL!A?n3ghv#y64(i4Kr@gO_kF%=szxSC;=9y$Nbfz!#C85*W_m@CwE0h-{P0}`y zv}ux-RtsU8nI>Z=nJ_bH8)zlbf^;nkqWD&S3tB~_upsQpn=C3~Syx3@#jdi#3RqlF z*hK{e`F+3VKF>T)lH&UNeSW`x_LH=8=AL`cJ@?#m&pr3`dFJ2L6bD-~{r12wRGoue zH2rR1jSiNbet+O8m2|L?=??+BOt2C3zh3KUbx5!S*c0iseyLivv4rQsY|Up?%E8#0 z&#G%2jIH^sy2)Ugt@*6F6BsqPYG#M^oO;Z`T7dmZ{kwxvgD2FV9E=)#UQKzo)JVpT zU#m;sW9qka=Iw!BtGy1kd*XQz3JJMcMuRGZNGk+NPjhZ5ph^y7(GoJu<(7~RZ8CNf%LJ0t1YdZ=U|@^>|wzk5nuj0 z^|2JWjHs{9dNS~P^@4+ad)5tV{7GHoV6>h;shbQY*7GNIr(nh+UnfKSJzCXO-J;~mm0*3NFnWek zTJVbM7XyD*_X`&z=bP%MCG7WsH&t0LdERK>QLV8xS1s7p>fY*dV0%rP`g(OGu!jYE zF3b`F`Y8vaECF4XA(!XElqH}C1iKnucoOnmXVNrfDbsffcBA@k^{Hh+y?z(-8J|_I zU&$JbJ}aaneFme?3hCSWiJ3Zt^xcASoQ@;ypG}&K0U>>9PAF0Oxn&`JonRx%u4yQ< zb#Z`cBkI(emaYj%}Y>Dx{PwaVCveM&z8;7M@ngNoC~G)kjvHfv6}nKYV}~w>TKvVXi(P80-EZuv-nLrkwUd+1vCt9V~I$gKD0B#=#b!_Hx;L z{Tm14NV!12>R_utxlrTS5Pzm^7wNb zln2zj+3yH0)<+!d?X%AdF42!T*gJtO)4vpqB{T(Vb=ffU5o-;ep{JLy?ZLO}#|?%a zkPfcW)gvxtT)jg#en2qA65gQ?I~YqiOTTO|X@|4*lmkL3z3Obe(!pY(j|9)wod#34 z%)T*rj?P|Xc-}U9i#kvL+`;ad{l9|m)X#j7X$RETW`8kwzV5w-n3*B1(SIWt>u_Um zjb;j3Ecndq2ZD|IUWby{TK&{PrWx(7*C$HY4z*s}e74MX<9RY))ba z(i$DC7HJpg?GAP((k{@w4t9Q`MO~AFtn_e~wOBu|*KJkNKn;v$sTLe2SnBm!`PY8CSxb zr+!4R5%qnPw?)tUuvgwzy-YAexm6z%3}Xi<->uhw#G~A<+eTqU!JZ4#mv7e}b1?e( z?fR&pw7HYGUH{yqi7&rczwS`d>tCX$T*ned)SsZwOZ3kLGcDbv|122W@7KXDJ@0x~ zmY0G_-BiNjDy7>DhPOi80c^m**kUPtjf0&nX)ifgi(vLgg{Pentk=Qz3ic%j`;cIr zHyFxK&1nJ8tb=`N&NILc8B9Gal&=f+sG`?M>Fpn5KI30f`auWdSe4d463p0VTEAd0 z={ac~`M4=B7E6x}!($bFkZHhst~OrycCvxpCF2j|yh=*{i>2 z(!|bswSA*0fotYoEx#I$nFqaauRbAZH>$z8Gs`nN@(EJjsNO#}QNBwrbFf3e`gMzg zePZsy^2_vQ!AyjaXUD}&+l*Fz)Q_k_dxh2-Ohe?6b^l;03;e)wI9F?IPjgac~BB$jAmekn1}3eB$p zE#;3fG^7uxSA^#Ojt_ZSilyL9WTSKWAQkRfZm%D`0w9(%q?CRk@U;IN7{|!K`ekSpzM1R=G!*T=aX`wgz z@oULT9j&GDR%c=^UBVK30WHU#--`0Dk2igUn$e=4(LKfAYy4r;vL@!?aZ>$d3B9r` z$HSNyzs!4?5FpK$F~~2mR3d^=i+3|QtJQ% zsvWRQZ3lEy4b7m$7#*6nGa9}|a@`=QrY?qtnzxkknYSa=a?1LOP%>4kuSxh3Ni`fu zXPg5^> z*9qnSt9VnQu?nNlUMZzdN-^QR2nUpj@wbTQnYHqIge9k|xRG=^HLw^k@Rl))PYxZ&ga883Ez%W?d>>|F5-UVbfkuH{&!5R!UuPR)S394 zh0kiluLjLI_@1L1gFDn>fpvf<)M^RW3&ffNshb3D6POg35qKHkgScnMU5XLF@0A~v z@bv=2it%A}+q|ivPw5}dn+5pdym_J3h+hJz=D#a+7bsgoUkBWQyAPy~DBk6WsQ1m! zho-16ggzLmRv(*xICNa!H2-FVkIsKaJ*|1Nd0c;e{w<;BCGTxKCbh4ALy z&`&{s%7PZq%v|scVs4rJJYZ{xsho>$bIMw|;CG>UD5b()hEitR+dw%FVU}`SZ(Xp> zKCXKf6zp47Zo&P5Th$QYeaQPnAZFdTV92ghM;F9#D~xN2I>j|a9cWr`&(qL+b;0+n z8B$iAdUnALp#RN+6KakXS@;?IAmVRE3{M<0YR3EizLy$uYmuD7QY%!O8ed{I=oqQ zIHGP@Jg?$7cA4q`zdrxWikl_Z&8RPR8(Kv8=wiah0my^d5 z6+>2QsJG$=D7{!wr=m+PuNbjznf;nor)DjA5bZTj;4*>l5V&Ez+mc@E zGWA6DCm=~~$!!(aTZfiB06rgI@^yr7lJL+WaN4r=%5$avo{K)X0~}(ZUc{eQ z^Gf(NwQyMx;nSCOSm%n(+-kivbrEP*FB?Mq`O8kIbER+IYO#l&i(YwMWux@UMrkjt z-wm4M7X3pQ-r%Q|VLAO_dp%$IymkMwJJ4qz3k4%}QWx6NtKm9zY}wuDS=>**S=~1K z$v~axtxj>@oHn^4GNOLC?Ci+(*3Xtb01ZC}I0H3}tCy`eP~yv0#qtwshJM@fiy}JE z8TzBG1CLExSl%L~v`Ae#CEO|D7U>I}0?(z8-xR&={hbbDM+tKEXJfW3I1=s7FlqO?U(=!=rKD7g+ut^u=nqNWL&E2f@I0NchYMTwl8lxn?f71n{M)mqh0T zK398N#o_?#TPJXJ;0f?t9eBDnt_}<5!@~Kna6T+N4-5apXxWEChZXk{4h#Q!aKKX@ z!iQtT_sTa(*j6ibZ@^Y(=|0@ko??Be3{M4EUk0qUjshmEJIZX;Xpv^U)d$#Oy^5GN z>kYt8%L>|f6I}>!yA=Vv)QSP7guYkkvqC>0^hMAwR(Gq8P_4R9J$y>7dXM^7zy=ir z>`>nU>{h=7tWye>-zIRW`e($PgIgmF*ck5%G^i^C?ovN0Zx+to>H)Pq z)SwAJZxMdeK%7Bu4+Y93CMe-@!tM~^@L5a4eSw<{J?GM`z*gvrU)qcu;*8a8qlKngT)Nn(%FFX|f zO8B|(3*kS9V-+(h&Z}5gv8f_i@xh9ZR(z)7riw3A+*$Dt6~`)mSn))~zgPUZB2XEr z+*a9NIb8X<%73VQr1GCCe^~kNmA|cgwero%NMw5Cw8+B9vPfg(g2<-Gdn3CeS47?) z`AFpBktcGC90NJy}fE%Rl2ILYG2g{s&1`%pz1qS zC#wEf6^u@f&Wz59E{v{>UKrgO%|;8+%cJj)UK71J8p8}Xj(OK)%>Jigel-(o9 zdwE6NzuS%baznWLb~)yHSKya%_k;5Y=5`-YXJd!#9EF=c7|WIVL)l8e)#aFVsrvGF z0&Wr5FL1xW8w7q?-~$5h4qXPy`$B_&4~2LDaD{yY@DS!hcyhwNw*-S>FI*93u4&;% z0pBWqTSWwWZkdWnfbSFd`wG6fAY9o6XgJtaO!d=DmzeniR|q^;;C-PKDA!kI0k;b5 z6Zn3C9}#$1;1>mcrRp+JJ}mHG1U@J5Wr42?EQ^xH$YbEMG1l?-u^|h)DDn3J#^WCV zJP~L7f5ktAu$s(zO_}_+2$xOySt-U(V^ZUB{93E}{S?AC1l|`)1e9`hegVR!tanV~ zb1L=Ib^sd6C#O-vMz_D3_EE&&IGuX)m;S}+-$eXZr#}Wbp2ItQsXv-U8J-mQ+^k=M z{#AjM)eN5|a6E^rswu-q1R6=6sIDnH!u`Mywp(Bpg$!j~l27Ab*!0`m!Sj+Z@&)PO)Enq+Vctl?}t4Q9!|0Ky-GPno1X z4rswE@aeZQKwI4e-!KVtN&LbR@DO5d#b=WGGN6UnFv358zp!x&2CsJqMJ2*7VudqF z{RWWbRN?bm_>)PvUl2u17=Fc8WqJ}~f`Ars#t>7kn$I2X5+!rSc5MLhd=va9f9H$vLRF6#%+3KfAfKgL0kvvFZVS)N5pF_0t=a{4A|HSI zsTna_klVtgBEpN1&%(2G8v);g92VBp9e@`j-NNtuUIf?$-)yN%k#505UktbdaTZ4N zBwz~PmP+HFrFOz|^Ot@yC}lsMIJDG0dG2r+Z=I?AsT741F!c&s_5&jY&o{9iht?s}`V5!>ywYn1{ zf~Ecr5KqLYs}Q~mP^){?2NAwo;3IerPpfYU{I>cK;vWUn>M=a+XkpiY&pdt)BZ`Hm zE(w2xk;TGO$TuMV3D~%$ej@M}sE4JVLOm??wE7I-GwQQ|&!QfddJa~P-FehT|0Ce3`s;v;^)~^R=x+fo)!zoJ)sF$5 zuD=6#hW;+#O8tGnGxZMu&(i+_xLW@h@NE4A;2M1#utEO}aIJn4aJ~KoU^7-?7EWP* z3D~Zm1?G1-wh23iuU01MqG=3-BIY19-ol4fueb1NaU7HoY_SzR(RJZBMiR zY{x1;U3p0)6=|+&uez@4lT|lW{i5pJXnXX!=qICP!`$f#!Z&p;<&d?keD*xXcz;^$ zrRN_LcgMK61!^~Z`dGRVp<_I`uf>j9CCb9{zwmTZ;L}c1b5#PK>@;|=d1?VZOW@y@ zV;)tD&*}K!`2c2D>fF{`YA~CAr|KW<&lGD1GwHqE>475N{au^NW|jN4?t29((Nv2Vh1=Z~3!dscMxgNDH-Jiw_ z#z)bq=Fw)!64jOX(MX*C; zHkWTrq7s>8)|6^!(s|XG-kHQp&{hnAse3{uXyIWr;VI zz_z)gnC#xwnNN17Mf6feL)Mn;PiI?_L%G4CYKD;c{$#deAe*704Mk@zm)(&BBgxsA zDGX$jLneuWZOo&JZ8^NFeaO6Jx+T+}Zpn2grGYx+P4KLfo6%)X9eJX;sm;`SYqCGt zgW|`TgmPOmMUJB4=Kh^{HF`E#C}ehK(kXdayw5CbS12zV_d$D-ei7YO!GVH z87oA8cRpQA8;)*yruv=99@UcGi>d$`0znyXN^}L!E3{C5Aw#7}8$vb3G!;}#wG30Ah zuOe;{p4V8P&cbOZ_m>8gc}=_8xZ}NW84gzK@q&kF>L2WbN7#{ty3G$5I3m`vp$lp= z>dgL&-i;>6W%>4!0mWP}Kojlc^PHI*axFRU{3HT!w~%#ssYx=Mx!m*<=jRW^nq6Wi zPSti7b9vR1E_RJ&%Q%;+;0up_H@z~ybs!v?`_Qu*as&8Pg@$ZqU`H;QPk9NVcE@q7 zm)~p{lg1A3MYX4Q!yM9V9q|HQ%J^>> z(dRLa0clD0_Y9(OFhCX8=5u{sVtcv=YKKv`r~7id;r6m=xZ{(^(J_$j#<-HXJe`8) zFyl^XsHCn-JUz3gX`w`?6A&|Un$G762uC5KuX3dvEn(MAcWf@Gu9O+aq^3^S_7p)Y z9T!Q_N+bnQfXk2NxMhw@C{@RiZnRM2it!b}5=(4Lfwp`aa}NA)NkN3CLsAsD6ev+L zf5TutpYAWx2MU!RA5|kI`TfZyNmSRKTz;2tf>6?=8R1H3UUi``jI=O=uB>Y+U4`D< z9zWx*Zl6#TqGJpJt1~tZrtJ6^AFDN(G?)bASW0#E62>S2m4as>t1&segr?n4Sbe^y zpf>im<^~Jt^|0r>nKt;-WGVxiweYVEy{Ih=8iOpx!gcxNKyRkIpvG0gtGFkjuRfj- z%^Mn|zIj|}p(WnS%wOn5xTEb(4G24qU6e)jWVzy<7nO1TwPE-5wHTl6pFFUFUw59ur z@QXP;X-zWYd~L+!lP0k7yacB@UW6mPKO*I$H}ZL@o)oTJV`Mlb9!E9FDD893X=q02wbb^e9%CdP7wKtil(t4`iY1whehqn&QtmP3jEQo! z;?syv8|2Rno)$Q`=L%^IWZgydYRtI!b4;DNlHqq?>{?5UY0PzFR@Pr+giJG=;ruX# z-qw(VX=nO5Ic{yL@7Ubl)Udw3y=zVLx~_|w8#~vJi(TK;yl#D`SL9m7Wzaw_FPoJOQw*)oRIFlpnS!4<`^a7i1ad0ikNLV{Kk$VUXO#nrmdY_ zt@Z8enm2T9H64F5{dX3bQ>rTis`cqiPcPiT4)&Qf*}=3Egf@m$S8nG{^nMv#;QG4} zDipCO!Q7ccfx*4DGI1>1NpqnwlP?abR--o-Vx~&Qjr&9rFW#9!QEM~#LQz!aXchB_F%cJ;aj;|w zT{|TYxffi))o!QdO2eki(M-XeIn{L8U=k~E8A;YB`%y_ulS&gfXUgXcC&^R_jtsp@ zR>q^#@-okQ%VaN`Gg)Bg0Gw5RiHW=4;MR==m~8^tF)$M(XJ=rXG-D<4XLPp{L|Kk> zG$OYkS5GHNl1i4^Y>Xm|vV6HDqJFTLGtw9vH1<^NI$69_am09B%FWQhO>; z{$zEsa>nxO%DRObzkoS(LF&PkfiVX$(vsDCourrZr*z7Aqpm(qsZ>|;Bz0!pC~sku zRhZ6;=q7G$z%MbPC7s-jpv=$wlQM~D%jBM=3Iof|i{tbqe}+;ms3S#}yD!%PW+!SOgt3Kw@qC3pSp zNhxbW-yNmJ+aA#X6-hURMQBed>L>sT)0Lvw%hr8$=I|pJ!Nb%b$@9c)?;SJuHbE6NXf9V zfn+|(6<=vrV+~#!&Rx~?9u9{C4$7(a#{BwBDsAe;?3jS3vGupPAKGf@O?U4~r`Be% zt0k7Wai_|Frps6cwbhm#?8)>?xt>Z59~e%lOP9>YBlj1%JBdNEs|$r-pDdX*dk)U} z-XQ2o?%3Q_x^@)%jbdrtgE}!NlPrz_s6FBS)L@hRGF@^8NHN~2ugKRy~xB(WLeq3fX2o7 zvKqHOre?;8jg2Jtv32z*eYJq!7%jtCrJGjp=jdo_Y3}T7YVYc3es_~9Ve9K#)=JEp z&7GYaH<;9}bl*U6$niYrfPNJFLf!Bj*h@r$6GB|hYjD*C!@&Fx8WMBy=E|VYW|ISj zblpkfR`}vl8BYH&didh7bA)XMS3S;56Z1OE&%5$lc+AqxLlLI{UmRw8hM6zUrGw=8 z^^pB?RB3c>FV>&mi}g78+S+gHCy91!@+2v2d0({g)jpLPyK~fT49-D(DJx389Idm$ zvpbl9r$_N8a1Lx7n2}Lesj0_A7$$C{uhmScCbO^M7+q4ASEi>mXLxa&%Rw7U!;aZh zkpbKtq&E+6_MP@=$JH{UU3(bYi)CL1_F_f=?12xYFq&i7Env9tRadl#H)oBr)ss}( zjq+9aB$cI;72inr&5}6C(ou5L8b!N1*K0~U*Yv{P-fC-dZ%ewr2dlVs#$#h}^(eel zal*3Q-qlyi!Ukw!=aqsa6=Na2g*j&8KqreJLnMP87D!mG;Y7y-Se6N40~kMCj42&Y zsJaH68Id^!>Ox7#!VSwcL&fwK4s6&l#sCU(EOap>=FMI)kBTUklx3nBz`23rtpFdPGgEVFjqwN7svm&YNfls+*!s&2@LQ%6rK2&_Na}~d*PWs?^`|!O zq;6et8!#{9{)Dq}g}DYd7F=`y11Zcmo8B~-!}_-|haZ!6!X2$0o%NkfW&^N*>FEFtP}zc*=It^Ya0sOf-N^w6A_{AA5gg;B;XTaR z-;k>B=81Ue6mMO+=#(NROe1pf5(n?F(3J=?79XKALxR1a_8u`;7L39-*Bqq7Xj5xXJx z+);dP2_X#+1|?PkjFD!i*OowM&O01z7S5&Yl0%5Hx!f*nPMKYXVw#7^T}kPvWH|l^ zlCfjXDa8Ue?u7C(S=1EX3p3*kJLkrovX<;X`}HcPq{e(^ce*7lr{+>^sMziDl!(sH z9Y%K!X0t<^uvH-^)~)GcZ!WbV*=LsfYq4K43TblBU_^s!|5DyDtkxt8=`m4ab0zi^ z%pBheZ}efa#ZX_wjJ%iIZ`d|VrYI5y5l1ctJel579$&#@r{^JuG)0oe8WP19?C!t^M%=8Rmsf8KY_+*YOyx4-oWELYk&jZI( zy=4OIGnMX3=68+H!@)AoEynRlIOa+XcAq2x4it;kAuoq}w2iaNOkWx&=Y0cEK)xfL z-<`op89go{MErK>V6TJ;a*fatC~_7tia{Soi`9XX~rZNPwwo4 zw8BW!d5^Yq9w_q&pR1u;lQ?XOnp+NB?laciLCFntNp;aG*zwt&mhrop>$6-zu0+6k zahFBm&`$Q_OSiKWMtkS*8av{-J@ByZ0D|75T#>}r7z4*VT8eh2XQdrr>=q!$7^x9c zP_lyW=9H#Tx<-VVPx0-}#9Af}oIk-$VLj<=n3_F&R?^vE@94&aKFiurLSEzGU?Mwn zlG2)yy(@4=n`KfQGDj1%xicb|hdF|E7thF)|@FxGaf6tK;02Jg~J z!|0P!TCUkQXRdb0$nQ1K-!3C!K8=Z$iG$bVq_nnMuAp>_WF5Hcl``i>Ngn0)C^^-{ zAnBZn5Oq{fE}c0uJ8ent#IZ=uOpal9&3#xkbYmICGazTT1l5~+GiqMDGzVF{ z8l*CPJ!;3U9#w>wSA~4HN;x-v+U2lH%p!+f!amh4_gT0(;2hbWlOZQ|4PiKE>_n&Pcwa1ptJBlNxGBLo$Qy{4w{pVnsYYknL*;+U3*3t zzN2K2s19rhap_W`aU<9tg@OY<=Pg1qK6VsKXUos$Cr!(F5nR@ay5u~e89U2ZE3$C+ z%+T#5W^Gui3$*Mwic$CWY8_S3-|zxSQ#S2fad2mQr9I)?j`uptMdgiew1!q(1)~0N zQx!KFOh2Z#;>1;Y-g>hUMA|JTNHt*pf^%LGo)hSe{qX*jw-xt$xtf3nl96W(SH4W} zq29H;?gCuRfOx+`F)y{oU;}^b4Cy70%V`)$v2e@aBqyaXge4U{Y=4?3q8!_cTpb$4 zIcwF9!5!er21b^Gtmf;k*Ur$Ezmt3scdmJ~}@R}F246Q42r z^ka!IV3L6;a{z;+*=A6}7M&PtezZOOBNvNlUVt`9MtoM%@!2w|%x4O)K&}WB72>RC zxW@7=K^y~V-pC2rsHF^A94lemZ-c+Xl3^_y*)sx+Ea_w)+Ykb=C7d9?un>i=&Ax*> z=jCc*1Z&3 zsC6%n7I5#rbpxKW!GaY}IMyPR!E-x%(PU{gfS3%Pk?BW#8=is8AtsG)#=>L~+b-WZ zJTH@%9ALM&8Bf?GG1SAmOAhRK;kyCPQf82U2f|5Er<6L~qijM9`RCOd`Q8KWENMMp z60{7fnv>DDfGaE=&)0jYlxnx+A(v*PrXkZt@NhUS_h>s%sw+L^B}Jp~9Du}0JolsK z_^BC7O_3+1%|Tac6u%;Jb>oSnPNXw5j$e#?F>OM*Mo((tAn;xIh z@a$IrpULzwEFHcSlCX8ul8wE6E$Weh)CrW30~`R(x{^O@Y;20Du2rePa;4WbAjNA_(o>t= zpi7{x{h-G1BV`$j#XJZpqf5stbY^$>a*}3DADBNj2Q@q>ocl{XOf7DcT2NnZ{aa8Q z+MVl3Xvui8Ie0dncMM2TC-_w6JnW8JD)zf z|9kyD0X>-ZOCWE_8*Ch{L*wOWpR_k>)AT;mjtlWLX9YZ@>#y9jI>>I)^s2FPv+at~ z+u6Qv(VFMb`wU3$I5~xD8QqX+j3=GSzQEpu5fOgJvv*ocGpvBUVlO_lTiQ|&p1)+D zWWPb&spLpo9zz?(tQ3+bmFn_R>ZR`VjJ4w7X=SuF)0Yz{pZwp7st;wdehJ50bwh60 z-#KfLi?SaAx@Yoyd*V738FyjjuDx2wu!zsSQAu;jgY0 zbM@Ri<`Rza8^QT<0@LW{p&G_ejfgbgelWTMkJ;^q1EOe)qycCw?35gc+Q5y2iQ7pH zmleoyaVd{68 zIk65^xl`JlW1@<=b62)0eZQ(?4%!DKtlWVRXD7QbGSk}nC1;kizYvWV<3CEsBgA>e z4#cy=v4o8HRm^5lf|+yDo@5phVh(V?yo7Z&^jVZh8B~=S;ge=IQB?#beN+zCt}4xl zDfJJTxt%&?0NgU-=cMfLpvXzdNXPC>*;zN%MDk8%9?teW-=`|s6*;HD?B*0wF^#Kr-Zxcu8R2zkY*?NvsNsZ)}Ue;)Z5IZ zo%RngH@F~=aT#<^DrWK+MM$tDjijj^1=(~7BA`T@4~Zq$YKr(}#%G4f!@_zlK*T#P+Y z20BBjS(qGXDJn>fQHQWzl#;>QWn4Sh1A2#l6{$>{fOnW}$adqbmads$eimNda(7i_Tq$9v#iR^>X!HcT+o?Q-H&Z#om@bAfbb$%q6uTLPaM9%r z(57HEqT4v^NN$*J!thPt1t!LIl`0V%7Zav&%dmdtTBoydfs_LmD&K8p8Yi2Ni%;_P zmIi88Cu(Fmjw>st99M9099k%IE*;pf@ON$Jrw_jQ!OXhPC9XI<^4NDemHpMrw{MxT z@~MM?@^}qCb1C@Aiq$!5eIJe2#tRySlE7{kY<6#?8lT(U1x-hhV;4J~h7B zipHlSryWe_`1EL5LR-=Dgyn=aB2;`iK^mq#i;=}M6R(aGax2$p-xh&EGsMsnpj;#t& zxJmIdq?pwL&jU{joMNkxyB?pWvhtevG8RxT1oaFyNw6uD0F&78VSLA%o$pqBlcbrT zl`_>6G=&x!S|ZH^t$}hWq#1>@h7$o)D84ARsUi`GZAP#@-ee~N5t{+4Jc8(&cq+a( zwhh5xgt1W@ini=X1TbPpsuE>7KKw#__(Z%uwy7$C7XS^Puq}&NIAO&uW@3FL5g-MF zu_PqegwoHiOav^G)sSum`{5JO1l}GbEQCiTUNRIOT8~cxpDaG}SbwsO4Ieag2VvC_T6IJ+9E9;k z$oe34xCwSa;S&}bi#n9{x)$V78{GC)z+j>^c1^IxhG6l%)W|-D_KEI>?Vy5g_m!qE_WrA_vQDIDl*8#yc+A*(#7A&|CofCYbv;9;P0D0Wt<(R$Ro#H_&LbO4M}3P#+Nm zAFg({5Gi+RH_5BMf|8doYeb+`- z|LVc>pR9cPy({kj?Cy77TlU7sufK13KJ#Sw8;@S{?Jej2@`j_g%$WSp&FB5(b5%Y4 zPdxeU1+T7s{kdNCK%hC0{Pe6Zx1Z8AcyR6amtOGu`}fsVS&x783*X=LP+$9rtKa@R zYu$w#*VbHB**)iQ`15C;{kA9Sw)`gWlW*UB=p8?pGyAC2F?v2;Mdlo$c;^i~;49#@ zBKaJyS`P7!Ov+7k4(dZIYR}+5%!HL?Rae^zZSmdM@DD_#KbAI$5C1q63dC#TH5Pt~ zD?SIdTph(I8M3P5^PxmE|C6?M-eeTU%irY8RE69T67Nf@OsJ{x;b*PM_ysFlLKr$3 z85@4yiDU?o=#`T-Wr?yGqWC){R2H8epDv^zu+U+Ur7UEDhDny?CP9|Tnn^N?)3@#QE$Ql$QM| z3=Yl#drBx0AAW{zrpCr!00XxTp-~|Y<2rURGQ~ENK0;2D0L;)F8>zC;CF3J8%8joG zEG)JP8i^%C@DJoxjsh`~;U$Vdk`-91Ok|n8&tpgbwOxyeZxsiG&g4cO)`1R0RjgA$s^g zB#PlUo&sW9@Z#)UBQ;UfA+{O$Dxt%Xn%HI=b(We(*iTUt>SAO$<`TLlHZq?TB;#nJ ztR_BEhm5gp@sY)#!gu}DP>4i`U}D4~65AG1f!HdrqOFd^Kx)NCR*83QLV#`4g!d?y zp={g2$We`gQ9?WfQP4yu@Oz?|CDg@-UxsFJQV!%8{`NQ(jCg(E(c7=BSm0iD4)JD0aQcGD_GV zeQ)1u;gF`K27)z#JI zG`$)KYttjzQH!;LuCGD&qieD4NQgOY&aW_afQP|6B#hD-6*c-fOl=Jxuq&-t58s6D2?xcxKP>PFc!BT;xIzL%VeFQyM=UF(%Fq+4r7vK#po`~Z0S3gmLS?AD z26Ez`G>uGSqO{6;@Lwhc5Dgw`_?`%3@8v|{UXVI70_XdPZ5ny_kr*525&VaXhkYQx z!C?4E2}M;fY(El3?>*v@SZ?+sZgw~62s$_wf_Vcp3v&_$V;Gr)9t#W|L8Ln-YB(k` z9)s--A7gcb$Om;$)+o9Gn8Zd7A|KR*4n+AlV~Eo6p%q3B(sHmEBY}J|JJmSyDYl1& z<`ku#fKpBUPq>1gfG5Tff=Ny^UWZnG88borP0{L<+S=3c-`vVA^kX9mza$x1QM;

Hx-(XmATqP{kU+!cwoUR=K!NHpM5e-Fs;;Cn*uwG|SW zxZp~2I)#mr3ax@t6Q!a!I`&lx(-51g!jDs8X4Yv+c6A~N;?)1^&K&~N|$J-cM@fe1AgIPK)Z%JgfH|MLw`Q!3WL`-O4LIV>Tn9#t4 z1|~Exp@9hvOlV+211Hk}-d>OB=~$VJPUTEq@onYf;z_q2pRJc_^>7(6^Y^g)4$KzS zf!`|FqMC5OwF7tTHsaS3@M;>swFvX?Yh}OvGxu<@v4i)t^Ve+5_qz-mMV8#~_5U>j z;qNH$WZpfFY{qdV?||@cp5!t|lRQ6nZ!5@oyinX(mH=Z7nRs4qPTa?HdYxN!sI~iV zCGJu1jqNLO4^qoTG~VRkdHxV;WNs3Wz5iA@?>u0ohoeybUXNQwqa3mFIGFbtOGmVz zOW<=ZZd!V@TR_YEu+CXD(pTUhb`?H+e>@?-S0k2xEovI_QX4!v<{c59xqH&_=7W3V zo%d*XxI6a7JMSgqZV2A{e-C)^z5#D`;3;9~m-jR&bq`M4asS~YaS7b1YQP<-1SF#7 z_`4h?v>I^@$j5f${Td!t^8z04lcZ4--Y*?r##{4SiToEhdgp=lMc|P@U3vFv7x?D^ zd3&oBVcy|MA|(sFLFhU`m6P;(DWA7QGf1tM)GbKk%>wF?w{Lg<)$;K!rCW2>&)j2S zJF{dSms5MDwk(+vwM!f|%6haz5_6k?_o{d=LV;@TsJ1ZH&HEF)?ZcYl9tr+D+v7z5 za^qD2S~>4rc+~D?1CPE|YD`=06dT%zJd~8ZgRSq{E-~JjQHcNRZD|>PYlgp%LY=0N zkGCs4tMtpQ)cIonqiM(Xg1^)U8YO={YELcp$!#v)z5hSqL0wM#O=w_30}~pU(7=QS zCNwaife8&vXyAXG2F}OfB`Wp!%KvdSo2bx)1|~Exp@9hvOlV+20}~pU(7=QSCNwai Pfe8&vXkbDEjt2fWQQ5Ds diff --git a/SDK/NUnit/bin/net-2.0/lib/nunit.uikit.dll b/SDK/NUnit/bin/net-2.0/lib/nunit.uikit.dll deleted file mode 100644 index 9087db2d16660e0fa83bc9d3c64bd01e21807d61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258048 zcmeEvd7NBDwf~*lJ-2&$W|B;1(mmOxJ0S^|>B&L@B!n$NHrbIa39|2Nh1)@prei=+ zgn)=F5EC=o>5p4)p*pFZ`Czwh^)s=M?|0`L9a@2?;8N%~fu zI(5#eQ>RX?x9%ZpuJ>}D=jHMLpa1l{2k_+I3i;jk&jutlA&ii_V%K=(+-NVhWvrviDeCl!0e!J6lx1o2-H@dM(R=Pg)w`X%cS|G{T$xmZ?_ zGeJU@lNLmc=v0Cz8)YQU6L_ZnRzM*OqSMbaKvY>(2ZEo)+dCC~HTbFqUe&;>8hBL$ zuWH~`4ZNy>S2gge242;`s~UJ!1OFds;1irznmS=Y@d%`{>G*Yxb=A&+dM6tLKELj@j@p!#{rJ zu5bKozt!h#_~__8-zon2iZ8uo@eBQX|K{)~9zN)icYNlEzy0RPtDkOMw%?x?Onmg| z#|K}(b8yP6(t3ZORl;(BANG140)B|{1)iU4b#RejxPOuFEkpqj>+^Eu(T-9uf2QX* znP)&^6Ku>(5CX^=PGo4<%Pq=#x4Nmf-@r_~)C$O}(Z?Vr-7bj9I)al4g(4B`XRwe2 zu`~b?2LJ^((x~>DDXG|`>R_XcxTz$-2r{oVg9)HEih@+jjj2SOmcYwqdJ>72FxLzP zP{cvUh>_~z>LnRQ1V%fj7zx(F)k=m7ffdI^vh3f+#UBk&+@LX&vJEMBY9;2bk!q4s zyN#vEN<*Xw>q2p{HJ2@(q@I~#OkF36l-MLwQx+Pl9-b*Jfzd@N`UKQy9MFGSt%Of? z1!g@~Ckkq+=R^*^yWz(yd{ec`+a%+GYtpsJCl=ujVOO4n?yQk^ukU zmTAR{;0ZeV^L=zs02TZ41}(JY{RE}$fEV(;UA*Jp<-r4Z9?SAtN+)Ge-(q$Fc8h9I zWvpL{c#3z~i_S+$qkF0RGkq_Zx2y{!Ql->-dSlUS`PPCLsDl-1IeL;T#Vyp~2Wj4>A5KCunL+xC z_6GB)AHIg=_WZ^^c(x!3907lyK;3D{D zU$|}Zr?fCK%)^&pD46mkaQNa&FoN8MFJYdx;XqTQI+>X85uwe}3F z2L+91FoJvX7-$hsCgnPUW84v)3ZRq~A91}xiyHpNQH*13$CaC|&b z6m$gfR7Ybb9Q3ifqQcP0(#K=80p~6L&a4Jcvj#uqQI37ltClszFVF23-)~3!!^qFR z2N^t!06?cn=dW{&<3OMyy&XEOsu%qTf|Y`3LIEXNhyHh_OY`g1bVk3)-o?CL3a)Yu z-@t))Oxj``Pce7IPl%~{zyUAk5$MT0j8B{_4ODsnhbA4S^oM~tfusX-A|A1T1*-yY z%Ov*E5V;Vz!S=9@qkFyi%k{Lw1y)`w$VsGU^AGPg&On^HrvKM*i`DXS@>5Bf!qj^-_+>)jT4o$qcA}pRVPIbo=ho>*f zdFMf9jQ*T1bB#~EGG)$7*Jn;9LxK4W^761ptSWCCx}M-2yhe3RIerN_FsPv%(w4+P zPa~-^`>NP5WQNsSKcXv{*LGv_MH}fUrj>`u0Oy39p3d(nM$2fErxPp1plHqjWL{8N zRr0!IS|;f4+cKjoJueeru`iyP1=?r?ya2+{n1j*0#Jl{Uvf9=;3u5hOKKOWEyhg=wvr-oc`Z!+Wp7KU8$7*gykwNA)P$(W0=v12Z-6Y{8z z{MmsO+LaqO!9TcQO@cBAo0UMfOM;Lp8Ca2qc3#j@-Jx~n1p zUT!YbkXf{&v~jo3NbO4~SM6E+WO`60Md|*XfH6V{u*(S{dD6W(^&#}Dr3`Vxqx3+G zfHA}goatywmh`BL02FXudjYBVWL(PFj5h9sMF+#M-Qp_&TN#B)ekTJXU|nC=iWMa{Bl)0Bj1ZG+cVcT9?IOz|aP z3||5EIKGnSQz^a#fG_%vi~;#g)^a?QkO)vAQEg5K3@MMFZ44zyH9G`g`LYn2ZWcl= zSqN)C3t{D0Nc1Sm(LSsGZBjNA3tY$T{oDHf5NOb~&>pw%XNvUwbV8}VpFSf(y~rPW zXrUnens}>bjrp1kYj@;&A*pQ(_Z?8GLV=5CXs&jdDyv8HNe`9u_n4rvZ=e@!U=I8W z`+F(&Hu|8XzrVr~*Chmz(Tz`p$ne$UAWX*?NA@vVeH~t2`qPJ?D0EhoHBt6y;{8>6 zVPIEhx3jCWyKv&2$`CY3Pdlf0#r6B!Tyah1mT_HoK|3j|%Z@-6snyXuVqJa#9h6p{ zRJxWm)j=`Mj)&%WJ07j;x3s4#1ZR}X1bQ4=Tut4G0eh3wpJ%d23OnZgi+z)VF> zjI3129Bcj$`K*#My+S_sqnm}p&7;%BA`T3{1^2+dcQGH~nOa{V7Ha};>uaV&PWoKN zQhn}Oq{04L*Y-P9Z)6j%AHf^wcroWUnIPkEtOw;(nh?#5>_sP!&&F=R@*aFVMS12~L@kwLRIiL6KO zn>QCGfZ7vS!!l6jodR>ye_D3j7I|GcG;~hlB!}QFF z2=BKmG^C?~i!$)tWB3~~@TG)bOrn=$;Cm7NM#3-6!1s*lG&AsJgkMJdRtAoSob6Fr zH?dwBDUa>t2(F%H)+;5(qFPEn1c*wiU758U!sEqYM#|<*2?;1?C572QAum@rtz){Y zWJb!hx5ET8)kAQ!EXAGxt&v-Zo30Ti4VWtu;_-3_jjv+ftSK6KOFD985}Cc})?4>9 zZ&d&-HDhdK;WtUayiHLQLPQ6lO`EHbTDca33(RFPm8EfS4h)J%YhkQxu1+G+>sZ2T z5&+b-TU>V=1#b5l$uHYMQ`cDtP1AMRuLot@Wvkk1ux1@dOcT2CQaIXmr}rpQF;76d z4zERWZ`bmV1A^Ffh^dciil-V4cBX*u0N7kFgajVF0sQ=?$n;L8-GHA`U?J~9WN`&c z;x{7DpP!r$Z$d!kjrEQSdIN0lF>7FM2Anf+@`}CzniYfkE`?A%2M#Qu-xNopDAT&U zwOUi}2HM>IPIV8MBw05hgmwW|Wh3gQ!`uqA4=~hSs4S>hMmHl}4PXzJ-ewm)US zn6c3S3MOSWMQ1TgLFFxpEAKWCg1{CIr)(SK?FtwAhnBpxWhozKh|t1--%J_W9mK3p zb}%tDfmz6C0DH1j-$Ps;#dt3R!yg0Zn1iC5JCUODjCO3ij;gpzaM{=8JotFG7ebNE zW~5aX6e4P--WgF7$W5B4Q^9y2FgC&r(sc6PaS0s}fSR`%NK)%S7^k3P8Hw7IT~aTq z>)}VO9q8hbjA_&`2F&|eA}z0;>ky|f44G)-@WEbLY}{&RtbM6vCETMn`|36yAdAA> zZnduhO*#=XS@(hY5FpN(skw_| zk)p8=?)1>KJS@L({3A40BS+qRnECEW$b}#m%pb~|djSi~NAQ~x)qE83`ogWGT12+i zp2>drF+9!3@zb53+!1~PfwRpg@#``ADT#iXQ7D@7eIN3{Klj0m?gJPDaxO_M|1!V; zeTJAB$%&MbJa6s?pmJhmL9Pt%!1b~4vw+k)!w2x_$(zsN5q=&&y}p!kWV^|^@C%5i z@r_svR(Ip4e5AEx$C+m zR`t+^;V>r-{vsXL{{ zf)3Ml`3ReS&uy7z7mxH{1or`xgAq34SIL*vX7}%p_O`#wjkA4)r^-NE)o~_zHqjv= zVp-wCq$Ks9_fA94Fc)0Otn3v>QDBCsa0>c#y4 zd_w_Z^_&xm9dSjEWm?a^ibRxpV^7Q?S}diOwO|gBX@wNLXbwsugJ$0(QZcVdM-EFO z=u-BGo%}Z;2?{Mre2igK-3cCM3&PM&A;J}6g?oE$PGJE+=9~sv;X)t#c|o+|=gqf3 zFmJw%U-KRO=zQdr)d*VXMYb|hy0_FOd*S1tCyfw@T~@3*1Z;elj6%^Ce`_^NF3b}E zf|`IwgWcoOKbgSI_ZSw#rB6liZF`hlYNFFD4FhlF=$Ri#zTxYTHV+Kj2Q3?K1|i!m z{@%+$`L7}Sr;y7$&8!6N6N7%}K>Nm^X9yaGJe2ELJZDnZdGjN{;a8r;1LKa>`xcM{ z7wK)6`tKv`{?}&(=Ep#uYB%tMa6jLuTWz=b?u9o|re2eVC+ZH4WXVNY@T>V2Wv zm^hhaDXDE70C<(OqJN-S=FLw)$vnrOE%>qVpCTAOj~@VDz$38mpCR0M5kK92A>5zB z%30Dr(3Jiz*Z4UzL4HjHJcn_|Yw?sn+ZNkBVY?T|nU_GuTAMv@W^umCgyCbtU*I_# zG*>o$iO`0*sA!%4!tR}&V4Rj8!Jv~*^DCfXt;f!Xb)H<4HqzV)=>ng}=`drc+_t&& z&KVrWQaH1e&Mp}o#>V0-&EPPW!hyeIU$V^Mu9|ZLJ7_>_*jmsoN{!#*r)2Y9g>YbghhMZzU2C{4E?)>U!8w!V8v%jG zZR`OL*<#&k4T9(@N7Q^1Bv1-T4G#p^d0K@WOo(;23OSUJ{nh6xn})oO5bKwT zV;&AwPBjw1TzZcvvVsoM{K zkFXnNEyiH%4;oMUqn;u-V)lR$$T48=4KGK1z{E1 zVf=U7-0P92z0J`E)DqCcwmF5IPKa%D3OSPy+vXH&%=Czvp-5?Uw57y~UO)&P<;!caqOgQv!Au!#(;M6{x#{&!m>++X1Q*@fUY zN87vz;fH^PoY$T0hyRJ^no>@NU%{vkGkA>~9<30K>o4uxjgJH}8i1x<0fQ7-unZ-fc)nPv7SaURwYr2j^vfb6;mAj~@)&%s)Y_KPdMX>Sy%@eT7Zj ztp`Qy)?d_(48300NOza%00efxQGT(nIKR6KM>BlD=G7+@Ob!8@bi~{Pebknz{n(NE z5(Eu90l<0cFyPbM0!jJ`l~w(PzCvGc-PxG^lGN3@*Y4pY%;IyssYUP{^1}kM3{$Ub zM62lB23q@wmU^Y|ez<{UL`@b++;8rU#Jt_g%$Y6#Tdx5q7nTq-ICli3@G<7~L%gQM z2i_TAWvUIZ{=^3Cp8Z15Btz9IJ1xfS{(&D(KwiH|4oaJnOeA%X!}zV>%>gm_v+wXw zzWBu*Mk;2ah#`{4tG-MLCm~_>k|o=%9GqHiV5h0%*6f(twp>q8^aE(y?J*NjTLJFX zFtZpedEF)~Bh{LjEE0tMWHBJ&bWZy|N83?kW_7EpDczRssj4x@rhY|B7!<|3gHmPt zW`S? zB=dvC;J!Wek(nb6E|{Qm7tDX8Idah1>nl$9RyGNaa>5~SGgY!=dFUtL1Ju4{;X11I zq*hpQx~ykx9^ZqL@28>KRkdJ}ZLHfWLmB2&z2j6#6iy9c0*VW{e zx4ejz;w5TJ^Li}d_3YMpQOz+g^iP>`E$Ytsp)!Tz2j6aJNNPq(Gr2b|%?t!xY1G~@ zy5RalpI25LDWTOeFPi2zS?T9$3LfNf?&{-8_2O(~!=w{0UE$eQ2h0=8dJNLxESYRYHe0etdjLxDTL!KJp3k2PI$|Fm$6~jw)DNwIbtW_JHc4? zhJsaC0k_tHmWpPIX$ZyQO#cQvJswlcg~PNr-_*tI1cK>D0{Izn<_p9&hEPn^&zS{) zhPRWFhW&6MAcG+`w5<=p97c8IH`##H^h4MwV`fL8+B`T3XWAJW0sThYj$#@p4fKrm z>u~I2Zix4k&~G!PxMo$jD`H-Kf20&Zj%lllgR8^k2!wcRkltBz6`0)_ za|DVur$1LHRaS|cg7BoW9T*a1brf-D4_!i3lnFF<&as^7Z@j%E7D8 zM|N9swfi-GlTH7)I3MfQ=7a9k9iAjB5BlJii?7!J^`M3i~2I z+!Il=m%yT{(OBHx=_gP*_GQ;_nsi%-`r%cqL^$KqxZj4*@TH_A<_(q9>4FJn4wXx_%=SbTR9eNds~nQrhUX((5AQAVx$iotPaRQSUwqd|LaTq^@qiUsc)|hLdqAeM4`0Z_xS6vZemMZ_v_lf zV>CI=`sAQHkX_%_66J&pTj}vratx!N&3kVHefi@6<1Uo0ZTzx12E~Jw_r;)iNONZl zipMYSk3mnf)=B;YF-XQQ1l=8jo)OzvAMOo>Y+%)guVILK3-@7&${F5-F8@db(7PYS zhn)k#VIRS0zJ-M*>rXQ0b(kmd%Zv>t{RS))KBq~72@Yc^oDsz#7u&b^T=!!gGcVzC zb|Gi>gRo|Q{0y1{@GICn|CaYK==A0*KE*VzMKbCh|1fXXZNi{z4g}O&hE*#N=V&#k zC`cp1#2iGN3YuM02px>5IRrob`DJKYd^dFw)Vc0H_;vKfO_q10yI>9l3b@+ZXJdR=uuLt#c1+%5XT&ep8|*H z=q!063}Z)FMlZ#JTu=hMNv?G?q4^dD1biHehxR+;-`7AI$rz9^I|gJ&YiDq5Kl9kg z`DfpwT|@HvuG^|4xSBzC9RpGD4*sOfc^v{X7cdY|!=$zSby>pW*U%)_lH}ddCIP6N z&&8E<6m)}%rYzNEZ7+Bcn0W_Qunuawnt;Ig0%*~~S(2*BA=)KSYnW+x)x-42&UON_M}bJg zO-(T#Lr2e2WFb_fg~XQ!d@AYI+!Qr_NA?#;v&#xl$7h{7#(9?~b4LKJG4VN!iO)&d zq~9b|O|b?ANDT|j9mp0@k7hl~Sj?CEMp1V7B}Lcw^TqI+Yz6YtkJ5Fo++(CRIrYZ< zd04xjR|kRYi|XF+)7F+O;bXwHyyIYsjo)O;3QvYw)5m|Mf4&_;4L~k9?-PK8mU=E9 z@iEN@rKL75K;G6#Owk}{x!@^D@YE!D8iP&dD4S!|-WjQwRY^oV)3oGZ8HsKVaDIs- zHwP#J32qLi`c0Bc&YY1_G-*O|%uGqIR?;LBpGadQ8cv~#ZNEJR6ve#{q7gh>(ss7J6>Z zgw6t%!TW1iQ;9!hEaeZ+V(ZfJ#HJiF^UrUrfr?tB?>CNP@N@}cAQiOENT6uTK)^60 zXn~BY=yMnp;S4N>4WGGPn0aj2IaTthnAdBqFkX)`-)#bVg8g zBb7Or&?%ea6JE7nb$FiKa*|m}W5)PoCnKnVuf;WRg65ZUsjSqB^*K`95ch+)F|`1u zP18Q(q$F!}Pf9S-sy$CxMo|M9S(sEdC#Nz#$c!_zMC2T+fRQ#85ET79#fgBeaFXn9 z0a5g`zTp{An>iCd;iCjdCNz+* zAd)&Ao1oz=62&f-k60Lzw^e+1v7YFBMI^Va zBC^tqMU=XDLdz%~L`B3j69->0UoKfUq&=$Cm+wJdEpy&n0DjRfz%~Y<`MX=lX@JND zJ@bbxPqyG^RWD8_Y0dGZ(wb0CCoso1Ve3{ zCn_)QhiwV~FCWL}sey>9lOj>kLF!l&Nz1(XP(0<2v)FHdY1_Q{n=vS!BtI5|;;Ho4 zW01_7dB`FBB4E1H+8*LM+bl3m>%4t|9u=h7fY-k$@P30Q=7R1lX{z|rwHNbd9ZFuu zp-?_6jf?Qxjd~8>KyYVxF&?sX*CYN~g1vgo6L~*J3)~$juvmt9G<|M(2>?@9g>NLB zaj2&>b#-_t~Rq33skCIAQd)uo7nu5#YybS zF8?UG3}FAZAVuge)))2JSKwF(RFmCA1FL-^OxLB(f_&_ZQ?BOjl z`|KrTU41N}K#P5GA?0Q=Rx~LTyBfWam20;})0316iym(SPaK0~T^KrDfW(hVX&k%d zv$+;AvoFwB!^h`1+<}pi@15bT{2-4YGQ5-b($o$KbHDs9=ob{(uIOV+(f8mfx&t}y z9v7JV)+c&a#i=^)@2XEh>12(D3hV8%B>_;xWX3I!(Vjpq_3@;bY=am3O0Md?W!Sm% zf`YhqY6rQN_W(rLRS-(npQxwm0`qpnSuggLccMPea`olQsI04*8uaDSELUl+LfS_A zyOyD!^|B&M4fh3Yh3zZ!clULV9NpI){Tno*oy;V}M&sD@`qD0GDuKBMeC2L79f;P4 zy2SibsULt5`{oa94wyNl^t1c|t;TJuNZOv(D{_P>ymxYa+D2gwtYGV z!F5bCY&~M|kU9xzFy1NEC$^oBv==t9eX~y(r+rTy+rD#VBTAk$@aMMKz+L;^erIjp zr(ou6#QpR_BIqZ48g(vvC-C{HwS&~X0>n?|Z;YkpZxcyI=Wl_JLh#QnVqHK!jcXxo zYpn#~6HBcN8FW)GqQuv3YNSenev^?JIyY z+yhuQ9u8@rX(G746O_p~2uj^P#6;8$i z-;cv@J(v;xm{uuc8Vzwg{w|o-vLugLh?>B83@l9OI|$tczbT~vLkyZFcsGJ}GfUp0 z;VU)oK)(1zI3#k6u^NXgnPIN^17cmP%=Jk%&o%Ev1h5;@Fu_}`c*EDBS)uqaY}c%| zumFDJS9rA6Aq8z@Ywe2}llH~f`0eX4RHgjc_7#z#t`|2Lbd8GeYRTC)V`a04iq1&9 zw8}`$1JT-tXe4P1WKw2zm4NC2ZOgj?ob2Z7k_QtIXB$llmB_)EUQ98D8jP22E#r>rDDxv>_QI=j1LZjFZvt$z1$K zB;g9f@I@5{M>#MNn(IaHhZ>^OCwptBg%@GCRSIUf-NyoU<fPc4Ta$>6uA?rwju<@hb+ z&$&?%ix8xXuj087<45q%LoDWa*bGS4~MtqXK_4Qx!O#B;TDgSmB8$@zG30)R# zk9;$Ig@scP3-@tIA-2^^lm*RI5B6~Fso>J}^%AhbKin}ET@HhE%VOVvwTq8X_W=91 zHm>`J+7|4pkgipsK@7kOt^;O^e0}prRU_;9aPZuVWoY~vKs5ESH{5y$GU8hdH54y?uUPoC)>@|`WfOU^}v`;2UyeLbIh*e zxW`dw`STmMp~72D@@d@8;AO&cfTH_Nde0h6!mDA%@G|`e{b~*S^W)%(C*PT#9Ib$K z$#2XiCxOvzsJJv%En9o;qIn@O#q|`FxjLzKR=bRZM;}g6BtR$*Wd>Q2KVE`mtZeRp zGO$hf8y4su5}pdtvwaJN$o4JF>c&%FOiU1+)?cA~9YgIPDzHN`YNl-7BfKn#I&TB1 zL>Vmdc3A1Y#^-*x^HsFGviSvmF<265x!4|93FUpDK!*Hk$(9NZO?O-z5$_;<><;J4!L;NWpAl){MdtY(JesHw^&8Dn%jQ`QfU81dL1mU zz5=V=TECigbT4RYWz}oeXrs@?Fi7wtdg}rU#YV)n@gIX8XyX0b?}%WZfMU!i@gvfe z($G&iD8{>wkkHrg(^JF?gm)vLFSA?c^J$>E7uxORkh85ofo(<75Y+_l12#?z9^(}Y zV`+^;aUmAdMNUdo?d4Wk$Z!q~o}K zs3*Q0^UB9@FR@|#cgJzph^~IZtmwP2SdJ%Dv(<4N@sn{JW8;tGE<^*7KYO0yYT=U} zyj=~9S2}oGJTC5-!5f(*3u_WvP@Sv;D%l(Hn*uCluQMksdXa6^4gv{?4@xkiV?FE- zWf$9+t`x3%~9P4JF6 zP3MF3cUbIE|0(mBXzqY}S0|o7`QEj_*-zTQ=fSm<{vd&T^n}-%V7uT8Y&AjD015LT z!(79&OA?cia4i$Q$ONxG0r9niaUADUzofaBaQy#e3H#+#mWESn&Z#*>WTODyK-P_bk`3*g?@ntnLQu2NxW_8QioA ziUsp^CS!h-)JH$|tL9HAMxP~`R7f3}9+~N4MOzz1?T(~2@C^!E8{>JBo+86S7miXu=R) z0g8I7P$VX%*oflGpYuLZtjc)rM^I|2j>oiO24h>F7sVb z@SfWU{(bglazQu+AIq=;JOK>zB!9j~Zl!t!yJp{K5WB=IVPC<1#HVC_Krog16YRH@ zbWadFSTGZT7W=y0e%qEA-j>1sqKB|yANBB|QTk`M) zr9VBb1g)RW;tUkSYy*khcF%*17iAG=4YV@|0vAMi8eNKWf z*fpPdj#s7*sW+%teV!ja1v0o-A$%Io%84iz49?D*e0hKHprjnOrTq}7;WNyKyIrL1 z3FJqFOi4qAP*X|~t7LeWQgG2T;WZ$fu&5>Vct7MhIN{UyF>s)->D#$lDnxrREKN1d z;U_@sDe?_SGD3|M3q`BJ=#$Lx9JxWmTkP|veAf50x|EE_H5h#n$g1D)d7xNtH^nv= zO))P>=80ZXJIH(Au#Qi#ip8@D&JVjX)aQ&>hC=u=&@wObN4!g68{#JHP)7Cx=xW#x zn4eP~u$Q(l3(rHzUp;?`z8}bT#rh?p26mfO@Lvb~!-!ug>B=>02OYpK@Bkk%x`keJ z2;?uAUjitK=_yVX|KirK1r3#1Wo3FnZ{6#HKx_l|fj-s%+x78qN*{k_Sn9M89WobT zRYhQaMRvc&kGkzbbS_iJt;>vZz(9~cM`lc32sV)w@FYa+@3)1NP?Rag!f7Cc9!`4 z3Bo-|@B>NkZV3wA4<^tLG1#Ow-05Z#YCGLbZC1P7ZXjb7^IO`7-(;lr0D9x>Se)SK z-)VbxEG{Glssov2Q2|bHi>!=cD2+*ieY0nX^{XrZUlPNAr>t4AdItp5@i73L*E3DzZTU$7M50w}O7Q3ot%q{v$rA2$Ctco?7RJFw7Z;46ltQypj-5?=6TAi{n0`z8#oifc# z2rPGk&`J_k5{p?$?5x@%*lA`jpYX_}SP?KDDl1O!}e5*Di1d*bTri37%%(Gr>=8Wj)A{S+J zNqBYG3B|^O0{*qVY6y?Mo}x`aOj~lbmsWuFG~wu}RB74%lF~|SZQCa=35;G!F(p9D zko`ulC)$GGt*xGvse1yWl_?1b7_Yh|_Yx-r9TilSrA1)0 zIz>yc4sZK*u>fOdAbHMAl?FP>!$_a;+8Q3=(d8-Pg1D$UF=Lbhj5`rJNT_`bEyANa zQnUo|@HSckT;xhDdG1XKN;fP1VJv+nMGvRw6M!$DW@Q!NLPuZn{4hnI{<`)c)G(Gl zlQQ3lCZKv$8+`%B-M8fVX^K7_e_}R_#bzT(Yui3fOtj-&}iU18FwIQqj@^i>^gmO^+`CE}nqDnVS)rX2ys+Lt`@ z+lWtdV;c@GlVw=OVpTB`w=lt5TieiXyM#x3r6eLiRkvfte1$-)I*vaRwv5?#={T%) zopTDzA?`R}4tK`^bLcw`m?De==IA&LhT^eXlIT1qE#tcgk1kH}6U0w|Ra^f_cy$kFNRsUxDf-mg7!xHhx;I5! zu-Z*jfV(@&k|%9NRQ;G9g}~?wDar)YsG&BoC3iepk!;^jiOmX38ZcwARWcG=rQo%< zW&$&(VhI?}Bqet|j-eUAqi%q(nW`W>`u9|s1hKs%6JR`!kvzE_;s#yAdXQJU)VG$B zJpe+Zu=ZyUZ*Ulyg>cT0g>Z_Jg>Y(RAv3mi16m(svKt!iC}Ji2ql|{4-4b~*6B}_e zF}v9z!`b)^K(*>&aYFHK2G3IUL47DI&t{1{{|ef&V8*iqgyhV>ksY#Poh9#`jOP)G ze=X(zcO;rmF;g&j?bD!zn^V{S3Gq9MmGys?r}+;&_{}1IqNo($8b7@R!;g+b3H;_p z(pe7igYbDa%NdlC{J4jB9-i{&KQWX0E&C!dx)S*se*x9jJCHY>a$B5&`5)%cEP>x- z*!&gvAg}<8P&8rsp8!F1^QpSOA#DCm9JxbnM=)*I3)YdaiHe(f^X4BwTsK647LuN< z0In3dp*N+jDJ;iytc4t%_xSB==vh}+a0$~c$l0P25njgdbqt4f613CF)zrsnqzj1X z`@bmWD1Q1o>s7p^u?UIswuGC3GE1QM)+2c*#N<_|A7CZBQ&+O_!VFik`GQmti{3kv z{7*oi7Me4=fxVkn(~2$MxSn0wU4qSOa}aj6Y3xr@RH;l0{U^o7TPC<32Q7=AM$zqM zyq+UNj?csfU3Z{l6jH|_0Kxitf(4;D7PRC+Eat}?rRLY zB}sKZ`0~{qmlg7tKu$adBMtVrfkgw zr7Kv%!I-t1F+I&asG%s`W6FRgorSH)+V}FGu@3wuL2~P$v-`8tKzT2!=Kam{^u{kX zjA6e?S_Jv=T|uQ>|CM0j zB{sciCxgYpS~7Uw&04$o%9RIeW5NWB?{<1k{D;GoKQ^}6_&EU2bMQ>VAA&jWiT|T1 zIQLZ60ryDyE8YzY>x1jg=X&a=luI~Ly_c6O@TDxgZGjibx>oPo3G5>N!%xXE)=4&u z)Y<~SUaS}4^-H+G3b&P2R&^J0qI2mG?h8h`a)I;+^$u|GisFCw28E-9e~7mfOEsKg z@|IL`;Uq+OWoI9r)#)Od?g#h47q6rQ*zYOf-0Nf@r1rd*gC0m^`Z@LI_&|{M66{N~ zm*5A2+ItS3F}??9+dsi7$nn)k?f1f2@M_R~uJtjd@Xj;z2gAQlQ1QNdDd{I;d_%Zq z%C$b8&gt$7Ps(v7Qe+Msb*5aBw|yh8j=>w+~NLG0RVSW=f(S**|#= z(t8tHTIty5!X+qzPv5=q$Izj)@=_ge@{|kDHe%-N;Jkg&$!7IUjfreHqMcLy`Aq`x zMsXQp;Em!69^oK<;&BEB=-w=m$H!MSpwqdf5T6sou1`44;qm^gvw(N3;0>q}{q>&& zY24o?*agLgZQ%R>K17SGJ@tNjP=oz9`pUgnWAT}b7hlPli@G=KU_Eoey&;@4@m96# z4h^PTMCn=fXX-vt7aPsKY%Odx)A66JWghu(-UTc?Ogq`CY>=v`@55CQ6;Qc7*Fd3oPp4RtjA+KbV;FshDb4SQ=h7b_7r zJ~kHzqa7taHCidpY0(k#q<^017lOj3@Gw#oe=ApJqn>^V-D7Js-s zSsD~xw9j&ME~)k9E73(7faUaemivSHemIp8Y{Ki|`J$fiMAw3E+sW2Dhbep?dphj> zOHhQ_4r#fra1I`3E`GfF6r9k&Mcy!-zD~KwoA@7rTzL}Z$6Q`u2Kei3Fw7?#7+6*wBKclHp@mn4|T zWdtoiEL`Y7tr&!M1ZweIj&^&USS<}V*ZLw#%#FLVnBght!%QP5g3gXXGaLw~&n(t- z2Rb(f&2*siV$f$D==>P;G~B{*1A)IBaDJ4r60*!X2Rj!Qt7e z%Tes(#dZXa+l|qAMP6=x(GM2`aei)~9{7#Ruq)2d!4lD4^XniC4+d29_>B0CoseR7 zW-@&nQbwT9N{g)2m_%aep!BieA(Blqlzi1=gNlYKWTe6f$ z$7gIe#K#$4!AA-3?%Z`}BNhMjg2&l@xC$uhwWn0B#V||GM&PDp!qMPMaNu?fHVu4E zCLf;ok;{j%z{z8<58#oKmt{L;+_G_6n=YG)d)4#p*iCPH&0MM;q}N0 z*Seexj(~V2Yp6xouzitx?Le;+oFwYBkA)!nLc%pHg|zJ)&)s_GP@bH@ckN0w&#QUTKEVsuYis3V ze(^2%PW^UCxEJssp%{~B0&OH*K}m&Xr}y@p=bbBM)K5lTMR$J?U9{h%=5W+DjGYd= zpa8{c*k9vdBM#FZ02+SyI!J0^%W>EjAgMUB65Jea!Kybp8x@T1>BN+y_+W zdC?upd2NO>4{ND6w%3OxVx9MzTR z8?!`ltk-XHkUpl?aaMU7)fDZos>-%_&_*T*D;63B7?3e&qtM>r@m<0 z%@V!<@BE81LKBz1qs=|-?}tFMf;6Ehhj|O;XmB_QM{bLS zkS_$lRrc0*#Zi2j1P;k05OYFFlZ^Rt@0O|UlRHc$=l=j1aSmVKQ@aLI8L^YRIR+fU zCJGPUF!?v2O%kL9X93|nSU^_@;Pk0~M>))~K=A6;;Rj|Fqt^ScMtB4t9G9+O4I<_^ z{D6xNKk(69Ns*d^;yJ$B9&)LjW#xjwmav)mdQz_!u`?_o=E-xu;jPv7!|qi_dw!EM znvt6AdInSOeLi09*j;3 zV*bL2X6JqL7&qm@<0Y)Fp-xN$8qn5m_c5`7qzH--8~WHyB;u%Z}FWRl8Q%o;!hL5)t&L#GV#pGb%o)3 zM4SR&E)RN&up_Jxp))9|UoV=IM1Afn{;q|*iuLjG}V@PA?5aDq2y zvDzWNgw?nYdI@F9%MW8U?oXoHCO1P4_4B##OeDG?HT+a9IuXN#oJ{4kDo%&^vR>9W z1EEXPN$g$hKu5M&84pj!h*AAwcl1us(rj1_-4&dm)T8j=)i`H@TI|`dHyxO>$mwkS z0IQc;rvsqgj&*vo{k^N2>A>x-52TwgdZoL_CvL+(+j<+eR_wmjFvXj_RCS2G2-GVl zR&f^xU#8!(Z;0P?b1Nz6a%?ETdgS(2tkE>)A!93riYufi{!+bn*#2Hfn}D+50caEDKRIecZ&l`AJRT|3IN9WAQ* z7GyE!Q`g+BXCDjT%`p&S3!R(syh!BMETupe(%qIrmmeOFJU#VB&h`B8JNT$#YUnA2 z>duun6{KWivMvKQiI@u@4Xg_U@}M|t@Yq*NNZV6i)>w-?c>TOTU&cNQCYXJlo4WBflQiNBsRrJi$%$cKp34cy z`(s^QV|&bdSAfUGru{1Al8hEJmXuG(M7f~|`^TchbGcb!? z1Y26iC7^CJ`|SWPbZVc7w4IO!hCh0lFRVCuv>)EdtDorhY4YCNA>Sn`-_GO9hr7Sh z^1Wd^`F708Cw<_5Lq4-7RpP|7cVH!Q(k|gkbnjBn)Fl2E&Vc<;U~t7E<%DA%T#rFC zj+@QL9nRv84HlkYuRD91us0Ig$tWI{&FL0|V9vaexzLX3SF!GA`=gxHf*ljJJJj1) zkXPhTg-N><2FKCpIiOCgfBD`7Z}uYfvmC#|9Xg-G`3%;-QC@hEf*TCwLgAk?O(DZP z=+re&niV^ryl!txKePmPWEUzq=6w`--YD&&ZJ3eHWBV>l9_rCaZ3=Ct|2*h7?tyA9 zRo$j#VV|kR#%tb7sXoQAyqIijLYoR0=CS>?J=V|I8nnT5hVMmA-fqSh2yyg4=GAWf zn(gr0zUN)aGL=D&M|8UD$MJ;2WeAF+>G6wF+B`2J3gjK&U9G*mAH~x|HM>uNZ^~Xe zi`tYisJfl)-Dum=tV_#!Ad5X-BrUtwgT$0+F*Y!IGC~zc z=B7DQv0ZHy2Nvi^gv&&~*wv{+zGa)y>+r5-><#vJF58HRm%}1eTwdvpl!fd; z$QhUx1oSw96j(7=R7egV>ow~$X(cc!D$MT-oJ4)Nx*4z3J9nui#>FaFtXY0C?(~f> zdnVvT%IkHi#=7eV;B9Pigj{Ur?&B+zd=kDW+@J3RzDSSjr@QsI5?}nj7w4zC^|)M5 zUr$^xEMj6J#^Z8niFo}q9e97<$NTE)!V7S5Qt~e6#6>mRdq5H6>=JLT#_24fh%~WI zYbUF^X$$n^qKTjXSNaUq_;LlfcpGn{53fWnn3DGyR5ixR9!~3I&i%X@u$0Aqjs~a8XDZhu zZ`lFK{Tlm1t`_Ce^^*tC{L34+gRaf3sHP7v zsmZ&`dgmtQa$JYA3vg(l@K`t}nFBl2kZcKdgsZ2ZITI=$o-*2dfmga}Y?z>>vm+P;gttR2ci4z0f8v z7h1U{!g*aH_HxaA5HVLm8NKy`aJ|%9Sreeq+?PnFqqe1*WVLM=BZ>Wx9yGDmgVQValnQp5(IpUSOIMei)dD| z-U~TbwBr*n4*vUTpupcdg}>6qD{@+#RZy;u+=1TbYKYjl20uNy=4+6FPLa!pg<@kP zq3A+S5PH6@>$v&mbno>SdlOMi@0cfM!=zFlXW&q8cmd`h*Ma~La3@QytXkobAE?`Y zD_HM_K(%mRE_NyNNAzI!$Q*sz{iFU=Os~DgHiXXC`n_C5>DwlPHN&wS-TAmv)tdU03#bo=%2_a`;yJjMy2O@m8=sMF z@|jTV!Z$B_CwDY)z$L#q&GG9m$FYb(4Lp$jZbYBAWFPe>K1R@c+@JWC>wX$AQ*8ZOZ&&e$d`(VpHZIg_43O{)_c~iyRB-Zz z68XeaCH#ssD_zsxE3v8TQB_bkCK0^bjybgs^Np_}!$ww%UY=Z@jRC z70-)wjcH1DjVT{KMAq?~=!LB>GO-VH;=-D6NFJ7vOoLZA2Y>7S_|Vh5ALC z;T)_1?>&HW_>CKpxAhFtG0Xc4AMtk+e<&>UV~JFP{ca*@+2HSzAlA(s6iZ<)_{Svp zuSxLVlHk85!9OLzKQq`Q&-lxWjKp7FWJJEaSS=-=UZh;|=|xHP(xe#DXz+vfT&&F@my3~%{H$SIfO55J zoiW*?ccO?Ljs{P+6J--cWxqf;23EM#5kD{y3;zY-uO<9sh5rZe@ufg=vF-10wB`=+ zBl3+qILO^G?6?jX(ZMKH+1!F)_?Tpu%ZS47Ff170{2N5lpMt{pU&6xXGvp=Ur8tWh^#L}qcWfqAz!BnWMJ6W1jW{<<0Tr|z>V68O~T$oWlpC4Pw^mD6FW2$?68ZX6@aC0qd72|E# z^ts*0$Ul2uDUM;Gk2wyKwSFu?tW1_#&n3a1O7IX+XbD-puKsy}!ct2u_K)@pDeN~b zF^nY<6k=PF;4c!~UnRj`O7M0v{<#DXC0&}hy{wAHXD`S9S%N^*_M0q#yP1h4aA6j~ zg;@p{rsOV6AzheKx-i9bVM^q}WNyRmJ1}HF=)P+!vdn?-ep5u5iy-PW1s0AeaQvlH z;DGkClYr>eTGV zYYB_ql43|e4L_cIO*iw_K9k~)*Gk5lnQ?|nDx8$5RD@-k0!y8wz_C_{)20=IqRlC} z2-u2TlHHYEc&ixFm@GenV}6XZ@gpd@KgEv#<@Zp#t|hzUMh*%9Xra^f8g)lO&xLeW~sa}-56^*dy_bIZ1bW*jFp{ZnS znI+5Qg^9Tl03|#hD`7}W!Xn1Z8L9SWnG+U`kdkd;g4E8O!1zNIlI6e@a{|Epr|rz8 z-K(m_(OBanxV_;K7M+k1gMh6VIFsVXa-W!lKa> z9|B@qlhpE}#Lx)DnN)@YOUqXV@U<%CMH4PrB9ngVJB&}FtM?>Uon+5@* zSh?FT(>j^tE(>om65rq=RQ5@gfC42q*+?wDX^pWV++V#U34j1U zk8ACB827-@vdtyBkQO)xj?0eV=c*4Qc&MBai=fPfdjx3JOky=orPrR8WREpLytrzF z$}=f3Ik-y1kyuK?b5j5n(UN_JL>`H8M6F7sAg zlI%S`mXu2*8e6V=wOn!PD=(Lw5Q|2zFN-_>&%p1z|8co^%md|`0qwDsmvxfuBBxLr zT(%ff&bYeYo~_@jZT)gSx*M`yrS(gbfs(Q4Jc9KE+27+yhn(?I-MrnG-wt`DCwIapyj|)13s5R{+0AcqHN(6Y6m$(USvb%;Z&C)~0HU`6DU~i#$hKiGKN7qM zP%+38+k9YN+!6bGvYtc;3V@hGgrGGK?f3rSYqqf+wXkl!=FF1qCwk!Xo)HZ+o= zTSti-NYOPA<)ihSD&?IoS4wRkj>%?7hI^uCps{*uyaiXumFftWI!?QQP;KwCQIA(k zJ&vuqSTeH)0>c;tAT?FrE#0((WJw)rV!;bia2PSpu*YNq^FGRiBZ#Z#!k=(A5E%Dc z43RhG9bV2nc1o!mT*(Dr)d7Q;GI+;EW7}lxYQDN{SECtKBvotN-ahH={qO2mur3y- zaZlh_DwTiMj6cBArets>iWTAjTWjTR$z7JTbvPndHX{efC5p80m@1QoTnLWfvGG#G;yiRSv)^1hNr~1h&J#oFJ|WAFHwpTHJO~ zF`$3$lkDi^*6*>);;cKWf`zg{U9;81^r9^~$#5sJK5S$DCwO6h>2G+@kGlOO=!WMV zm|EhODII*4!ijF-o!*j>eBxTv=nU?JGkfQAJFgtd6WI101k)0l9jJIr( zmkm<{SZpD{GRig)3nZDzFPj-!`!6S%sY-pyho?WppoEU5+G(fxiido&$rw(rj4s z$_6H2B})!+2i{UZvF`+1%;`1jPrw58#6b8F@Gt4U#I!D)cO3{n3P{d;48P_sn%D5- zuwk(!^Kk&hGsv3 zSgIGNmFoE+HaEZNgC}>u>A`rT0%;uz&qFK;JE zxn>_}&OkQU?*w4vnv)6n1DgW-6}=1M`hHuZW!u}i4+=X3ay#<#~3=ZPg4H7rPOy7B90clC8P%8-cXQkdykm#MsQ3Dlwo z0~u;j0gCfmhod(nwEB^P?54s}N`oaJk93KsLG&X%dZp!Qv$iAX_3_~TnYdGA5!`d!Q`w-Tc6 zB%gfYtUp-x5$YTr&{|1AmR0O!%%QtKwrrj%KZEEdoMn&*L?UHcg9HD+Kplp zQlZk;7DV5JIc#7vif_Q$gcpNorntp|%1q7*wb-~Z5Mr|yPiDV~F6YJAPIKNYSO;1Y z{2*^#3v$vbaMbiBG|WJc3hA+Xycnjr^X79bhWI>R`m&puA7_?Eyl50{B-jXm-js+V zU}2&c>=5S*J@qb35LT7&g7FhY?UyRC?OXZqj%aBeZB>e#;{18x%=zib$a4$%TCrqx zBKd~9WDdlT<0GeJ|G)ALcedAl@b3`4%KsF*{cjl4R8X_kohAW z>M#m6u_JsCIOdB|F#2hx=Qx4}Lbk85NZNmOga5n9Kl~E13g2U-U)dhDnCfbVQBxm7 z-#r^-{l)+iTXPwl(hB*=g};#w+7E}3BtG6x<_@Vnd*;`10r%_~)Aq;Gg;*h=-{-#Z z{V1>e*^dTIAs79AP+5XlcPO={CBf-Qa7GfGnFMPRoQ&q$8j|4cq)?F{s=w5#CeT3% zqHap9sS*@!vm`i)(Crc^UR89Gp|e8pFd}Tvpxd;i@a=2MghlWh@e(%y)dSkrb_Lk& zwlE}5&tl}!zO_kJ3{}s{tc((txs{)Q>RD}s1vtqOmOP{EA1q-Jze)8*cq?|TIUHp| zeGyO%WptF`DTsFxaZnMH{1x-MBySBzG1A8gjXj!A%)U;q-51a0EApNzL2!X z=&eMzY9s(^yc2vfY81rZj**bySVGBrNt+G@*zd#>GCeyb;t>Gxa5{cG9kPu?^N4Q6 zBS3XHMnb{8iny7ICODRmk!rhy0vvD>3Yqt(BqRV5E+1b)Hr?p+DG3RH0-tYJpdc>a zxm`ShWAPZNJ%F5TIux2yoPd`jTWLhp|EPWqM)1sU}KLbQLLC z^-7LaZCg!(wev3Rk`o+D&PeT7V;f&PK z$+x!`!egToLb+v$$_aqVcaBwV-8MVUMCEE9ghfX)vlUm6R#jJIszIFe!`MHUSWJw^-PtFf>2|X4l?s%!EZ>O9@LrZ58#Cl~)jV+_ha^ zf@66ZsUF_uhy+-5!U~ytQe86v5Ef?#vyO;^kD)dh2+Mr-ih$~hw$>xSnqw$=j-cG? z`RpU^;`5@&zy+86Gz;!P2CW^$b58L6zxzColIP_sF=P zcfMj3rzr)hbANKTd}lmOPga&ouA zoK)Q`hki>~zm&qVK4qy#_PwxDxgFjD)JawfBS_acZue6i`%O;9)IP@2lXX$98}U+H zy=-lXwHWU4<>bCh%!Ig>Nl_X_Ovm5`!-ruu=0IBJLHNPu3x2WQY90YxuNZ@vc)K}m z$thW-G?mpV*7&y_Ia}!Ujyx&3Tj`CcW7u&lPwf@RgDau7(VieDE}oMSQh9EVXtikN z8t)P&@K+n{_12uJa@`N*NZ-~JcZ2zLNl&T!)fIjMTYMRXv}^&zf|B^WEEMn9h;Ph7 z@m7ua&=iykhz->?Z5pr`q~DY-0Dhz-i$%jPgDqVMiR&UH^uhhngYo1a)}cmVhgg-G zua5Jc^&vWY52hS_;38m<@gd!4QK0l&Hztl^3xGCVOR<4nj6P2r)DO zUib)MU&9af@5v(kCW!P*##IxKAWhzfzf;4?l)BBG)qp}1k7BDjzn zDlV02Pk7){;L&>z_XX2T%StUR%FI$*w9?A0-O@^p%B;-F$}ih&Q_ITAFaEzXb0547 z#icLme;?er_spC*bLPx)=gyonBTM)kiJ?1mVpnBF7rzXVucU30iQ$>lJE)5hl=lp* zd|{cxe>R#KgezUbvFwL0@P*Hx`e9WPeY@J5Fq8ckENn2B+Ca7KY zI$(^%q54yeLy!|r3yDK~RO1lji9=mnH4Z^eIB0&v4^_fy9Dz!IpL`J zqJFd*haiDdkIpS)_X;{n{CiY06brb8k`EnmMyK&aM8qE?e|`M>xcOQR3Bb8|#D4%U z-AtN zLRG`&s?w+UGNx`OVK_=(_a2F zJnA!lhXgF2R1?743H!dN{um!P_5>eMFK=N*0HHS=)V+t^4167O-4h~#T6(vO1`32(4)rTbSm~p7zqiV(h!W~P( zrKJ(|^iOqqh9X2-RttHnUR1T*yr^cnc~RPKUNR?=mP5^4elubW!!Z2EXQM8jn!Gxr z5U0*4pu*|s+#bO_zPs@C_#Lol`&g&F9}b*tN zc#P4%^cqiI^p23X=$(O228T{#8l-8t8N8KF1-|1%4cd`$98qka;KaU@ zu`oW;!klv!e=T9l_mU#^44NeR8mHI_?Or3dibd>T8KRfQx!B#w3A2hAeV4BVziWt= zPxC~vA(DT10937fgtBlX+KhUtY5+F26lWBMpsp!mCqnF{(p}x-#2$p);T+1(AQ~Ts zDx@Ugn}8kSgfXTTW4{wpaelUXzZ0mcptBVbYurDn3(K10&_7Vd zkNtI2Yh-*RI?S$Vn2lL3>?2A==|B+X%I#yTB4Dx;y@n%{qDuiu9aVZS-|r$Hk`4%C zr9O-)Gz>oq0v3D-`L}ML?2uAGmEc0KSFLaS1e8r6y+{x(NR@|=tf_Lp8Z;mF0Hvb} zw|@Ips%|lf7FF9*wAgs`lip6c*>9agH=C^8h}Qt@_9xhdo&&7r9kvR7tV>U+pH1@z zcJPC`LFc=iA&GvDh!~hrGt^t4ET|8V3V>9>^%h77-z^CN_;g8wsKxGpP^<2OCL?+q z%tZKGz7T@0_VATm4o(%aP;{N|Y>L~S zf_LVNzLcu=dZ9dGD5HiekMjl%AmJv8H81pfv8tXd}(!LDkHb>Ca&Qw z<=dorj5BSQFr0f@9hPXlHWYeRRFA9ltf~c~I+)OPr7?Od(0oYHw0%eQ1Mk@x$YFq-+5{CG zEP{b0*+|iGW9qxnfVl`cw@Ke&vG9MGXzcG2i)!CEmCaf&=0G6=e>-$ zk07oi08?C}NcFTAGLL7>I?F9poi^#jfYE<;ZyAm$Q}5yF6mC0CsF@O#MiTN}BKByF zpN(vyQ@#eNiCv%ZcI~0U{(2{K9r#BueYLR;HfNlj0g|+J`lFD{>^=lghUmR(Mt(L3 zc`EU9kOGQAy!6FheTwaRcv((>D|#P@R~lAfu#a@O(=L@XiV)1nGe!{|o2eUw8e)Av zlsr6q{Tzi-T_%YvHrp{?;o?EQKgGTz9Sn+PDN>@(PSH0}*|!F-8;MuNb`oLes`c?0 zDB;V=`^2^!7a3S!xTEY9kq)GQIw^LDw8?VEL7hKRCfhj`_-9T`-Ri1{;j^!x(DShvMh!&#?>)ETz_5ldbA$xXGAjvL?h7*>Ww`Li2=#m{BIH&1@-7>y(&8e+e-erG@rVt0}G6 zRBE>x3ln0pOD7bXa|fEH=U672iqj@^>t^hd+ofyAl;qB)r0yv#JrgS}wwsGgj?_n( z>=??4H$J{y*(4P|!;)vpv=k){HWf`US<~%yt9e4H-DFFMkqDQ7wR|6!F@`^g{5k_UZzgT7+%jsMAAdgl*+-gEbZd4_eZzy9ONkP(GjGPXXvZCLvrJ04y; z;Mq?nAK2YA_}Ooszb)=m^aCS&Muk7@*L2vEK~KE1J^1IjD@g2(!;eH#HD}D(GdlvVO zxQ4@TKf>q0@4vX9v&+6lJQ{bdhyQr^4aajK{2~F1SHkbGPwEcy|7)G^lxR-jL1{Sj;iGG+i>5gY*{ z5Ih4^?sG>Ng!siceXtbw0w837uUO|K27!xQ1QrSkMm7OYCiWCqZ{&$K89{k$D+0rv z1BW1f5rVcOAjUah1kyI*e4ZR6;$ZbHccdI-&WP<82Y`YZOiqMs-Ud=@XG#tv%8ym# zBnxa?K>r|6dr%IF;b8*zeUMo@{wVO=GCxEq)f`=lN9McKfby&v)w4XOBElfaB^5H2 z0%g^XXJRe`ZV?1-0m~Nb@_%k-!~Jj~_4yEVX8#F9?s-0uJu~zaNDQx;grgqhpd6+l zo3+hWHeMiS;jAXI&YAljBr?yRGtVp@2cg75l+pxInL5^@RF+^evx#dIXV%&VqE)yC zdnVf+NKVOisztJU5XC83isGEC2~#Uh$x^UqvIRiuWWkQ(=htX_@EO(2Gn#Yq_X8!) z6UCE-wLt96&@C|-hg8y?eu3yiS=J?cjn*T&&DED&O|Naj@ttBUEH#ZE&kV!>O}7W= zc)EA?hPl3*FTrbAu-U+sta#-UGxesL^XwD#6HVrViI{RQ2oBN1FuDTzc<|^$`B6tA zi8a31QQetet{gCBWd;_FH`{20HMF>JdO)tFsKjVB(fi+EH%+tCgKu$Z5#0mxjCNBF z#z-PG*H~yO&NEu|MdOQ&MJE5E@d!3%VFVXiG``ek8fi0GhfXnBt>!!vhUxSJcLrVq zd)4VitHN;QKSyPzmDkWAr8FGtXR#I;1MV)47|bPi8kCWh>8r|Kl^jwq7$_mS{D`y<;d^JzAqIS1 zu;8Ncg=U+5gb5{Pv|Fq$B^jDqYO`C4)bZR9lu!T)3KFQHi0T)Omkb(<3$pO7M>UBX zxIs@T@dWNKvP&%bkPvED3@v~eg4%2I}^me5ev7M5FTwVH}^r&oK0mY6W$FSb|v z1eREAX1jTcX@t3;II!4MfZ?eGA|<^{Q?9wlSXh<$aOY$k5{Yz8%HiF};q6W&$PqAN zdeH<+VVJSlX3kK#m0o_u#$x#t>EIBp!CY*%PglJiyt;ZfRCDN_VuVZ19Sqi2eI>~t zK!eSNg(e9G77JNqnhVT!n^UuE;360q9O1~2ny&P1=yjA}Q zN!iUeQf1POh{M|rJ6y$fVI(wugANd@eX>tdl^sEi>VTf+KK(j4KtCeoM}+iP>SDZ=9-qQY z`K)ZSA69L|kGd7Q96xG~jvx7p=E*n@CYA{>P@fS@yjMY?M2zyF$5J2TN%|&q>!@!^ zw@!NK7&D%%$MO~9o%PM=)*@5P|qWzyU+)$KeV{yLCqIUl|ss24FGet=S{d6L_CiqC=%jPsfgzYYX?5G!Tf8EaYDASz@*K*x~Oz%vp5&74yVaZlbxp)MBV;Kcm``#b$b9SWf ziXFGaJRZ&a!EQ+W-i1qgv1~1 z^Wje#Gq6-=b8!s>&hxk$!=L5{OE5q4H_QvVsIWS;Ni)EoiwZ6&oH{Ge&cGyQEfi?K z!K_M+3bfxL&?R+;hT{(iaG4AAra-GeSHK0y+k{~~Ak}ih&>yHhj8LAXS)(bKnL0mR zz(7i==IG9IQ;z^Op=MOixv7na(Afx;y^y$?B0DqG0-7W3YC`m6swL1jX)Kw zc}MkR?J-2qW{susjQC!FcAbDMJ)N=)cxG z1I4bIu)HcOBc}KTV=%zFVgvwM98OFOIwJgFO)CuOLP8`QkC$-}aN`jcgR3_#SdhWR zkN8l3ge_x`N16C%Wo7h)3x9anxpOD(0l2xbR0_9umoCwxC+U(LJYnH^0nT4sEvm>< zJ*RpcgUeCR%kb>@U8;JX@Ah*S38aWBcwgo3D8An+e{;HTP~lDTj`AzNul&B>aVHv7 zRixzIDZ0Xr{9NcgAOqqNO}5HjL^F2Kj2%?770uWI<{z4|gTt)B#m1n@sKL!np~~OQ zP(fR4(-zwti){^DEFJphnbFKNO9yoe1#QhpTQmBntr^wr`3rpQx({;ekWqArm2hv%L^M0Wr*UkZFYUB3k%DyEbj`#+Ig$~ySd&$0j0arj|tK$d_`99#0U z1-MoqjuC!j>q2%e_W_62wtqnw4hj&qF71I+4>-FKHVMy%VM_5gtZScj`I^?ZW1Tlv za;%{J&-Q;JQHDWSmIgd5sO+fGISlP_P3g=X4Go0Tt;vm?rv^zTqXNi%iOVZiVJ(m-| zCHojhq>)%HK0g*0k$p_f(Vf{NbC-mgQ9W5}g9sO~KD-;zYq>sbB=v~%Ss%_tgr0V^ zhzVF-m;1Y&uL=Ndh}-V$B%GypFVK_Dj_xVJ`w*#akB+#u!;`kdlV)M0?eL`S@PwV8 zv_%hX(ZjLm5k~7As)>3V?eFblQcZ2@3azQaUM>=7-XDaDn!M?Ppeneu%tvrht-yX=RR!ZV_F~d7SVY@WCpDddPDMD2AKuaI{k*#4!Y0|y1*G8+D2>I zMr+zeYuYjhMl9Mv7wSP5O$S+u3x<~#7vt-5C=M@C54*6H6dI>%HXxV42IQYQzx7Y$ z`+6v&*ZJ>SY^|Yv*Iv5sTG}hVrf*y4J>nhbsyd&kO8dh*pQYLqbEY+Y^U}WXJrVBs z_FWH{zJKq*lpTHlevUiM+tL2=^ey}o_JPvAgWdOqC%x8l>dDf_axK4uKLF}Q>&ud?J`iTAujumZ4y06YV7P%h3>ezJ4eKU6F&-*PPaY>F9-3CGzum}AJ z=*6C65Bd{8sns6zKLSykfA|Zw?9uj~(Dt6t_MRxII(<{ydqUfL!s)C{?VwEzbuaRu z&Bnt`bgr_?4iuU;rlyUlX=7T=6H4tS8$Khwp50!zN4$&`;~3sLKMxb9&BK@{T)KIf zUN?O`kLF>TeS6EY!5@6J%%KOCv8lnj1wDUwUJ4`*{rh zKj2Q=dUnKh9Pw|!o#uhA!aW3VCcc%m`5^cCpk1|@4|=8c^FjN7+K*;OO4xLk3GE0n z>ojAl=D~O_W~D3(KC~o9YNTU}-`vSn7j`mRN7mNdKf-S?5#lX#F7s+9P`e z+!-i<{{XF-CpG7c-2n6FI8PMM4Bbd}(w>OkcA1ZZ-E!w*6p0;kx232MwatBNM2zzu z(KY|OYC?3Ez$-wE@kY^E24*P1wf2VODTT>EjrWG?O%4VaFL!lCCKGK_E$V?kqQ-iU z>dg5=Kyzcqk%A}hj}SZ306PPPQ;g!Fc2igjcKTr(dK@B2b=WhiYtbC78P&aTz5r^h zcdE{rT#UVIhZj%k{mLR)za9a35}!DQ`cv1${W+QgaTdu`gcuAJGob`(xXV^O1 z&(@@4OzTvnU;OU0Ho3#FPDJO?I-f&J_4Qp`wB|(T%-VtT7@n8lqBCe|eTmMNrSod( zeA($(WBMD`k6d(D7CtJR!mg5@9m(90WmjQ3%zw#LWiq8|HUxXXN?JH^hv)Jb~S!A0W>%{F_Ls(xV6 zc(ZM|w#KKe@o8&(#ktdceSMwQ_vleGUSJo!#uqliWVd7E1a<%DK1Q4ApRv}b&DP?T z@$cMIbs97w>%87QG(WZd4=$bFeNB5GIP1;RT;xfJ-Jt`IN3VPNkuLiNjJf`Xc}ABV z0BQQIm=!=nSDycq0lxm;^Swv~{hZT@uhm{pos`S93A4Xo!b~$;*R(seFF)>kw&)*hzipJzEkN>Kty~y@ldphWeceV#BKk$&yk5e1azGMRu8n>dc z`hETP_aNPYelO+>eeuMJt8!M38Ao~qA3oe^R&SJDO=Ef5qbwKt0#D$|1s>U|F2SA7 z_U!>b+OsUnhq2G#NBRYEc&0J`VTAd?kIwm}{mWj&Guf^#!E+`?s@nH}yWJ`s<$KQW zfwyY^JwRKYU4(jp*g3p*>IHP5?|G>glp;ds0%4F>D$cOAuxZd*IkypO7z|D0yhn63 z%%kIcy&}4sDYt>TPMB#mPQ`q4;t2B$6Z&OVZ>l-ZK2bl>WG7=K5e;rcV&;#`=?!jER!u0{Yr6d!1Wg0A&c{#KXkD= za%^dT9_PM3jD(Zy*g}dnk;=iIVbocBDq45?V)L6b zx}y=)wC?m0!szTAT7SyK{c6Cp_C)JWwB|%>O|;JR1N>=yX#p-;U$Oyr0N$79{eE!K z7W+4z7yJKgedz+$RcLkT9P27#U8y$fDzvWD-P=BnwOL^qf(0J0n?TCQu4^sdo(RI* zDVVUYsnKq+YKQD-dr>;ss%ds==xZ+WkezVsLOH>dr>)6YCYy@WCUooe|71<3?he?r z`TBqRd_9%04&V1%Fi5KN^Y!3S{Ah9;|HSinOzzcrz9C;m*IaeRaF;APIxdOtcc>&)K`u6mbFX3vREZ+?Txsn+(^Venb^_8S4W=?;ue!M+z#N+r_p2mms)qEjesjOPhfHfc2 zUOta+;fMH0zL_89M!t>b^NxHJ@4zE@Yd(di@Lc%k@$I~VFNP~(-AC!{<#YIxh&h~Z z;-Bz|{Aqra&)_ff&w#U=zsT+UA^sMh4(ifh;s`3rs&eqHa{3;>f^SgMmYB!*QvL?g z&gPSN5|0J{Ha>(GaOp2`Bu_Fo2Ujv>JAakWLLS~ntjGALd@_HQf5~rz9KPrG^Y=ip zh~I#mwc&|;C{Km#zu@=qH&q;ozXupkDceEq9{vtDLw+)MpK=R-4w$!rtK@OCJnwmeYCAxP8!!jst2ZO4On3*a?D&7Q`m@@eatvXWng zx-^n^Mo1#!ha;wRF38WWuLNEKUZ0+ z>q zNO1?QSqPn_tZGD&jo*UMC48x}DuOAw;At$}NlGEE zd}Y3p8_1NI=s!mDYf+PvcqV@ZQtOZM?~anI;62dqys18SgG~4Ft5J3qV(35uo=Uqg5u*g`D;C#Rh z_#VJD46+yoY3#y9t=gij67ejM+P#P|102WkThWuWKq=e|>TS>_{E(A4_$)-O;`x32 z5fw+~W|be+v?AoDM7dsBuH38Kk83%et?=1LwGMr14$lQIVZ0%7H3TJk2(8Y{KSw(% zLQ5QtUf~n8!NxoVSR;^Qlc=Ky)!Nelt+;_mH4g6z9qru0eR%+`sVL*Aycqptv6?$s zMzUT}JwK?{t5|MDe<;gG=At#q<$mOj^5~DNE!xx)9S0e##8r<6^LnTUKFFaDu+z}Tq@g$d6qhVXSsz6kQsYlXZ+JKQ#;JI( zwZiji^d=k8*CyZ{_%!#|wTHYC(Qk(9M!R#+#=N12Lz?Lid`|IcCJu1DlaMT z|r$12fcVdwERzy_AO|2 zw{ksNwH{^K9Go|IDaCB`D%mdil%<%5mi7{A?el26<00+$c^BP#;KhhksXS%P4Fsq3 zPMiS=jo{1qYC&l&dhcs=^Y|j&a(<6)CBMt5U6!E7l(ls-YRl882fdJA*;A&XzOK@t z-szc6LG9~-T-?X|qJD&BKw5x*%S;0R>EzE?3 zGEv@bQE%F!d|t#wQ+Bj>A}de>Zp$=+x-T3tEfC!=hchjMHEWe z5B+c}*`p~3(esw!T{u|x2;Z$+%5Z7HTnXPYgzi_mDAZRrz?-xQTH+K?9*7qF zh^UQ`Xq6lo`+@0rcgUQTL*`q--Cn!{ve6btsx7iB%C;+Vjvfkedx>{PCf@%>aMuLf zwE*p0@OL9hMD{DP?Zt_AV0}ouJ5p|hoHPb*OJybAg!DGgRt76Wm0`HD0nyuh0qS2p zlyWd{q$8TU(3|8z#_dI2Z3Q|{L8?vp7{UTC3##7Z@*ODi5sdyX7@Td#CEtqjIfUPd zx?{k*lj62T{y$ZkAy?7JgC4SKgg&YjdQPfeeNjg;(B=bB8c7I^1TBH748mAMjFa>w zXl)oJVKfkd~Gm@$aq7$M32zbD_J z!-cVighhQ*Zc^~2q}&R*Y*UiJT~kOAafj5P{^vaUB*UFbYQ1Hp^S2kfQHpDGh={P(3*^+&CPu&u`_B}tt`lWYm ze)#j1w>0OVKjs4t>4{ymFyMHU4B~9l@@4Vs1m#=@U)2_FClzm+XudZ1C`+qBD zoKAZ4)E~#+O!~=wfPdfqkbUsrLs5S`et6DjBab@l^6!u9|8>WluoM3YY<^+g+4juXM74y`1rSI-Yjs*d+GHZHv3ntZW!`f{wpENZoWOVf6pnA*FJePl5F>{ zpZ$2FQ&|V1Li-(Sk@RwA>|1lz#J>CN-EDGu*)AiUs(VK5?fgy0W1WAxA+URL~2fkQo zH4a@lo%Rg){NR+?e_$eu^tVXwssh(BSe)OCdOZ<~Y;DjSgJGWQ*dJ^e^gT{P`Q#CV z&BWUIbFj%R3_)c4p2L!QGN!)h%Sxjm~K;1icU7zX)lsK-^DpeTJ~H;9)G{ z-wnRM03N9fT#oxH;2uSs$BT55#>MR}g6ZgnKe@ zx+6RYbnb$Fqo&{HzJJ0?klZ=5Sq+Fg6H~4J@8}2L(C?JpOD1oS9n- zR8-so8H8j;=g-so`fxSA+C zXPJ%&Z&wqdXLjkJ@PwMsz3IKtap41U-Re`H3zQcfA&&FpT`OnJ#9ZaK>wF@+%ae{8 z?_ArIo#ji%kBePNoZC}PEPKkEUJa?WP1l?J>6mhl^r?;(ppKrqhSE{x?cCFMj_xXB zIYZ95=SKQ|%gTv}kE(X}?Id*=2!MD3X?ST*8BmyRd*V}&x2 zjeKON6d`smioih)M2)B1)w8-)Z2tDgD7Gtq-w$&+99L~c2u=OZY`7pedrrT;E&gZVr<`qTSg^IOoI{JM|@<9o@6I z{1B<14eU{s%taNaR-1vkT;0!_;YYd$=V}TMf>hVql5*__GjMWrEu*>@a$iL4RJ&B2 zg>?+ky4Nn6r_jDd;f+MSAJ2UPV%~(`*kSC)7KxkHt;7!aA1EmvH zWBO949#x#H8gD=}n5TM1bIn`-W?s?U^OyxR@aay?Ij`RX1vV<~D4uyf4#d`;h~DzP zq&a$FXH>^4|6IAh6%k#SsgCHH|MoF8Ai7JS0}x}pvEnR)w}Ir6HAk|ZQg{cbFczv7 zmjl(C97&~qqwI>X%7 z-*!}>wg;W5DACn=C`UEEYNe_bx`qxBHZY``X%t6^wegAtHA8W(ST&ya!>=;bBgYJ! zOpv%ArYbdir+pBDFv;@4j4Z2NF`&O>A%63*x@R+3nQUV2!yvbRe zX0J{&SI0N5soS#qM~oorcnR0_J^QpWPVQ_<>YgI(eJ=P@OKZp4-kYOLRvSitX`K?2 z=r18ALv9I?R%|M@TaASYG1;XP3eC9#P1AEOsiASUFs1w_eC=y}^+k0v+BopvdMaz( zet&57?!xPxHop4zkFT`$p|y{{ckrjZKQK#wfnRTRTXx#}C!P=C5i#F|p3K57^En{R8Y}GcZ~s4Ghg*_TpxY|CfilVBfoj z544!~MZnQ{$%DSVf$VdqhsP{lA3kjHs$Z{LoRay&t;=#AyPfQE$A0nbor_+5<4!v3 z`sn7g`yMJWt}pyK_i?hx4H;3m#eVRsEo77X+vM+sU2c2xH7_pT_g#f`cl}R4J~^?< z?smq1Hhk4I_}Op9-eEd^)y+*$Zh!2=sVO1%|K>Mt*KYw=uKQ#3k&rWFi#sa(VZR@S zzv%C_GkA;ot9@OKLsLBrlZi#0)z2ord2s;A5j1hK(6m2V7|ge-ZSWAZ{Mg zCi_^jX`Kxkbgsf6#Iqs}*}%RCoQt^vzZ!VIAgy6AYtigi-R)QDXzz2{uf7eWTH3GD0p7h$ zu)TB`iIN?I!%C)4Ev;k@fe5T*&Q8Qxf0mB+hLz0OBY5i4PDQi}vXTi$J@;z-;%+5F z2Qqj?bXOC83W(>llA&Y1YiT8OB~WW^B|}Ghd&r?vEsRabw%#LqGNP-xG#&Wu713P| zcLLEv4n)zpxGzWZ_K*W1c@}XRP(9>8sNU42KLm0rRn|hBvy}}UYqA+K3sWy^tqv(a z3<3#fBOr4@c0FbgFJ{wWS()zNmmy1+8qTu+%OQ?zt_% z9sm)T8=akqGi$xb#_(JbJef^Lv{XklqE~R9jD7+F@n<98%;ZcMCMKQ@*^|N9hytrR zDG1uBm-Yn6gKLF*ell$Wqr)l@ot>03)7udZ_HDJ{z?1!_5xJ@|_~*9vD*moj*zCB8OT%-cEqr-+755t1R)&iNF$`P6LQYR zWY`;atxY6P#)}ZOr^A|xtV+oi(Yb8S-KY3Vi$rPe<(-5xvkw6sIXoM>C!3ETlCTt< zhNdcIS({_4`oVrt*!Hs&^MTx4f>0`C?LS z2syLa9F~P$YZJ+n@fL`xEfHO`dS4%gk46_`G;D&7_qJCfCslJU3nx}#7|i_C!+=qO8Ip)!+3%uKKF4X6R)aX){@ePBB@n<~);T=tXUiVTw@n{Mh%I z2V?R{0N5`dD;1a`s)j-_9A(tm>oJ65JV}p{)kPm{6-gGiLrd)?rFO^RR@pf7M8^%# znFedUMf#Qa(YuI#fyA$7_GPlB+wE5Kgi^c7MxybBePXF;{CH*{`CtO4j-P9-<8G(=U%Y z&0HOS@oKU|_5N2X)7I?)pH}a*diQtOj%xKzt9M$xbNjs2#wZuwC^Xq=vimza6s_KA z^-imI9y7J56wo7v_FtVpubk%pX=y;S3%EGD0QJ0e($ROElSR7sj&ra`XP$KB=}aop zjXw#IJI-~&W7WA$q)$$IX&cdO&r8c{zNYyhMVk|NR6pb&&-pa--yQwJDW7pRD zMdPQMi<3JIG8PwPWnwKGJtEFX)f7$~8`VnX4^81@ib>sX*s+DMwzF`e9)<=?_wqV_ zJ*}H5LySZ8Q0Qj{htiQATJ_AYg9G$~r3dqa^#;>JO`GvndMH3M<+HNQbe46oZI{?h6nF#c`{W?}26jlVB)C&#(!Lb9w1 zwnTdM+7h#hpnEjPY_pHBTTOW7SQ8xDuP%5OvIRu9ZpJRTUAlHmksE3JkL`kQKlwwM z<6Gm|MMZa$-LLca#;21H>|U|(viJMU`EQkN@AJ3CoucoMmdAh9JM4C!cxQXC@&gYE z{W!G&eVaV{>ByJ?35{E=JN>FSA2;d!NhxH*JLTk`L;Ag#Gn8z0b5@QS_wKYdxu4|b zTF5q+cJ_CC&lI69lie--$i}uKuKnm6mczdk-!i%AE1tmBMzx*I#+|-*dcbcz@ahBa zLHN=4&l=!=jpt0<>08JT_rt(@1NXh~=XjovJK61aM!Y3}$wX26UUL6l+FzURr31D9 zUV0y>;snTIVZ?L32i$!?Dbb05-lIEP5ln%`qBzaaJF2Jcz_bgsf{m!jxYgYX_Q{$M z-K{^j0MWzxlZ-%|GdKnlFdo*QgyfmEtAOfZ{Yj|atUrGRa#u5Kd5o}Rt3KVfHZ~}~ zA!>s6s99A6$!v@)qm1xbiHWY(-XqAYR-1@!#`q%MJE~`f2a)xb1;;<0pSj90L~G_5 z%~|RTF|3L6MDb){5fBqgL{+V=eQGOc(>8OD;%Y$rvL}jr<=G9CCazSRGcXalx-qW7 zp3F}IQmiYIx2oa`Q>Ci&rAEP)*93db+Ef%jM2wNuz{H#*I&=CUkg86Daz^sx_hF#+ z79+{Jsvpe%2|BLYG>kS4LqlE@EVYbwi`B(~OPhv)L?Rt08M&I(G;(;Wrwvs}Fvt-g z=Ul>!#Wu4x4O6Tg@WglrJ2Rk$Mw=L2&w-(%@O)0;`66b% z2q!w_6b=^{Itnir;pHN{g3=M;6(WTSqM#%C6(YP+_*M$Km4fqR)xSy_NKZbOt9QyD zNs97~96?rqbjX2lfrV$_z$FYv&X5a&bdnl!BE!@)ksATa{3Ayal4m)96DSW}FdY4$pu?h=39brjX%e)bm<04FYCQP~uTp`nZ zWG+dzM2RlKq6^PzT}c*nh?e6bJW;Pi?nEjgROX6cq9E!Uxgssf0r5_-q$6`k{=i0# zz!6;FCB3YDo+4pFxSF8NAanN#u?+>7$0x=*|iRq`cF z5vtzhGqs%xkyA=v;z*egOgMCxGNU#~DH6qUQIiRxH0Unr$(k(M8GK~P(p^v%B}neRt@t?tOb^LC?`vMpghn||!lTPwN^c47kqQD}`O?2NnsDYd3d=~PzTDURN(1hX z^|re3FvgLxbfa+a{-!?*I| zx*$*&H3nrKtBc^VD8s6|D9;n3{w!B~k+<-AB+nngiL7x#wpdyG5n(}~6C!D$rc(WE z3n|!;o9~c%10P3Cg_M*q{*C@S{-avMK~rBTC{V2u^;y*Q(>jWu#J@*gjsruq2A?AS z6UK5f{UZHxB5m;PsOW}(doT(CW|HXrcspAV?xWE+1uLRbjC z_&{)ed2)Gqaz%M^rC+bH0|G#fkwxSQnE=;d6MTUYqzuxa4PuB5bcDkLzl!qmN+C+*5D5dWs3@-# zl0}BW2ZAdq%PWPTQ7kA22p*D#Xdz1o57L5oAP)!tIYt)2G-!cqunE4v2vP=V&;~KY z20FswfnTL4Gl&v7M8be8MG>O>QQ#aGAuk{sq)4q@GcZ;q~&r^4W#`Pb?bjE}$lUi+D9yGX9VCL=l z74zE`^$1*$oS(5ey!6Yl1GapPT3>12y=Q+MTNcr!XWZW9aeePjFkP`~ z$L$Xcxv}?r|AGKVn5aOCb$H;d{>ei_n`P9Qk-;6DtfHP+1Fm?v_ z1takcMPhSt0jaFAvK{b4BW^iz1oJt?sGndh`;W}Z#628v1$4(+_9?U=s`%-!Bs{wL zw&tYA%6{j`47zY)^#V?BcwK?}4M4gb7c}bFDcnhGe>AQ~aRFpLxUd_u@LPgA#V3EL zzcM0AFw_niG^qp)djFFjH2c{JpO1X}Sy;U@Sm%hU_mNK!>sc?ko}LZFvz`ru8^$Ko z`x&koZVKbQQW3hb-d(`2rz8AlgwHO4|DJF^6z=D6_3Q@`>vw?@sMo>zprM{< zw$xLK*XoJFI=KGq8Q*(-{n>kP!`La`pW)+UI758G1y=^bybEq5)A|487sML*6NRq+ zANe$4%l)VNH(}d^yC1HeeGh*<(*=+l2RDel6F~S)0?DVJa1RSNpgx6mtDjsihz*9@ zjBTvHrhX86UHBM6L@FVa?y``d{Pb)_C_Qfq{mCzq{RB6NT@{vGFP5!pu%^DAT^>%- z;}ImEd6AUXt-{>}w;Q_=8i|m9qmO)=vA&Jh)Q@DN8xzf`jS2I?Cgd)TpwMMa*VIQT zL{TYNgnN6`UEuIw6!CK`ig2Q%3Fp0LB49 zD}}pBxch{AOt`@vDKuWV8NwYW+^NFd+;M5gFt#7Ao`rQH>9y-b((4CT&u)g#W$g7% zB$;pUtYi z;<;CYk9^weenp=U#CjO0w)E*vsdq`C6m4)L*+(gqqsShV$HX3#$BA&m*qRkH5EL=N$^lVic_wO@;YPASy@y( z#B*h@$w@)1b#KbufZinY@p#s=)x9a!=fZ86{*ljdc3(O)@>xP3N-G6!EX(afHR`KA zluASf;itew9nPTgnvy|vuNUf`Kl>?z@*9;&c}&eD%pBn^6YgrbK`gZ|$@xm*UMJj} z;i9kTdrx0~_Bz}!_Mg5~Kff1llYTnvL*1(%#l5p1@$A>1D0da^aJXU2+MjZ|y+6t1 z1>t{0_(u<*_R@9$@qaCz!`MvWE)(wk1Ac9Xd<`JUkIb5!l+16=qCRy~7V*C)i&E)y z1-Z8fx5Yquw!;l$PYL9rAtdeOp_JkRxG2Y=R3bZs`z~Dc zD%l_Tv}T`W@6B$_PQyh%JWQu=&Dsy6=e~HRcY}OG(7TZ1E!G6eznI}vp)>&nFoOsi z0>}@WG1eE*)gmm6g$u|cpePn2pz8tEXRTO!0o}${vj}|KWeI2#pvEkPjTO*NU`9j7 zdkW(*A?zJMEdb3BVJ85!0yI-VzMMGg!{!L6C7`xASmt^GB?9UIXpw+=0ZPRY9jgU2 z6i_r9#vT!n2~a&Yl07M)xq#|}lV|Y$3}H7x6w!F|zbV4j2+U&ku7I8vkd+j0&(?X0hWmZ(sci1#3%wg?-{b->(#;Xyjv z!!~fr-z$Jxur~-o*ik@ffHn%~xC(7TNC-119oZ~|Jtd$PDzsHVDJryGq&HkZZ?R`Z zSRSBgwx2yOQlElBNjiI*z03o62)hALUv>}>!`%KVDJg_#fUZTE#0zMe&uWxPTb`x^$gW4cbd<>$5w;ANV_0_; zdPJnx6N`sbleY?}7oR4emju+8&lB7Vdh(Quse5Lq#ewuEdf4GH#w9(Xsgvo$G~5>2_qk{%heA>;Ev^_WqP^s{dnf z`}6VUo`V9Y9d-zK2d>PEjC-_xd(?#Q z>l1~a>l0<4AacWl$j2EcCz$+e!j$~v1yihq5R!0Ohz*owTGF+I5CxlXrwVtbaLa^y zXUJUO-!I&aA={Db-$L(3>(_^o+W;0ZoWnWE0A7jPQvUZkGu1?<}5Eg_|kd z>?YK9t`@G$i*qizH{H&+7RP8c#$~xsa?l zdnKv|{6CB8sp#2HQ5kraY5gg1LZS!2Cq8-z+-}i?-%q$#G`kKy%bLxG`&qNaie8`J zaxoiKR@`!=Dmg2=Ur=b{!PG2?u9%NyX{-;!$4-7Rmz^Lu!9#A*?@6Zox!+g7-p z;ObdI)Pop=bd95Qd&PZ?Sf53G4|iM~m2Ykw)!{L?4 zImX3X+L4^UZMO%Q&hHdiW2FpbO>W$t@|7UmRN)R1?p5vS?NivEWH?9o+#+0AqaJKe zZz9<`7u%CevO17_hIRNJJmhvb30L;dvR9Y=d2t7NQ^;O@ws^ipV6N=2 zy-GgT#P)nt*=*r1gv;5@iLLdV$v#K&vm%jdyUf>`#CH0QEax(kMsPgnu&2cHv%)>o zhWz(jM*e3my9?hF!;;9y7jFkW8=EBkcY%Ih61^jc|NSu-mav75-qa_8+Y!Z7B` z#t2BJU|@F$NT%S&4z-mj+ya_@?6iR9F{0wfMzwQLNx`hpA_*D3@*N9kjevHu-+YaL z-WAYF=5Hv#oLESEino$Q8;UVD>#jn-`Ih2a_*xZeXPAw#)ocMtNrbX>0+M`&u_FSK zd^TX2G?ar}UNoe$25gB69Rd`=PO8wifEuz!m>VF>KLIsnWhxZpmyX%3RVqaJi)Ncu zs0G5BvpmcoP`pgP6|4pOPKCz!rLb6bqBDgNpTht(>Ozp@vn9(BkmNIt^-iI%dF(dO zjAM&b=pjI@nW2XaBhKPki3(93+OcISM0rSHTU3ZrPh?BQl>a>TI;bSF(<<}{pd>af zm1q)YDXbG)A|T0GC$>jG^9;QM4&fW>hzbo3=nN<@P4YtZtTVpS3EIuB3OEdCTOS!_ z3`oZp$mc3_BcN_9Aw!030F=UR7tliXMnDSYM)#;;Uj%#xXi%oa{2iESY^e%e7WfV8 z#gh8UurYx@vUC>GPeO%(={P94vkJ`#Ou?xCvr{M6#_f#mlzK#!NzX|9|o>AYQ4`bc0keFB359Pzz zDixXpD2IKmLNfr3VyOcq=C=Bc`4~2~3X0)ZvL^(ztkF-GU+;ev+asWbhS;D(>?(Fb zg)R$9;#V;PzU`@nrv-Hd6s|%8fq6AcP@&O5odI=Mq1>P}K9*&x(3GHbKx0*CF~Y84 zb``o8Vb`!S6?y_R$FaLqXcuUXW4i_Ps^Pt$G&Y_cR-sRVRsfoYSp;y#z6wggS53?i z3H>0TECJ19B>8Juj(~QvhXW7eIL9q&*snq9F!SFfGbVRKRAb5J{yASjfJUm_mX@ z?2cj85-eiR3rI?^h`lMG-E3>{VVt3PNDZS}Ucv?pr+B;B%fZ>)%Jv9I)?^#|uL_Z@ zZ7gtvNI}TDlwIipO_C5h7My}Z9O+lamc<+o9?h$vGXk=%kEa8tdLMXk3FhFV*t%(M^vaFq%psNwHrh6WIwo&b#{SP2}ts?kR6d>hOHrK z{6=R<=e!^Vl-PyN!LWLTdyRKUVO`c7)!>Z)5LWBO!VREM*PG z5hNwJl(iAiJQfp{&X=-&D%3tKlrLkWR44_|?QEh7QK_t8PpMEpgx$$@st}cCIZGWc z)1%(>9=1e!<7?P72^sDTJH#GfOI2uNSZ6@1 zROm&7tz}zO=n%rzvYje)GVF1_jvZ2=-@~>5G8h?t3z^a&g{^0)69}5e3=Pr&l?aGZ z-_0LlYXl_g(j)A!ib)dOz(P!diWseJVDTz6s=*3`brulhiIK-fR-!^Q4tb2dr9y>B zZxb`*3o4=&KfyK^5G2!kf_*0-*^ZuM%O?v=@%DX^?UayVSoq`oNp?s;vW-2-W)%|V zJT@*o1)4!6MG~U-^i%AR3KfN?v#l(uSccsIXgj+`h3*CPG@GVE+Wd|}Io6=wSGd>{VtjAu7AsH{pjd_xP-UWG&ds z-WCv*!#8{{Gh9cQa^$g(*;Ob!B8BZ^?^-Er9;5v2V{7aLEn_heCwT??T0oNP3YH@} zKUwGBU?l>QvVMa-Dj+HAH`&gqL}h^?E#eRUCOf1;SrJV4COaV@DeE_xZW>|EV5VX*+DWZYy06QZg_7bQZU?npp z=37YN0J}?ts4l(BF!_q#Jj1bwLzppLAfScpvdC!NL3W1~y00+M<7h!kd*adwplZobUX znugcvjsel$TYJXp|H7Z0c?i;pMg{U=t$M&f4 zsNMd+8ZDGGgBykN6KtY@7P4qSKeFr_Wf=A4r`YELlI`dhHf<4wQ8`$3zp~E-Bx}!a zj4h@xSq{IkQ~}9y_?6NSxVBO0Z%-`SX(30h_-YBZXkVY39ZlHJf~rtS=Dw1mP4 zny33O`=AQC2_~9fs?aiED*RLxbd%198*Y>FRwGQ$!>gd1U<&c53T;4`A0M=oFqg6I zjh5;Bxm`dj+3N@k;D=S{eL#VH%`!>z3qbXG%yJ3+x6w)%KV%DN8S`(vQWwlOt6|ZN zXX-+D+3kcWU*pH#x)_@bxNmU6am$b_i%5 zo7E%*>k#ql2y-4=(j*`h=c;wP%07j%vInnz^3BTXuFjd{!l zf_AfCn!K%R!b=2%w_#I!LGx`Y)Cf>Ce_BA4qYre=`R7#-Xz-YgL}j7j?xsg{EqHeo zTHEwXK$$A^Xw&a?v3#rwZExC`$MO;tdbw#DYsr_Y&|3mJqC%fEJ%q5+D)epB&VXVb z73s0lO;cDLAD}{hQ3O>8Xda7 zwc^V~*aFe|TZ=G7lwUo?0lmtvj`~s;uZF$KXGaB)c`kkmdzCMaYNRB%#OqKMc6C&9 z<+3Vhc2pZBsS2Wa$$XVaUDlV*JZ2M7oyT&b@x{((snEped|hWAzFCIRyQ3@5d4iyY z=zB&eUHJ(K8D>Tw!itmONfBnaJ-RcXa22ASFNG(l5cPa1yt@i*M7$n6TZNuMydM07 z3hj+PqPv_&Jtb*=7=4X$IZsugZw0hYh5jp`3Kgo~?0dvJtwM3l@(?d%i=@)6*(5+I zfMQU4#xkVI;~fKZEzeP*KLJhPWhxXIlg{$^D=L%( zD4!ozp@D!V@q%xT=eL;pj0;q`ZR-soA&%%>lq_ExWXv{Op zb=f5xOR8;{yam^Ai&NwM*YDyT8H^URlISi=@CDW&{~3ejxS6n;iP zyIHdq&nQ!P)XRjqn!bDFC%vs#$6$w2cpzbQPqeVKxG6l4dy^XLr z{CXAoSU`8H&<_IIqQ?7gi#^I5eny4#v2QD7e9fyeg-}5AxX)`6Y90HLay?&H1%0L5 zzz6M-Vac&C=oaw`6-ouPm}l>mVOIdUi7!y0k+DB1H}f4Tbam_*=RD_pp7WgNJlk15pS=03Gox>FCVrcBuQBgG ztIoX58L*|#o^=lDz9FSy^YB^kjJ(}>!Ir*#*1^af&L_U3IDdra?sQ)8OXo%Jbguj^ z>(oNO!|9O{t>QuR4u>_KO@5~>(Iy{>yxT9`RMiuGk6)r~Jyh`A`~AAB;4MDrmu{-M zAsUqU+=ra&rT2#o{lkZyn|)g9%txFzh3Y=y{3%p-w`0CXN?()s@QlvL-Og#Y^vN05 zptMp-it}#g^I9i9=cCROe(8lF_wnSf6sVd^j;?~ zC35Mb(T_WK*t);WxG(w%=cj(@{^%#2HQyI3X!%I=(*=C_tj~$7s=gb&-!I)%^+fb@ zeu;c}z`0tnB%GQ5>U_x=u%*(Oe~Ny|`Gzf>GxKrtCFfVRbji#GC@ubh*L$7$vh#%} zSkmbJ%g$;4A$9O$FGPP-3}pBpx`m|u5pvZd?r+&7)uY>Bq@+s>zLiFWXq^DA4Thy9+@@vM5MJ7$)} zzUSO%OZTDlsB;h{Y5?{9G3SG}M16nE`IIeD-yd@xl+v*ICVGF&dDnj_Wj{vg2hOX1 zsiohebliE1EhW#bH~-;$(3Ym3`;3bhw{7Xtb5qWboKOE+pKC(tKb_w{r=<*@d)hI- z(b5p=e(H4E(p%3xGxCgck1gGcmOpoXVM`C6TW6kintrR#{RirvbvkW{t83h|krL(X zjM%T8FK8)o_N*o5H_oHBR6A=4UdAO3L{=pmXHAa4Hz>tu*?;S`jJ1JCx52ZgiZ?dHoDE-O#cUyWn zN++E^+tMIP|KrsBPO-cRrN209Z0V!3m&N|(yxx}R!;Sl8TRJ*B<+yJ3@AbK#&0Zag zx?Q%!l~l}qSW3Ff5qG~KrDu}lOTzuBEs-w?_c<*&6dC^#cuKs?BN-Qe3{@@ z+Y&i3(Y?f$c&0JY%}D7;)Ls22X=&a%r_PkSci0kF^W|FRy!Q9-oDan&xs#*> zt(vpMOm?r-I>dGV8k_9iU`xl*a*BJKU-#bFRCnV4D3+(^d?t3fd!CkrvNPQIe(9UB zGu#H-lG0k`Zj#c&=9RM^ja9i>zjV+{a|dmSbM!LzHZ3J4o_9QUruzXY=?eNx_pp?P z4W*~r{eqO#$DQT=LQ1+eoZ+7R0_oJX;o0spMO1=^WggCUqj8po&3Dejs>kiLrJqQt zDxobo4`;jQNom;p_B@&$F-RmIbFAE7kg{g^HN1*L`V z5nDQaE>0ia-`LUxDAl>u6WIf~^vBqx?jFDNLTs`73n>koLv#NayUe|^L}{V*Ug|z5 zCG|2(-A~|)PLxQVCM|QnW=lLxTIN1#OFW^fcYkF|JfW(0|7=SpkCmF|_cba?JTlsawcp}CQw2KPo=dUS3QrPtZgPv$;u zR=Mx9rT?D00Hu4R^q}Dhz-qTRt)q2n>dhK=l9V1aB{ff)%iVRh#FM7A?!C6<>1esm zz2BDRqO{({aLf?Sh?doq7j1B>D~R(!v##c}qD}6nrKI~ko89V3GIr6GE$(6|skCl! z_ee>l^-A{}QlrEgAbq}9aQ*@R4TU&a%=HjAj z+zqE|-GA3yR`d$@ep_-cs42SEU2}%km0$3n+wOkNmS&>V>Hgl97NfMyt;W~1bkAy4 z(GGW+Uur7KxmWw8%|+L_H~OWmMcwYZ{8Cp@pL@S8?Ym%A(SZB7Uur5Ebbs%ct}oi{ zmQU0E_Fb^QXs>&ZEgeAVMtAYcwC)4I@+$XgztmJT z)Kqk{`>0>Kz38>>3sO=$f2;djDXDG6zSx=CpL^l^i*9wVw56#Rez@rM?z{ZbzZTu* zJ|ZQ>a=ZJuU;1eDcK0LI#4>E=Uig6f2KU10TDt7Qe=B;UyGcr~G3zcoXx`-B;g`Nx zbin<*mPB6O>^|(59&qvD7r%tt1@5_L5vOYSTii`jdd7JaTKrbXCvT@ReZH3I%jff* zrVP@;{6Ku{HXmC+c+1?v)HPxFi@`r$zb^*HX1)J#DH2{>hdKP z7cl(%jgsFdZFKGw!%O8xc-}|TtPsT&jHm8Ys8&b!F zX`8%^kT6c_po@F%goj5IZZlp!%)Rm2ycqb4=e%MI%V(Ikt0o1b(>98EJUSIV9);gp zPHay}s(f2KnGj9GI8~yw{b-zF{_DImb&X1(YSwr({3CE3yV9nk7)={%9iwgTU&+0m zhmb~bTec9cZM>FjGd|?WhQiu#%fkFJ=|!nhE{!){ZTavTV*akAMRg!M4Z?~Cartovd9Xg*x4^RBb0wJHPQUUW`>BfST+jQ0lC zaUQFXM$9=#J;((ih+-R=x^~tG*L=ieLKxVK2O(9i$dxCbicP8gfym+K<=KUmq#-Pm z+D0*)T6$UQ7RdHUn)#Lh@hkiV>CtWCQ<{$>ueEr4OY+Je%_|L>4^tTCbC8dSu0;#z zQJL4dqXzLk4EEkAeT}wY0k#(>Gvl=nYu|Wn#)B*Wwf5FJ(mXmJ)-`RTGBzI0Fa}y< z7w;|*v$Y9gx7CCENjP(AJmKC?ou9itpnr7Br$eA>-xS(Ti)gOJC!) zd8u$+8TANe9jQXX{0z(Fc=^$Dq>$0@Foi#tet(5DVt$J>YW{@O^R1_j8LryEma6s2 zTjobYJU zEyOUAlCf$7N*u#D3U5iaFg;t+z-D@ORckj&ZHJ^SbK`hptQ7ys@vj2^CgI=d_*aX6 z^RPEG55Je--!ju?PP#mwb0SQWNEeut~`OJB}@eH2b6>l>a&btxml6ePB&O+AC+YiX5dG)xZ z&zo91L1!$|W-{~M5IJJ5n|EvcsJRifN%M|*2jWTdF-gB5PyKM-9r3-93nu?DmNd`L zdk<<$=Pv+N^XA`${L1-n0G=j5j+%k_pNJno%g@H|jNCfE-Z^YOJ^%CZ3_gN(Bz||~ ziTPiR-xvA){3W0SWN3xAGD`jmOY0ylBY zyl+7K{ z#0l){525|t3tyW6uK+(Bd2r#^F;m~gv-d?fgC`=~Z$BJ)X5pQ{L*7nRs-l#NI-za0 zq_vVxm$Y8eMoHUD=|x`!wbd7WE74}=UbHNB(p+>=y>rs6y@(WcAZ;@@T*P^N4brJm z%En1^??sO#rc1ufeEXs&@$3&#JKNSe7yl$t=agPt@6@5oygZY9|9iM z)+L!Pm9$aPmSnAS|0QpT)H;tMo$dVgl4x?a6RpE|<^7-8&h)x%Xt|`W3oRS#`jNh( z?$yA5ecc}9-&nUS)@D9X*ADJc4i7l@)GaY>&gbivI43ZhZ%np157oUDZ!Uco@Waki zb?*RGzdPGIayclWCTOTi7%=%8RzUppHCi$E?#s5=~|>2 z=bA;4qC2DcMPE(cDNo%Qebu7BB{I_2Vds`b-$|Y{Z^g4uVXl9Ze9ED&oiz6Va(DF0 ziz3Bs=39#r#fP2aizXJIG*2(8C_d(rs$(uWmNdUx#CiWK+UK0erFcWcNg_RI$}XLa zmM=qosz}jPXZEG_$X|3RIOZ(9w9ZU*8jv1~&_>;fHnGTFXUnA*74LO+NP0ceVTX6! zZgK9obV>0o&ZjS30my@wUQ>)4yqC5YKV_b{bcw-ROqJC7pI^EiwX_fQhP*uhoIS-% zr-H)|&$+SqXf(F?HN{ClZo{}vU;H?}+(3&lTWngJnYs8q#gzFE7Pmz&n0yb~aHMU9 zBRvKwT40VNJ!qandc2tF0`sg7sds7xTdiO_5qFL3-&rUUdDNOy`=Aw^j@Sb z=8Km#mE7&p!rUU9-wE0dBF`DwX=^W-+*;BiG((m!YFO#Zu0_AJKW*T{4&?cMMw@y5 zGS>3#j5axwxlg3D&A3Y=MVVOb(t(n@Wf!~6T()$$WG9}z5YKKw{+PRc>1&bpE?wg6 zjs45gHzQAJJm$V;X+0pfEqyy6uUZ5P>AY#_yYbX}mM$>Eu`e$r2fnrR!jfT!=j}(F zsS6$gXMO_s5$9Ku{vPQq=L{yQirGN%pu|4ap&y%DW%69`p4rAJ;-ouUj3YsLo!o`#77@8e5%DP zuSYy!S|q(1X(pPle_82$?!Nl7f&X^2Ip*A1e-QZZt6xxhMD7tZIuF!8ZjQt*n7pX8 z#d)Njn)O8eXJUsVKSSDPo~uuk9CzqXk2`;=hgWiF)2LI+N{3_7<#S4gV`WH>xwHev z+%uNfBb|=)sL1@$*xB`$qp#=FEv2+STS}8Mr%se_FC2Fom(Nco9ctWh=ZfX~Oc^M$*uUL)rnI-Fy(ktam>xu`VCq;HkV8vSbl0Ub2XMIO)(jope64f*SYG zipOzF@4G9gr$0fO0=9oCqs-vFT;yqK*RH&yYf4lM%Wry)8na`Bn=cXDCBCa^S0XDPfT;%JERy7=O z8;d$5WnYa&pPv6kO&RC7u3^O}i-e#7szO6iIu3h~Wz^NV6UFuHC<%|p$?Oy$k^5LR4 zAUz!U$m(~O9|oNtD?d_nboD38cbf05K3skjkXWR}{9*M2<+I(`nup3$Zt0pw%8!8$ zN8%}W-kR?KvUJT7;B1zZwkYLxt@(cWQ)u&K`H7-L3bAXH*5;(};balz|76j}*F25d zRg=FOzr~@P+~Rz84c@eq=;CnXYipvZTK7>vYTYN-B#NE*bI7-uKdw3E)(QQ$IJ{|| za(Qq3h*R81{aw6hP6;eItl~~XyRlO&$=xog-Dys1T;j9{uX1jB&U)MsUeyR*#b43b znyN3#H@2mQi}p9(naH^BY`iu#)%{T8wp1#9d`@?2YMfDV2G8zKW!xtkZ%G|-{tG>3 z+}}4|Sdxk-FW=_2m`RtvDb;4qx*Sm!+H;k$;_|lxvH@v};l1h>^NPzKDsM5oReeD8 zZl`-yRXyOZ1Uwnr-}qcA8N1=~=Ta^1^XcbP!!pJ;nemFJ#Fj?3q!Tg+XT z&ridr;D&LV`|-;khn4>P<*?`O*DwFI%Sd2Z`fit;-)WveEg`GZDfe0A?*{&s^iGqX zQHS0cM`4yPXUYhw#r#e36V{#+Z4=#LT4(CwbJtEWd)!NZ*S*HL=a=V0P`}X4rl8+K+)|-VkmvycyhP-nh07-u7)s+sp^irbRq* zi`?;Tk-NRgqK~eH_W?h#b~9f`o1KP{A)|#P(&KCCH=kbncKD-b*1}G@f0_QqXwEh3 zfDKPQp1xCN{7%@n-=+^B{cOBWI8f()a>gU&w>XQ?5`KT(Bjqjb=5@0xjyY9x;OWq^ zrlQ5Y;qv3fJIxK?#sP5bjmZN7Ip8uXYcW0RAW`O3>w54Wp~iK0uG?SH7QbuV*Cw{O zpIrC0ib+@leyXC%JTd>_ik;@W>o{KOV3ncuI2<{??&}pf(D~lBuGzAY7;MczQ|9b$nXL8={d72PGIH8lr$fATAH}J*^0Eq zbR#`!Zf}}idD7h9G^_GZoKkV0`$*Fxuk?=;&tEPL z)1qu&6=nPCC~MD-u8#pvv=!<3(JPTYDlH$EmQSK(4ZafbktsF!TEnfU)!>VNZ$o~D zd8n9wn*JalSD6nY?J)NuU17eB+6huyVTO@E1Noz7fBd21XU$vUKSKKY_}8%}()0uI z(dZb z;LqBWIFqjQ;z}HAU_eD&q_WS5&9#fs!{Seq@O8S5oN#oW3QjIHF|gKDarT~!6K691f%xkt&5lc7lIA46Mbf(^ zJ*sJfZGL+CrzUQVM$csW)VZxwwnm3%T{Y$GDTih;f5fK5|I{o^33q0*&4ZWosq5nR z#E-@QJDy5RPRvZyCN4=_mgq?ICI%9>C*G2HZ{ps>rxIUIOigY{zAAZ3^5e-LCI6T_ zz4(IS#^ToE!Q!_TzoYn5#h)v_eBu)mmz1n3X)Eb1`Ebd%Oa8OucO}WvIi)*FZ!EpF z^lhbIDt)ZUuehn=){1vke7E99lYT$RRHiDYR@PKrTDhk3s>*GZZ?61c<-b}ggO$fC ze^&X|%IM^h$&)6}o_x{d<&$rn{JzPbo&2TA4^RH)colJ5x@ZQZr@2l!htm zr(88<+mwMR{I=Ky*n7rTqF*+I^uWtrjr8f4)!|yz{+ah<-x+^X4F5&(UmV{JO5mGC zNqn=X4Bu%@!6&6nHFkQZn@V#QAZO$2Iy22__;$_d_(n|?Fi*o5XkLaL*|YHNsM%&Y zAS(e`4M-z)gD=OoWY*#fGEMky%zEq$Z!n8s>5N$y#{s!{g`{tnbWwtIJyCKl=!%yy zEiYSz^mNIeRkjZKT1o2#(p*Li;g;VLxVAqoEysK6NQ&5wN_tGv@2B1d$WJ8yY>K^~ zUcq#Zq)RIfBfqlZOGuUSKTjg0B^JXSv|B2Rk;W&VhO}}rpITXQ5%Mc579;JMOgeRp z{ZgxK&OePUmz~yyHaeE`r@jaI+A|10zv?9ORro`1=8`I6sF!qI6>CqNC2a&lYzFh? zGuVFGjCq*oIg(x?>BJHq{X4)iu?) z%d@@aTqj|+I{d=swMbn^U^@b!B;$Lk$)4u+T>!D zun>?pOZrymm22K2=|>HA=J92TIzaA$Uv=*ga~;~? z4Ns)4PB$PMkzy{KUgS3+b<7rLC-PTFdZm*`zRej#`f_JC(yN@kNUwHoKzfaH6WYH5 zDdqxSlfiv6XBg>rd_BfB|Aw!|xaNL*^~J?oLbo9On)7<3N1fa8)FVhScIS;qe~oXR zVC?wT30|R*G~ylv#Fcb{`*y%5B84=%cOtED--+}L_uYV3A$9R4z3~2rlnUV4(30r`P-2H?Gep?9Qh4D z(EJm~58=Hu;&~o3s#d|0Kq_;(TP%*FV3 zDLl9QZ*fy^=U`X%GSf5IlN+cR%w31Hv#ZP0cXqDm?b(*wKG>fb$o2ND%w@WIx105w z*=%!eZEk=~Hf7p3WVUB*Wqn^Co*BsGdb0hd;OU0W+(2)?;g5YJZ=Y%C@9*tjnalTe zW%ineJ$;#;PW)kwb(!{Tmszo)W=pQ8vv+sCW>s&0cRr}!l-)D1ymyaTJ(#N>7|3+& z$dcN8Z&%iA%H{_ec4d188hdv2b_neadpfdx90c3@_3Sh=fJgiB37ekn8wY!O&~tNN z)*Gm zPo_Itzz;k4joJKQ7des#syzdi4dh{eZxiMbs#e^sN>1Bw`V&?RFh%rdNZBb{>_cvh{2?RT-KXI zwrCy94P?os^}U@s2?dZVa(R(})-37DcJh%GJ2E}nvz;EBR_w@jTsLM-0sbp;+1)RFah$osw;!PArorQ*t4zIRx2m+-gqd{9<}U41TxIc zf|m9Dz#Ebo$wOg0MGI9?+JHOU+N$UXkS7)f)k3HJ4ar&v?UsJX12tsNK=a^0-{64v zxX9tAT%T&Ts&pQ_2cZ=d=Ay&^ih+SUs5OqSShMU+%VKasw*{`}43ht$XtW z+3pbrM0H1Myap?JyZd^3zyVl7+8p12u}iCpo^>3^b$J$$SerZ5FZlz6tX|0U*y{B&k`T77E$r}RGh*~B#^lLBrrpy8GmsnT%6h{l8Jh?&n)*Tz7SNiN*?ew$4~#_ru3QJbiuJc! zDTjdMP2;FKVzxk-1q#LLEEH1Oqd7EH0Q_wXFrrOCp}@WS=cW4Wl&Q31}cjdQPlkMt*%V5-g}-9N?jPFBz+~%wxHC0}s&U4IcANo97kDiIu&(d+e}T+}vji zqvInTP9ci1$p|B|#20pDfmW(k_Gfk@fH12dKxSojTLxxiRc=qVQveVljW0~z%j^K5 z{W{5;a^0L30yI0|oAceh{heF-GkvBr3%L{?c*ZlA^=+URMfz5;hJuDrCvRZZJFeT* zpXoqQsR3Ai6hvai<^6~YK}MDVq*rL|9qgx4bOulR5YyV%l^dW_q6T_-b_|=%cr8S8 z7|NEqv8!}iG6q@hxgA|xjMwD74;)95>K2<%{czN0_a9$I;bvu*BSBSd_;JXR;BxkuvRP+4&JDxvEy z1P$4m93--T8#EwqgN+q{O0c2p1$Z{h=m4KrfJoar|c5PXz(sge>^q1pDp8ZS?HePNHR9sy#jVD6L< zHX8|JJG#|?K(;D`unm1GZI@J@F8}h7b`{4it{XeK zQy|O2U70S^o$E2(nLP&4c^^VNtQ@o3yJ5;!^bW!kE$<)9?=agS@S1CfH_%*On^`Gr zf?jna%oYCFyvR^yPXM=h!duxJ8%u_e4Ow`Ko&kxIManhDHUZ4ihEC;KpM>U~75!Pn z+Vm4}TL#ELbGIOG?pY3^5w7=QMJX#>umcMZG!B6_V3$PK0oGaw045PDQN%Z71N6VX zW9J}d!Yi(ZXWfzO$Qx^)?LD9s z+bL4;V`z*4+aT~@SokAs&QJ$m(ZUCE7+qc8pao26IuM?UFws&ew zWW|m{2aRe2GZkI2{@ z^qji@p7etTFH5$fMoHRCva={M{>>}SFoo8+`{+F~EPOP5UWMP^*s)7M&sIPBpbEms zScUXStncs7?3LI94=I^SwdPl6LqRd=k+r?uhmf&a81vr##CV%_Uf9!`MYt(j8M0^4 z%23FAw$H8GDhPYJ}DtZT0a@?*bXSI`TQNZ*=_-6P6x%+jnt zpkQvelJyWM&hgv9j?1Bj5stpvq942_mlUo^i>4WRcJ zmN&r@>X(R$&srfi-V@*eHb1OdVzy*!SQufIhknq9=fR+{;Duv=>Gd{m$x$H%t9qDX zn+>5*>Oue^(v};zG|GECv{v3PGwk*1Y+xxieng1soBU8G{(vk&fx^|&E{xhk)|uj9 zyuG`@&RnmJ;S9Fid#s?#nL=-*#Ns3%Ns5*^Z-LZ7fEL;5GUyL3vdBl>0nnU zg>>6smwF=X6v3HqL`Z@7Uz#n{pGyRVYy}B;KH@QN;q9y6JZ)Qhp}|6-4=XJZ8EIeZ z)zz8|rl{YBZ+-p-yTQ>*c01f648KURFhjzq4Vr}|kbN$MG4zD8z`<-F$_$PcRB*iQ z(O_wY)s)?eVO;51bt|C(5*!WWx)CSyNNIUjrsukKIGRHA)ZfeC2j*x)e|8to6a0Cw z9wt=QQwgsNOM9-Tqic}%jasRjBCXfu`uZ^4vJGZ+&DLnFr3D*a*+Nf8FEQn@^Q91) z3)x&J&sY$SNrn(BA+#el>$Q`qWI=6-aFoSHk5WG47u3gzXllO_zbi^?HD|gyLUr{B z75j945Z3X;O6E#>4E5$Cm!lB7crcCi`Mo_I_A$u=dl$ocvpkECN!J+Ivj*q5+A#1w zJ77 zxYS41Ai-xRAv^>mzj=P*9p!k!ycd>+8%TL9kNY7(B9M8rEw_h9Pu8XJr=HDvpaHh0 z(J)a8=<2A^$lQ(r=VW?z12W8Jp`y&ZRS92Oq~4w*S?3&_zNuPLP{(UwCrvuWP@v5I z_}O_O$kRu5?kP*Av(pdI!f@T49kVJ#au~}PV2fmo8krSu)hhKcwOQ|c%#fU9!fxHr+c${SCRPkVKOtekX@0CvFf)6R|nYg??{ zN5H-2qiZ0>BiaHoW;31t5sj%c*bAmikErRu>a>6Csz3`zJkz)`Gmx>zV2yb!M{_{l zm0bx_&z-~VfmNrB_@~A^4`cYgT^f#E)xe!H(bEx+^$x;-=t8c!r+yn+seEFoDkYg0 z-TebwRM1u7#md;Q*lTR3#e3Lpv53hOMD}c04|0{GM1#FSxHyc-D$*L9X0Ql2L?iH0 z)@pg-NPz=XoTJ({GhixcC{K49SQHFMdqF;|m3dZ%^&LfR*p#`B3vcq0S;ii=*eE6w zv6pw;h%E^edTEw7%AwAx{@(7OB;0G_tqP+qMgTz;VQij#HueZ&pCg-jE-r0XXT56> zdLRrI(#PT;PuMP7jhp(hdq>{(_Q^9mRxijb-z)JG_>OfhPF92SVvKo|#SN4c6BZcA z@VPvvGN{R$FdM@)cBV(z#$7y%-MZCqe-4I1l{~b!Tcg}Yq#AI3o6g68$O}!doe^er z)+|5^;_@t{Lqis=06(paYB`tp=*1ybPiKMrdXpSlfPlr^;pWCD4mo-02X})2T$kO2 zbz5c^+y{NN9WaAEb|aop_a-FHPd+v`xo({r;UBM0AkTQ@!4L*ArX+=Vl3fraz! z0cE>Sf+3xC3#XjseWs8`k3=Xy52^?faql!Ch&m9g4@U4?0}t%3+I^_dBmVZOc4-we z+~a8RvqY+W^~P?kKnP7iJmb%{$HUN+(Jx8I@&p2JZpn*?V3cA~y@D=0Nu7X&Oux0n zLU>YQRK`Wf%X(c?F2cl2=;otYO)rTBp!Zk@PG@}4&Wo~##os$(_M2=&7k&XNGwjUg zv)t|Tft}egfc+pI-l3qOEHyxFm;}q@QG{6dNOCNAEIMq}Sk&06F=(7o76?)7;awx4Fl5*J%&xDH|4<5X$KfmqYd5zLT`WYEPEDSd3#OC0mB}LV~VQ zu%iUG!bD`vTdN@u!OjlgSZZqIzF5k1)ir%+{bJ$d*cf2iKoFOj+itiicI zAad>(7`$U`+tZ2TK|4%>geRf0a3@p-pKJ+(QUyb}q1Tsi%IXcvb1axA?&8Q4Vo7IL zm0E1vw!YWH1=69Ba4Wh@^;8t2v_T0u$m=&YRMI<7+AYjMmrp~xIMrG!Q*3P~NbW=k zHm|L3^aQhKuwa;#>Egw+q5Hi4o|KY5($bALxRLD;)_Hbd^c;+AJYq`5st(Q2Sk?Z7 zjjW`&kmm)bGgi_ebEBH)`b3&&KzJaC<0MGWcI;y05D+YfY3$4g2k(00Kn{xK6j#ga zlFymlP*_>K=&mpML7dbdT%44Cs9Rp1aLT&vg;k*`s_O-T&V5bAIZwgj)IPIj3qxYO5x%<|rW z9TG`#%~xx3-d+tZdkyyE-WK+o5TcB6E!3U>h}>Gy7r9i;3uSSf&3F@0D6Gcveq5~C zv8k6xB?xZrr!C=DE@KuUVrzKOI09D>AxYYncN{Qk~D60MZDC`i4+X zAc7(oqz2e3s94DQ{B;bzg;X7*E3okSFYDzgHS$SvpS3O`do+H(Yv3Z!SnV(!8?#^&*8#b2z%%q4>_{x&C9$E<{46~%k1ri z*RO|a^!CfzTQ?aMU^evPzJj>bb@r_aDTuR`6HFQwKLZP?4hjCkIvds(9KU#WYE710 zGmWYsm_IRgtksQYg-dTZ_X(~KvjvPA%!71m9}EOu?4^Zb#g1uTj+=U5ro1%3r^kY| z!pk@IY|7-XYsd8pwm=xrKd=G35~1aDg%A#rD*)LW?}jrMKIXwv?5AYy1@IAM(KaHK z!Uc%%cs-R?)KJMm-^(??7Y>{bWlX|)G zs_1ksp@dN8-oC93J8{b%@`Hn~13c~w$b{+i!X9!r zibBp1RX1xn0+wiZEChDh%08af>&isBAtU3Wn9J3Dr7Q>2!CJBuAs@K!-Gl}M^eVBZ zUs=6zi7hdkYs&P%JMh(v0p2~v>m;HYxFrpFAVju}{h>10@6D-MvPQDHyMDhxSU+@F_z>hcVkp&(*4uE89XZGfKI>gf*stvf$%MZ*37uMh*3$LDfTlvx~s0&^2ENJ0h?)1@Wtm0h- zX$aqQV;ir+o06~PfFcZ-vT8{ZmxEiYz!8VyWmz975&S)fKg*nKo%d zFLu}VO5>5R&_!S6C5agm2v>|?L2eDhFofT$+lZ64yjIJ5cHY8xgjMmts;X**D3&Yb zl>?Ch7B@o`TfJ-HUS58NRWlK>zZ(C>ts8Gw?k2cDx`DrpUh;h>dY;yP#RCJYBLd;@Xny zM6}JGD2H022Jq4%@7?rt`uDlfn>DGLQ|swnMpR^cJyTXBEUtkk@1i&NA$CpTFNao% zxx!0`vYAXO0tzgVaxAP{TC{-vU6_WRP78&U*o(WZI4uZHmxKg)>C%V~*^RNR#`yup z=@X#Ge|m46MpgKDrKD|GKEtl_QH^$p4{MVFgu%iu2D`ACf?^Y2`2kz7?;th;k??$M z;L4_;Hb7YHU!@Tl;~SC%5bo3XuRuun&@~Y79L5nx?ONu3G*08>O&wA-vK(N+cxBT^ zT6xz%7{p#N^XBqeW2QKVL7x^uW%!=`p^(A3-0i??F2<3pfls+kYVs=RH%ZT}$f z^fn&@h~4YJdEa2D9ZZRLmnCRQY2gY9TOrb~-qMf}fJ$owJlAbQV_A9h_W6yX!O=3T+*#v#f zYDA>>7W7ITc6^(%13P+gnE@|yas*nmP#GaODfh4C`m}6IiF7sdHnlwBU8$CJlWu{9 z-fN^J+7{>;PQQ~%YBhsBDx#6GZn(@=cEVfnZU9-cOn(XniPHgA(li-DeC9g2nP4rREkA_5a((QQDmgd6Fy zXqdlJQHrIs5P24=WiL**!iQsTf%n%*S%?d;E8Ds}Q@T-BJ2)fVVOC_ZK*K=D(kpqD zTizQB=pcMW2K$D3YA%aCyLSn@$g6$q$TzxzCq$2~K-gp*ulg~w5dz9zJ6l#qn{dT0 z+aKs-PWBS{VvD*GPy{Y=Db5Sy-twJz8W2b_wC4^1_k@FL5%u6fHdIR^*S?kVMxet2 z7zY$q1D*QPAg zRrn)0v5@4hlq3R^O3&b7`C2IOL5ZWb@*z%+SmctA`eG@9eO6KY1p~LV0&h(@w`Zin zMfDmo-FkLwR%Y7=w{z2*n^pl=b!^^EWue7BzZ=RcLO<)r&VE4*HEzc1LBi@R1}^v7*_WLm zVNCNj>CBTP>~r~1ArGNR4u91ekb%Mry-r|FNFR8mP?~kI)dcZ%iT+HtT=fowoHskY zj={JUJ91t2@*Z8Td=Ej6jwN{KDuopIg~B#r7dy*%8`31o~IwgJvMBH zTC2|?$>m)#Mxu9B66@-Q+diry}7qg5W*lkLFPS*LGReJg3LrXP4{FfV&b>JYiD zA%Z_*x9IOQlxw@R33gd3<3@x*8y1G?yUeUb1p+7`U$d$Zw#sfA;&Pw=v5`iI<@|Xe z*(7R_?g22%FLcNbiNMK<#=PC{uu{Pv3$dmFTfz1{cD65AOtY~sT(n_gh)AN{U&hs7 zY|7v&9E56M$7Xy6fOlHF9ZS+A#wEC`?32SfGzdT#+G50@{IOV{b1dt1&MphqjT7 zhASXutO$gjXAmt-$U5t08tf~12ni)<;f$$*@MXK*{9pty;QWynbh-6qgFBhE5g-X) z;8HDECSM~53$fNgZ*p^RoK;dJO;_`lk)22Z;5`c5Y~%K#>UmJ4{@AT-Z&4^Nd{ghb z>^2RD!ett*)wr##;Q~ir2mua$qQLg;zllm6X$9hEv68P+0_Ukph`Z14g3Gs1r$zEipi0GZq z9*DHR2WnPhM^@}If;`Vc5a{Ja#}ERw^Fo9K5g~mhLH72ruT1`aAl8QR%DA^}DGllH zz^^Q5P%A4?g~*7u?4W(7sK6QbV4cTZRCI~Wm7(jD2!Qp*W_Zty zK)I$#PDl$bm8DPbxQfH^q9GAB-Q_g+?38z4BwK(g(>kNUjw+wPhA5Fh_;^KI$h3xq zv4(aA9oJ>E6dUo5AdC9IY&@?c?ST?yC4A~uvT-gwnn z<_V~u^Y_;aAzI3I>Vd)tsP_g{oO^SiX09l6-KxwsCW~2yAW`K$M4QbcVvn$u% zt6Ldtgxf4~AB~nP^t@Upc_9%WtY$-NYe0$K=LsAd{bzm4|snv~>M0;UTU(( zHCSrf3n$+GEcOlh?dI1G?u2&3C+>#L&vctE{UNFAKr0}WO}ZmLAQ8haQG&hhKnCgE zdG7)L-TP}>b`jrd&q=`0Cj=}(miy;36ngzWN8WW#sxFteEV;L?Hy(=~7|;^Oo6qPTo> zu?CIprobti6(H0PBaMS_^e2bLYZy9E3N;z|jm8=k7f7z$1A9>|shHUR4YdvP=M*1j z9Ons`eMAYor!r0hiFx2(ybn2!(`+N|+l~3*#&O$o#~$;OAE!a9JvGz0qk;ZA4XHij zH5ubmj^j1;HZ;bm2gRda*&VMbOssXx*!Mf74APnwyq0qcl&6?03WpkXk9#ASGD-rm zFQR(}<8=tZAn$RtKwqUl=>#|pU|}nJtDxvKT|t?Kf&0m@eOWx z4fN1&%vJS&r?=g}K7enES4+y7uLiBk#cCNTFA-(XJ9$Sb$bo0rcfeeehXdfnDET;Z z6P{>C`wjTrj{0gykk=Mmo~~ThR$iL|&QA3>I}($bt{e>dCRIJ4Ba870mnMY9-@@4@ zg&jh(j*|48Y6d9L)%e#ZILQ+}!5OPD=8W)@>nt~{q&93s%WkyXg79@e!X2 z(s-)=%~X!V!&0C_Wiw5<2eY{zSSgD*_ySHor*o&W{g3qT$v|QM?0u%~BWuh#E2MXh z&KoVIqZ%U&X~~ohzf}RY3Bl85Md3&&Z^S_jr4&*oRnx-UFSJ#rLZ2$=0~}LXtHIo1 z_L`f34FR!F?@OH>QbSqF$sC)h;Zi}*Q)e2luWHZ`dZzMhkqdIF2H(in5uM7eH3%;# zmC)$fD?}2nTz|`S|@T1$zUYv9Ix&Z7QnqhfBiKKO28D1INl3yJylyn1`tzEt_Fl3WTMs z37nwOsKy^e=mQ?F zoJqWUX=$Qb1kdFybY%Y<&<7T8cuGT+myWRpe|CZ@)rnsQJ$>kvW=~}o?)D6i##QKJ z59sVfs6aO`V9Zvp?(flG$eS93ABB8uM&CK$Ce|SEGS~cX@vo6F<;?Y#QqKJ-UbX#i zv0ouGOrA5)8w2xI|69zhpqKj0(2?>(S^P(3rUtUpi~sP-Fet_$?#LP5T@SvimD+*v z^q^PTEjs8M@P~(P!Y^%#=iDgm)J8&g0HfMC21T@j42HvYR$U>rMJ??j!CDKfxE_gT zIMO~}eyio#UFhLDAIm2DY=hVaN=P;O4d{dxR*uGm0IMP#yjcCXcpY%lp>71FJ@`*) zZ3Ye0+CcV3aJ`u=JT0ScdQ=e~Z8@LjA5O@7bYfSbWqHS7be)i-r&AYr++RcM!PDlnvk> z7Z&{}VPhUvpZqjso-E#g1rVf1{JIyQjqjlfEWh|Q@0nBjH3Tl<8T32_{KL633+!?= zLcy6B=PFQ1T~Kd~cGElwq2A2IqKsa?+RB}Y%ry=c2-F%vXF@`#Ien7aFs)L3j*bnV zwE~7NV^Wkf^*Ec*XFDhg`-y<_qbLgbsu9v%p)rW+gvEMBnEnyeR~EMCOkw6K!yHpA z;KR~W+rmOh!XvSCyrk!q&Vq5A!&rjRSlBM9*T?$=vM>Xc3r|gDcmYMrXla{!>Zc0F zX8hLPycf>7;tV1V4|ic}Q#QgsPx0!j3uMTgIrj6OgqaES2D)%HWuA^;vnN=^1$tbfQkfJ*qySP;=%$Iulz8~%nF@-oH+Ie#@W2p- zox4XDN8WB1GoCpm_f+xd&~T#%>3E`PnhNJ^yddBTjFZ7UMVkD^H|+uGMV_E(;;Y7=-MeuF4VR9hK_R>FNBRP~JXk=N2MH)p zh*F?=r9ksa!HwXH#w3MYqtD)pv8aLg=kbaB9*;}^fAQi*KmHskJd~A@V;xP^jSxmg z6B@14WCqVEx4mbybR*Pe#wbAzo(apF_hcA$BmQRGsh%&C3=cyg^hR?9Oy2n84NG`{ zA&@SP;XM3zDhz?-1sDPtC2h0@di)-(8y=3)GK;@7UMQ?DUB$=mE-(h;tBhyS$7e=> z#T!Nd`6n{ss&x=VT|jZU;F%uJS9hRRHw74GkW2KYr`jgtzAHUk#+c2g#?1&Kz!=`d zIu(AiCA^P$s+L|IX(^=ClAIJGA`mr&X(Cf;iZaESS$Zg&oEj918)%S zN5!yEn>|>dpB^O8xADa{>|%MC6*$?EEE?NJc_R<|BM%l(*OMjzX-}Le#W3|%Oi!PX+w@eteg4TC;Qfr=Tz9LvF71Qfg5@}JV?qW#7Iox z^^%^`nVY4*@g8zG% z&*OY=c>fsd{|_?koJLIXE)fYHl2;>6YDHS;8O+qN-3yj}zTi;vm|2G7)YD0LiLwggr$~pd`4uAG}Mk_>1kLAXT8qLn|&c=AHyg)gKBRvxwK!U~G z-=S(k@Qms9+6D&}dhDo;&cj!slys^=QDV@6I zZ_W)y7RESgJaf5!pOqTkbli;eJe+x8tOn`zGbJT94kiqhI9=`9j5Jx8AIy~po?QM*N+g}2z0=e;8aK9~}>SEADM>cXiXf=hAP#(HPjSF@* z!%trX%E_J4t?>LA9#4s%Yoiqy5n~tZl!Yi*fSv*>gEqiWk+%^?7j#>908Lz@Co`or zROjtsLT6Ij&*_-c&bT8L3!o=GwLg82e^X7r{TZ><{%ZL_G;&0 zECrG^g=6Jtxg!{i#+*?fg6lz*@&bJoNXdoZ2ctzE+!GIvCUlq8oY?@4qqPe*dGrPv zC3YkpQpRPJjsdmU73ECfH9*kT3+zgxN@~HLvK(WD?O%_Z zdbJuR$%9qSD38GT%fnBNCC!uo;#pkb^_i-@ddHM&6zZ9teu&+ym?^qLJ@)j#;Le*$ zhh7xWD*}3wqI)cCZKhJ^!q0K{MQgmhBlV6vrnT1pjNp)eRNa)BW9o~k^|VR%uNX4~ zYco9*r@vAj%IV0^>+1oaQRLwUT?9qOb81v|BH4&v&xHodF1pWZyCUG3I-g?b!6(=S zkHYYBqQJSS#MZhz(;7Vmx9)klxq!806=-HwNr|IGu1VsgF9~?^2xY2CT zftd+2eNi^k#}d1lVZp0h18jVbhE;h5Q!sbrF_DL71!iHC@FuAm?Vu@e&;HRL&S-tC z72a&HR*wS>U@9^p*aWW~FivU5yitl69E94;VDPAvgcYseejQZ9YZKgV5OthJgGN(? zH~K_b3ZBD(oL3ttQ(+K<*Y@!=U8kuWE1cl;S|2ATS=2`ZH*@^$v^I(x)rs$)Tr3 z)DxOcx!(wP6pTA$&MRm7cMGfi+l40S-yTeCxKYV=bUEbRYJ`(nq<|p!%OlUx2lc zz5qUgzRY<12q=f@+qeYFLGpvGTeT(Bc}OO1d#jJ4RUz(m_~ix%-sU&vfkqUHs8-3MpMGsqsfG@cw*5FV)dP(?kXLSi-Gp*vwjsckrQ z#7-vAbaTN%U$W_lr|x|I=b9bS4D%<|BI z@r2ML@6@8indGHX6-o|MZ*YxeA}NaAuqnL3Q-O)a+|)8G<_d{zxIzmPOlleO6{r{9 zk}7`A=2dS!?~*sb5UPZq4nh@sWe_ga8#7$zTm}%N zHO%o=z`}Q}{Gc$k7_&p|)QhlqW3XZ|T()Xv0Amk*2rRfX>IBWZ(QZKI8=rUrlo-I3 z2zWJ@dmu#dC8#sL(iCJXgYllFJ+h1Ghi;gKU^58*|KKf(%ck;A2vUEWMD z!Cr{|cbP!->V43{nZVOQ8>GC7dA(lAwItW3s%x}j`onjn zMqk0Fk)UN`&`5K|{UYwRt2{8M21m~vdwuWk@*)Te?a)uJkr|;*W`I@06q+)>Jzl{* z>$gh}{rJBgYX01N&;Q<&PY$-3#J^pC^%YYW{O2u+w|(awFZ;LOU%oq1l)lC-D#cF* z|EA(!CH`gcFBz+Lob)wOq;90zIQUmuRP8!d>Bh(`QyMKw4?SAMCPR;+buLk7$&y5?mDm_=B<>|T6S!m}LCGgBm#4*ecN)w-0y7g75$BGvbbTgA% znB30f7jBWu-vdkzGP#qUdgzo4}obSyL*alf2JtzLJqxSZ0NF-T{1fhS;2LU;CdE3+<<>A_*aF0 zmk`0PnVeA6zm6F^cQdM*I6ab7asrx|aH6j!{A!l276x9+2dAa4MIn7{LekRMEXgyK zZvVg@PU7Lcm|Bc0eJufhaf?bw@vsxaXcKsf`Gm9}LIX*OB}|lzC@n1#cxlu)ZfV>& zso_{U7C~cR-2-gHNuqp+xe_KRz^jG8JvwE>mE=olyxMWgQ^QkbxWm(=|D+Zmz8L#M z^3aV!Oj5WA2xR!QiPe$x@N{&P9zLf^pO_A882fOtMCzDhCHtR^{s)+u%cM3|#7brt z%5)9SO%HvssM-)JG%Qq%3(;g~Nb*BN%)eUmujZq5+NO?7-oufk_uz5;9ik|@>ER`I zwDsDyQhyo}7y|oplXz-)A+r-eGoEiu4>!1ee&`_=O!r*}%ZTWwU00j)S z5u~SvZWE3vaYKJDnx%u{WGoMoy}RUMIr7#}#E7-YiP_i75M0NK$I5(nDV^sg43YbKaCu z^M>2V^w&Ygr@?eV0EgR%aayU^ll!%k`yu_)N+}i4GjiY?gxjC=@HLPc6gWz$fIgw# zO$}$F3669blOZPP>T5ut4PXWym%@W0bvH};Alp2t-QFU#PYV1=>769vDTo5}2N^BW z=D4LrVD`}C3H=c*d{EImh-xQ7T*F!78qV@@&`MQ;w5Eo0GNE&Yl{d)0^zdfOy3KYLpu5yps4bWPT~6w6YPfr%i4cNZYItXf ziAuGW64EF=9j)00nbKly&F0CX%JlFcM)*S1K&#O~dg#xk3HeD6@5KNhx-yK-RK1}W zhTdn+R<^$toG+rtp}euRzSczf9SO&L`|=52TDZ3R_K9^r|H85#PI&5-^FH_PU6J$zWE4+eyjBEBd! z{16a8C^4Z&F~f-}$sUuGE~F}ET(`7zVmy`}KAuPqKjx+(+Q4;OA9_kLA1{kT3yu>E z^?NMc76(svriOne(y+5C8h7Bd7>?ohPGl*G(WPB_~Ly67?6}qnPckk)n5G7wt;NE zdiM@|2s7JXjih=Y*H^t8pPB33U7g?2JJ{7(jlUYy-<8=bwO#T@DosKt0=72CY~r_! zt8+co_!|WHFj^L00qe}8ac02Bm&;do>fe^cS9Gdhp6%~Nd$04J-s%kgu1Yt)E7yVE zyR-PH9To@Z;(Y1l3dgj(v@WVM{6pc=yZmXs>aOgr42H?!fjapzo4LR-a~ii*<9mSF z^F8YF)fs7kFBMhed-H=}#K4Yf`MREgRwvwyW3C>b7VWHiFh5Y;o~_Q~V@+T^zL+W; ztj_dQ~aH;&C4SauNx=ntZheK*4)RpDov7{h(gQ@5&WS`{U_bW%JyjdfgU zOrKUIt#wHd6R|obnsZDQ@ffAlnvXk6t78u3FtzX9seOkm^e!| zN426zJ_PJA&YNKm6X`mF>e6-MdiUK8je+D>m4ZnyU?u`xr)s74i53q%C7v%wwM&5b zk`h=yXd6rb8a@VaNjxr=SHwE$!vCUQ>FZPE05r9UTvB(qDA&f6$+kWcn~y$0f|| zcZg|!47f?Fm@IIc6D95Uqm`TP62EqBy2a}p+#O8N6vxv0rzK$b_ou86rp2Z21Z=ns zYjr_CTTCo$E2m}uIrvHMpDUh!f2}lF__Fv!wukQrrv2w2$U>kMD@{*#)B6{u+a`h; zUNu%=h$7mwAsR5g+rNZ%8&Gx4Rb(EUG?W5>@ikIF1V9e}%;YB+#{pc!o?JL{`vg1H zu{XiFdCI1c7X8`m7GaK^#I#5}9xcU>a(t(aDoUuZv)MGgKg)cbFr^V`YCkp|K+sM} z2hk?I|EAK@;}c3#`}d~zwV+g`Oh(H@djBBgDUyiCV~Iqm8$syfo+jQH3pdQ(&_k4o zJvQ7Zi^mfvaPEL2-9{#0QD~I&v31l4vP5PE~@!wmm0)XRuaEM_i%lbj>qIjOD^+L`9bEiIhMN= z#)UGJk4!KwETaCOp@sx-dt_Q0T#=^+7q%1~$o$ZJQZ2EpBu3hg)c!jm`RTeug01Q} zi!dam5(nKyCr$mYOPn1q0j)!KdH;XN%lMGH5K?eJ9F|~rr=wgbZ*n}}zcrwAT z7_AyWk<6@?haU3EV3!LogN*|4CjuHzkC(WR1$l(Od$?wPOrE8=0MAq|AU-m0lo47k z(T<_putF9CICL9Xxc^=ZKAPTl3v!$R$nU-u7=0Kub|LcREr^oUrZTnvKBvMY;s@-XkM#roiC!WDa0t=nG4Qud+z4@nB;qv!)Q$Sh$p@XnfF2>xOYFGVdx`)6FbV}tFxJo9o2}c28gqdUrojtR=r~ukH*@; zzxja=$s#tvhh{@4+wq6mK$>9Dk2quf4>o==y)#Nt1uww<Kv+GTo2M1`RVbw3hbH5n&uLVx~%{+qLcY z2g*+~hhQxV{mWh6w(5@rm~W64HABlk{FGBQIav}5p`We0q?5fnUM{HUVMO_tRp<9-*`?X`LE0dGV_++{ZJ83D`zv6&)NC);` zMq^>DLs!la=NA2AZFnCM0yWg(vD%V^;R73M3?FcADb@gr6jv%0Dm_i&pCp`yRimy@ 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%0An#yj#N#!l?OiRN0uMO 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 diff --git a/SDK/NUnit/bin/net-2.0/nunit-agent-x86.exe.config b/SDK/NUnit/bin/net-2.0/nunit-agent-x86.exe.config deleted file mode 100644 index 84c2906..0000000 --- a/SDK/NUnit/bin/net-2.0/nunit-agent-x86.exe.config +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/nunit-agent.exe b/SDK/NUnit/bin/net-2.0/nunit-agent.exe deleted file mode 100644 index ec41f32382a836eb24b238fd8969cf5811760925..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7680 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 diff --git a/SDK/NUnit/bin/net-2.0/nunit-agent.exe.config b/SDK/NUnit/bin/net-2.0/nunit-agent.exe.config deleted file mode 100644 index 84c2906..0000000 --- a/SDK/NUnit/bin/net-2.0/nunit-agent.exe.config +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/nunit-console-x86.exe b/SDK/NUnit/bin/net-2.0/nunit-console-x86.exe deleted file mode 100644 index e08ac9c81d7a252455cddaba10fff7b0807c33f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 zcmeHKO>9(E6h60qmSP(aBoGxZ7Wr*orbGE@@Mnf;g(Cg2Gqfri`Z~RxKKtgq@xE8u zvLKC#CKzH|7);!{a%Un5XyV3=Zb;mi;Eu$N3ln2>rHS~R^QO#HDuI;=;dbu#&b{Z{ zbI&>V+;?7wUjL99iKq$v)-9rIcyh}K-W`^~?s)pE4!W}L`i^Vr)b$;OSufHR8h-VzU@y{80-4Jn^$?H%8Jl(WGM|Tf|6g%Yb0{HuSodf%T3xeh5La zbrMY01=s6ahUi%RnCS|~6^(6cpk}IQqVEs~&Iy(52I}71rj!yJuy!Lg>}iLwZTqQZ z-}Z(*9iaCe%bz@^STh>idM@pxoP(*u>BBtJOg``m*qs*;7Wl9My)z$MFDOMUkwT(! zT6CVy(-F|@V(0PGgZ+4(z<8P09`nN~jJaXCI{tVAt>eL;>HuvKzX--ih`<+Xc)Y$! zvvoYrfle%Kp_i#2p%3Xz;3dIN1-}veSx_nFJ}G!ua8&T3@>C0bCitW3ht`&c-J(Cy zp2TAVY1)kl@Mu&s`!bD*1+y}GZ|elSP3-+eZKMg>Oxpx^2<{c^5$qGp3JwasBKR6` z8@a#@$Q<1ilLkH*#a1$K@K0zs9Ck+DE3w@N{0iC1gm4m390On}|c!nlb z7d0&>dDKRQ{Uq&MIGIE<87n#}1ZUfdR44tGgo5a~p>TTMH!n~yA9!(hF$|*6H{FXz z4moDgP|kOwsE3A6gX!cF=Gc4?7)#}-7+T+(qWn@6n=*||y=96q4Y^)GPB9K`mEnw; z86O-k3@95#raa{@^_!?@y$a7|V`SUZd~9wr3tsG-JEyVxj8~es?%JycgPG8lh3Wd^ z#zt%E{!d21y3?lY+PSqht}I!vG#lT^8nuXCaScW;ELYrMskR~sl7raAUfCd&<%;JU zn>Y5HS2PhN6Jq|D@!dtCqT2fELeU$0Q=ad|b=vPZJjxfcg;{Id>6!}H;!dxYM5W-P ztez<6Nu!o***g5g`9fPXvfQ+k`Ro1P6}4VH|Hk;X-kTS3V_Ki;fS791N_8-_HgPt! zUjF`*?N|RexzPBCYHgPMdQ4Hfq)vA=b?}zL`zq}mbb3-wPfw~ZO|(nV4iVBQX0DD` z4nl`BI?21xmhh(eQql4kxv+W`dQWbzPN!1oZa|;T&AP}%qenwzuhZVPwp_11>6T5T zCmcO&7Un!V*QJNN;;d_YopW?yA?(swA9?TTtfR+68wPO{o?A;_iuXVW2}Hh06W`hB};k&ei>fC0sJTvAt{>lEmcXkj}m zv?Sh?XcqpE*uHvB(;m$3#fu^>@k~>9mFmM>4(s?lefVQA9)-@tZwFqt-Iu;ztUp;j zj|lVxVxr-zp#_?Qehciv%n<0J>}#+u+rV-KNQJ`BO5E9J5A#{!j)P~>19-_Na}Klj zW?$;IziDV2#lD=meEz&M=cM!QI5qiN4i_YcMzDr0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/nunit-console.exe b/SDK/NUnit/bin/net-2.0/nunit-console.exe deleted file mode 100644 index 1544a9d831c682670bf233f02c88b2dbe8854065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 zcmeHK-EUMy6hG4sTncUYPy&A7V38DPZ?;Q;G=A-}AQby$cPSty^maSlUVHc6b?z-~ zeIShyqlphbX~K(7zWHDx3234*_`(Z`{s$!TVxsZIClkTnId{u$r4V>Cgz3(iGjqPr zoSC^Ddh1haCZZPf+qa3XVC0q+cz>`2a>w)EbT6X3{j#gkvLH!c2V20%86(^oEv&_l`Aw2uAUB0z}q@ z&>LHp=uqRF@d?f=8vE8ntyI-SKOzqbb9A=$P;GNsi4Tz7NKIYsaJFqPt=Y4^sjCC{ zohm>efd_9+O($4<$!OTH6(@H+zB?xz(N6d&Jh2B|+trwId=IBD9a#?hqC{P+W zhuC@a#K2*USgZEVw3a7-t9`U3i4D#$O*%w~=j+fJ=gu@vG~=9x zqm%`lrPF{P3H(Cf4+3ur{72wc#XS224hp=Wj9Noq3j9T7q4k#P6upV|Bp(~-S?WXv zcs8n;{22|42QxDJaBBh4vR{gBs*O~jCuy6&9Rha?>=oEAFeh+8;F|(Z18yT1a07V) z-xV8c1=m!f?c~rtIs>?w4gfwwX~0ez09+^dOY}bQJiVeEoSb8T1v&|Mh9*=uwJdS& zTH$wbFI+|Y2|*^=Oy-JYt5)DaAD8dI345IJ7l_GiIiJP`ogpTojqg zq`!FBL?!E0c`X;C(kAC(bB9>;V&B}o4C~WgdCt14OAQ3mp{)qf^~a5kR@Hq^LeaWY zrsCS!)eKh`tyi9j?tY>Gt z^^jMZagDF@jxNrJ-8$!^<~^Nr^mu5)AdbRwtLaO#-HaZc!7fyF-nw2HY&qZ8V_YVY z9y1a4)l50K&J?vuB)IPst!)S@rD_lDcD{a!OlgKM;1y(P6qZcoR1Wps=XJy zIRWFEvAf&yyFzp}AKD`eMvkH!Q)8SdpYM5malA-6E7)W3f5?E6_jGIW71iKS@!BY17jVjQN|fph!5<GnM~a}jSdBn;DF$DNS<=34;qM3q zpJH%%STC=lsYQ6wc=eLMKAHqZ)F-cU9{MU&6&s6)$i>Wv`e8Z&jUIG6;IYt6@VNu_ zmc2a;&Iqq9+pezgtuEVxH*q}jhJElLz+nt^5#pI5GF>cZ-7 zTof6}V}^QaSU=YCkmG&y5r@Hi6grc59YovqQ2P2Hf4sI25%819g+`2q=JDm`!OARk zV`T_|s48)N#-(I_Hmf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/nunit-x86.exe b/SDK/NUnit/bin/net-2.0/nunit-x86.exe deleted file mode 100644 index fd342c070ace450cfb50c83775d74b018ae7f6f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeHL&2JmW6@N=fE-hE8f~0|sw)VJ60y&lz6eBwk8l?MyKmqC^X@R2p2Lc2I`f+Q3_TXDCIoLW>{k^xOxTF}h z37SLEj5KfF_q=)YW@o^;@4P`hMAVCZa6t4fMs68_$AcQggXexXNcT>@cm7@D+I#2o z>vo_jzE|?CvMO4x>xHVIm0xw0?W*bPORDUxYI9(q|A~g{g&Cr2Mh|`I?{CdDXZwH> z#wjC7gn#;C#QpA57!`U3oq@uTh~fq&@$*PEbnv+)DDz{YA^C5O4Kh-pB>XNho*{a0 zvcZfGD~BP(x&IzlQTR>8B31m^4MSV)}t!1SPR$fb=&y zhGxqkdehgA2SrKO3MB07G4xo=5KYBMK{K3JG>$DneN<6Izvv^W34@5E`$X;0lp!&| z_7O^q3?ShCi*(}Yvx$*G;7?C2U7a!rQZ$bBcG^stmr~EBpJh%TIe_;d9{vH+f;D`^ z_)_TGZYf}m$55!8s^J?;^i|;4T^hb}V|E(jC}@ZEryQ>Unj2ggSH7Ge+1h>M8G0NH z@DYrp2=YVvR0C%@^Eug!a~dWo4fra(4EVahp9_3j;GYG4D6rpPohJppAaK*TX`G<9 z1pdKD!|Q$HocN8rb3P2La9g})KB?~B<(j?WR%T_Ht2#NTy0IQVfssy3Zm!dyw$3s zUm&;Y+TqyNbC*rMr77oFK`>79H^4NnRBb8;MbCHa0xfL^p)S+)!uNDBq&drW$t;GR z-w>FKdd-2v_FT#afi4%E?P(npeY?WEY>3(_R6~6z%-f-(kFs-~yJnZFzSZ4o)?M@b zvIs3_S^Gg(-ybW;`_`&1TmDA3i7VT_U0M&1iWYq2s@O%4^U4*=-ELV#Nir9!ZfKXa z$#UD#{*v}@+eIBv#E|e8wPS4w7PRaehT=E03$|m2G4F?4MN9c?e%;sBYRlB}adIP# zQq>;AUEpe;vX#n=8~WQ)3O!1O!mnN(cxCFvmul%hJ-Bu2Z$F~sJFma8d}iWZc(^T_%bHnyGM%A2MT(`8Na;C~}dZQ}qptfz5HPy1`du|wbx4ZdE z@w{oZu#UV}RL-~T64bJeqZYX^0=1|E?4({b@nJLQWNal#Lq3;8XZgF5Pdt9pw<`0V zJF`{PasaSh-ezE=8utKi#607Qv7@bdU$i8zhO0QFN!BgWd!>i z{4ZpnNACR*900x_@g}J8{kjsps$vUB$QOMJ{2p-MI3mYE{2|fZE_^^!1qi=`7;K`=QzH_D%p@#@+TB z;0!GSo2BbC4|*2xMc~|i-}~V|Ii5abB!990aQvo7qjza+TH*3r#ei3feE6~P=F#x! z(i(Xpe}XuWJfs%50pu2i(DOh=?d{$qR1CxvLdyof)Wy?3usH_q?B?GD6@U{>$g3g; ze`Tu39NSot1xkzidAb3QHhi1V@!^|oPQX_)+G%J8crEbUmA2Sgwz$e^AZD`+8y{A! zb)@0{68gBjE5>EycNVwj@j^2sE1}rAh|h^d=~A^3;}~txbMhL|z<32eGw#9m8t{@> z@k%SSEzy=}9q|(0FP%I^Bj8>jg$OufX&P%_li=lG$NS|Vehqp7_MYsViBtwdmN`M zz86tduR>myd~U#kTdQsqe6lwSovYh|r9=ZhT59GxY&cRr6vmT8aWy_I_F1f!vsT9GbWo+dhwUfjI3FX( zokGu`8}i)%68rA)_nUjvYSEXsRwH2O_ye-Hw}+8A_yGX_{6l~Yfc%@l0fW!DVUA;4 z9SsTqchDGV&<~m3Y0&%iItxW%7wSy!92`7k1Eyhg91Zn0c_&@3@5kj3chI|SbiLk5 zAMA6m95Uj8c?Z3VfDxs%`Yz1lv@AF#KT2bThjK_^9zpiUSOhr_M`>Yx3h)`1#i4ty zbFO2B-mLQ)@MimO)%jXS>r4rkWE08nJ(OcJA!#V`Lv(DpBS; uJ+{-$^?dr#!0}gVNV3E)pacyKMHIh(_`TNFRP;N{%H=lh=fwX>2L1&N^IYWs diff --git a/SDK/NUnit/bin/net-2.0/nunit-x86.exe.config b/SDK/NUnit/bin/net-2.0/nunit-x86.exe.config deleted file mode 100644 index 144497f..0000000 --- a/SDK/NUnit/bin/net-2.0/nunit-x86.exe.config +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/nunit.exe b/SDK/NUnit/bin/net-2.0/nunit.exe deleted file mode 100644 index ad8b08af381ca783992e342487e6705bc79c247d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeHLPiP$18UJSWr?L_&3UNb?srytpMULfRwUHClhIH2})sbV#TkTpVO(33KJ*_61 zo!QLHT2d(OURo%$U?`+^4%M|R0j1R7v{2BchZaIZ=%GiGTnr8Ll0&RR)Zh2bu6DHA zh$J+Jggohe@B9D0_r34EdD7fZZcq;q^`h_Y61|0yTUy}ZpbqiScm6U&w~xF%@|JPw z?UBNY9jL1Bm3^zCN|x(-p(<+S*IZ@0YWi|sRlFr_9z8mEs_8m6Lv+dLp@-i8-CS$7 zyOb~>t=NQDS~pJO~t zbni%u85^(dg%D$Y3RFemw=@SpKieWOnxS3~F&6p(6gsc988z{YLB4}=KVO;oTf@EuVj3?;P zXl)2aQUtj~!}J4994aE?sC=jj6Ab%DPT_=doD1^!21zri{q0>3XXF!Dw} z{Z`-|!-Utn#tHEodFOl>SjjOufebL7Q!IXso|Xt!g!<*TGSG?Q{fF@|WuSjt;E2G} z0w)Ac3Cswb75HO;&jTJO3vifhfv?CMM+8??qLWzX6O;#hgq{REK}o<-$W7#j@gLBu zfLW0~N9VAfJWT_>Ky$`8_12?08l=J*lJ-X|lA~@lgB}xJ2dsWrmSNH!351;VaA1;O_iYJ`Ho$r{6-M!3SBO~tV!9S@RpwOEn>4jp}vo%P&hyIk|F?pCwzvgcPsXgQ18 z54!sPL_xu~mUPAPSG!GI-SF-5N_bF|^O2`g7eUsmR4sR-Z4o8OT&TIBUC}1XZAbfg z?O(S`I-rOl;V)>%S{E#6+cyoxZ)g{7#|~rOWt%8p$P`w5Z7sFUEFULUq-V=D`z*cz zuJ$QYt4|6m{`(JRUw`?P_ll=_{ze0LUVU-#_~hMR;WP|ElUPlW4 z`CT<3?}`Z-rwF&T%*Ssp&PphDF5+`yQMy#yi&4|MME+~zHf$~dFN-#>uu2;eWtmps ziSTae-grD6eAykp$>IX4SL=UA)6_y5f5gRr3<$70Kr+ zEV#AnMZqU~v(UM!EqH2cE39c5lD2-kHltVaW!P|}d>Xh`TD8hlRN38XW?bqz2U`#G z)sXivR%P+{h|*He`*l03`mmaw7W)iV$=RylG&-nG-n;!L<1im%$eBVvaN#jvpY~+uInKgFpE3%YXRG0LcFX*k$kqH_UNpYoI{^;1(JqP5M65 zn@xJB(O{t{Y(bsr&E4JmY``>(4x^#IPu@v48ar`0#2xh3KDyE9q<42XSPmKSz`TRr zLcoYpT4M|5aatA}lOLq9!aX^pFpnVnV=RK4hl8{*KL_}N%VN(x*E!d*LT}Z19eAt# zzv_IsqjjbPSwsnL?(Sgw?(g1@jg2O~6^+=xTbs8wcQCRKE|n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SDK/NUnit/bin/net-2.0/nunit.framework.dll b/SDK/NUnit/bin/net-2.0/nunit.framework.dll deleted file mode 100644 index 6856e51ef08a8e681896c3a84ccbeea8975d5947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139264 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


jGx_)XGKVSL!mZ7A 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 s;idf~4WfA}|OOnpsbG<<@nYpjdJ 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 K#)0=F2mTF_u(`ni diff --git a/SDK/NUnit/bin/net-2.0/pnunit-agent.exe b/SDK/NUnit/bin/net-2.0/pnunit-agent.exe deleted file mode 100644 index 7a555e16c9e73d40be60475b21cd92580babce74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13824 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 Knf(7c0{;V5qqk20 diff --git a/SDK/NUnit/bin/net-2.0/pnunit-agent.exe.config b/SDK/NUnit/bin/net-2.0/pnunit-agent.exe.config deleted file mode 100644 index 5ed5f7b..0000000 --- a/SDK/NUnit/bin/net-2.0/pnunit-agent.exe.config +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/pnunit-launcher.exe b/SDK/NUnit/bin/net-2.0/pnunit-launcher.exe deleted file mode 100644 index c70e58ef13579a520e37d2b190ecadbf73cf859c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 diff --git a/SDK/NUnit/bin/net-2.0/pnunit-launcher.exe.config b/SDK/NUnit/bin/net-2.0/pnunit-launcher.exe.config deleted file mode 100644 index 5ed5f7b..0000000 --- a/SDK/NUnit/bin/net-2.0/pnunit-launcher.exe.config +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/pnunit.framework.dll b/SDK/NUnit/bin/net-2.0/pnunit.framework.dll deleted file mode 100644 index 6c105d70f908dc7047aad6fbeba58162189c6070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 zcmeHLZ)_aZ5udlacX2N95sYIJu#-(4sx*PC^AA)tC3ftD7!t?$9FsJa!uq^+Ho3cX zclVMw(IF#9X{4$RQX3K!74e}}KeQE6X+agBh)VuKiQq#~3sp%4MXf+;K}ZFJpud^7 zdp_rYkk8Gt_qQ`|=FOX#H}CE4?fmvBGKt8-_35WXPvg$5Tkwlv8shBo-)HH``7f?` zTJ3mo#qa?yv?l|9B5+D}!6}#h$R2g=pi;KIvfZ~UZnuak-W8)|lf9_|*`+O${KYlo0o-4Z`; zO#GnLuNtjYgk<4{Xsp_dW(8R@w8*NMOpAOPak87ldHX8+h`iB#+^dteVBReYDd>eO zVLPTdCZfz5O2=b5FottY#&Mpvmgxn-L~YFK(+C~8NykdZd8xGiab8m&OPQwCkAAV1 z>0_m#_S4I#Sw74|5Bs*uqWy8MW(RTH!C5$0=YhEjab$c1KgUPYN0o4ojCt+z$E-&F zlx!2E7P*)cEr%!>OLWk2sSX!$tYZ)oo#d1!Mov+>&Dsl7J1KSk#d`1rS-1{4SoT@= zu8HkgDIfkob6Kkt1M;>df9Dnz?_53y4zJ5~TGr((ef!3Rb1(q&f@f4~0H0__#U;-``MA0{^9+M!CMHo}ob- zF4Fgwyh20h*KH>CR~o6~-lBcHp3-JgZ;>Ob#q3P#9r7@bZZoM5F%COb+Ds~~CiVJ* zXYMd^kjPrp2%_F&GtaZ1ARM~VW>R@|3Xiex+sv};7qpm`tVp2r8y@m$;1GGtROV4t}JLlaR ztxyBp^Fggg(_pbt)SUiR&@^cy(4x)26zYU^ZV*jv^Cv=ck3o;rSz!Cd9Gjo-=L&iS zaeqy4E$~(PhR{8N{epK3?iF+dJ;Cn^P6^%*e4S1LhfpPq4+~yP%dIz2oi|%A12+oY zD|ol`IMzSWe^BVdf+wtZu$oL`O$FJ*v-C^rBh;8h&A=u+3A5OB-=Z96^>QMio_erUgvZgu9M9qtyKY<(C1)WXJ02Td6Xnu#v z(C`{&9;09JAl)|Y^v5bi_jZ~rSISv+V%oQR(pnC!@a(8%TS5q|LN8b2UJaIoF ziq+x#ECVyqtWEY*rs@epw=`Ou5{7$+{h>-(q8xOPmr$IM$kERVwDqW4s6_6VB$4{V zd?n6QxXtm3mB6JwH!K9+WaRm<$EZq8#b z$Dt6CUYuU^iaT+9TaOl8ZMh`NP>Pp}z=n}ihUq)phb?-5K?tisBqS7JWyPXyiu>{MRg8ex`%OCj8?|UE04KHsUS5J z=zTXDZo z#1jo08V=}CG;la}mhk>m1|OlnEZVlnZEzK_MQewl%^IvZ4m&K<^Ln5>vF-x*oD;o?anon6vTgET<9WAA(5i3>WSwmfac!*E0}kLi2B z4O8n@X!qeGo!KGeft5^~lw~WGO#wR0dA12`YD(LN%C@wp_?AthGn;KP(;Zne-LfcS zr@&@AvMq~vP)np|Sd8D%R)0@cd z)@oPrOJsn*f#heS>AA|hZuoX2YUpRZ?YQ=IZ;eT;wpAn6g{wz9Oh+F?{z$wCIc{4mxwVC@cdx#T_?aZEl zJd2I18{a&$x+BmHpsi0y)>(^p)h=8cKy~3QJ4fq5uak@AJMdkkBszVbl@SYG7l9?% z!Y><$uo9myIh>jtGfR%( diff --git a/SDK/NUnit/bin/net-2.0/pnunit.tests.dll b/SDK/NUnit/bin/net-2.0/pnunit.tests.dll deleted file mode 100644 index dce018acda64eb9f1162a3b3e95f473ecbe029cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 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 Y?6r?uAHJc?Z(=_8@TK;DMtfJ_FVQj;bN~PV diff --git a/SDK/NUnit/bin/net-2.0/runFile.exe.config b/SDK/NUnit/bin/net-2.0/runFile.exe.config deleted file mode 100644 index 35909b4..0000000 --- a/SDK/NUnit/bin/net-2.0/runFile.exe.config +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SDK/NUnit/bin/net-2.0/runpnunit.bat b/SDK/NUnit/bin/net-2.0/runpnunit.bat deleted file mode 100644 index 6efc8b4..0000000 --- a/SDK/NUnit/bin/net-2.0/runpnunit.bat +++ /dev/null @@ -1,2 +0,0 @@ -start pnunit-agent agent.conf -pnunit-launcher test.conf \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/test.conf b/SDK/NUnit/bin/net-2.0/test.conf deleted file mode 100644 index a35e718..0000000 --- a/SDK/NUnit/bin/net-2.0/test.conf +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Testing - - - Testing - pnunit.tests.dll - TestLibraries.Testing.EqualTo19 - localhost:8080 - - ..\server - - - - - - - - - - - \ No newline at end of file diff --git a/SDK/NUnit/bin/net-2.0/tests/loadtest-assembly.dll b/SDK/NUnit/bin/net-2.0/tests/loadtest-assembly.dll deleted file mode 100644 index b6a4d2be75ae441e4b6862d6c4bd9a8ef9c27369..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 T+C238){1@XvlxcYYM=iLFcJgf diff --git a/SDK/NUnit/bin/net-2.0/tests/nonamespace-assembly.dll b/SDK/NUnit/bin/net-2.0/tests/nonamespace-assembly.dll deleted file mode 100644 index 6d08f07b878bd74c76411587df6295fb05134dac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4608 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 diff --git a/SDK/NUnit/bin/net-2.0/tests/nunit-gui.tests.dll b/SDK/NUnit/bin/net-2.0/tests/nunit-gui.tests.dll deleted file mode 100644 index 30c1eb08780be768c98e530c745fee1e95572bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8704 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 diff --git a/SDK/NUnit/bin/net-2.0/tests/nunit.fixtures.tests.dll b/SDK/NUnit/bin/net-2.0/tests/nunit.fixtures.tests.dll deleted file mode 100644 index 16a04ad053899bf4cbabb01181fd5b60fecb144d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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
jGx_)XGKVSL!mZ7A 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 s;idf~4WfA}|OOnpsbG<<@nYpjdJ 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 K#)0=F2mTF_u(`ni diff --git a/SDK/NUnit/bin/net-2.0/tests/nunit.framework.tests.dll b/SDK/NUnit/bin/net-2.0/tests/nunit.framework.tests.dll deleted file mode 100644 index c17754a9b6c44cb9c5f9b1d7cf7751bfff2c06f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348160 zcmeEv349$@_5Wnv%eexU9Dd(OFc=Fak7l3ITs|DRt2eKT|J zy=TAY+uHMBy7}%s(BiA(R77e<^F=LcZW@ z{3y6OaGgcKyC0nauS=+-e@E0>4N=%wuDdM@68L{vT<_{%S=OA>k2(8vTtCnOq9|io zO~wdhSx3zAO5Ra8XWmG5shicPq%>_Ond#Uxy~%>?N?7C>WGB_{T0R#N z)Mr|kb>VU(lNYW>GHvb@2DC4m%EylMNTyT4+yX!$!KT_S*me3|x9t4z*1%ZmL6z?J zz;me=XJumE_9h1+ew}`lTB<3 z`o=m9Y?2zP2QGUME|V^80G^=BK4uNvQQaC|(g0&k)-qy`HJa;(eyNPsJ-Dp3BAmG7 z`g>c;h?d(==<}lK6#Qdn;Gn;jRSvjtO0!Tt1jK0o;Ji+0HUUVT0KkD2V1fXkRRtiW zfMxKUw!VWSdRUX4Uk;_!xfeZIBmCUu<$+N8L^ADS%HGdnucsEyTC}cTu0Ehaa=sDHOB+*VhzDn0K^`pq^))&rXYRY-D)e#nN*LTtfWh4q zKVs{&bp-SV1sHl$C?FhcL1HL<7G^MNXs)oiIx9m$s-ac4VU4J6b3T?~DPOG1ExWW? zz&Pi_@-8%7_cq_$954WZFGBmJy~y`h}R;c1yV%0K`Yzng+4Zktz2PtYsBK(d1vJ+MeJvh@~kD+CoG8UqZZfa>00qF(5!Qh72DVgX8Yy zqi_b164Kr-!0zr1CbfpZ^J9TT5Wd%uY445IVo z68Xdk3^?~2D^8fv$9X^;XRQT77RGPDdEgjvu5vz(nx#efap568`hz3r(W$^JB~{Wf zMpsrV(XsPoG6Dy~RJwQws_+CQsLu6~{8aAFmr229{Z=G$a}LCKQ^iB0sEDqK=M$*l z9)=&#JsbxU4{Rm;tyiA*9muEq`Wh2CGH*QC2A0K^!&32Or|6UGCW zQ>gsbp&*!r3Z!1w*;qpwbe&B!q*2E7&6%c5t25G+$!GAxax|xnqAV5F`9-x&X=cCK zX>yus4H=9kR69@Y1Y2#Srt-lfAkP}fAjR#eUwmEo7t+4w*Hm%59tt)rAcA z6VM>W*cOeGL%bL?L%fjYO(aE(7&Jq`LAVAYxI&aeJcYPr(M)vB*nfk#ALh%T&vsV4 z7(CkEW#Exl3%wucGxvC~DPvDlh0JeNJ5-=&A|aV+{1(!m(XK`FXy`QBp2jw2`;cZ# z$1oeB4bh$zXf0J7|78)%=bUDu5n&kji_JmaO+I*1mE15!5`5mq&6Ll zY$Weuq(^f;A8$pIm;PA^^RrRR#4q7RZuRkobYv1KEdi50#~4nk0Yhf+Bosu(IJFi= zA=Z>J;XT>FyUIBQSEV9;iWsf>BusoWIx`v_0yF`B_-p7a!ksX?wbgzbOI{Qa*Q0+7`f!Vg_clMK%uDf$9(@5 z1yquo*#~$A+>6Y%g=J!ED*H1u>)^f+3UDiE5OrnIn+G&Aoxy&07O`xO%SZFA z3xIb#zWAw8>!+*=Dno~|e5*woT{mQKf}r;Ep-r%2tjbz)^b`SOEzi*)1~9k zQ>1Q^-}rj+<;T*z;Wt`8Wen3zzY(>R5hxSXfuXqRH?_RBH{Fak>Q)G^h$HOGM*~NN zolgg9x!X_+j}u`OYX;#dT|uG59^{6_9ifv#vrH9QNk5!yoI$|D*@4EIgkvV-xC~W& z9CZljNjR3HQYb@^eRlwk^%=+I298w@xKjBcR{`B;qUg9^!TBZb$s7)Ad)gfNf{YPI zoHqaVQF%L4>#e>C3;ikxmItJQ_F*0So`gO}GUe^f=6+{~OfVXyESVph;~`SycyiWN zka9dZ>*{Lt7X(A2@&Yiz>yI*D!O#i&0nUIq?VKE1R;4iFX~@oQvCpN-&LI7|$Wpob zey4OTj!QFrCdyp|CHoirMvVc_C2(qxez`Gc=}My(x;2atrEetuAn;&5m4rZZ!CQbI zj@G1a!?rHF9?j@hKHn>Zk$ECL;K(eI77Q} zQ}O|V<1(HW2#vJ}NQNTYk)2w637-G>MBQD-*U?&;If;(TB zsKu&^`*UlA+t*K3+_!~rOU%XCne11{fxFvL4&xPaZH1|FkzsW@{L7{@)nKAy9q%^= z9p?jE#(3rJRvd6e&m$pzGyJUBXf~{h|JAG0mVtjo1pog3D*x7DEAKyL_;~Gs#XAB5 z_gkr6Yv|Rv=RCRZjy&FGbxI}@X+OV)l}D^p&(L)@?7>?bs$m^-#pj7v`n%*w8RIcl z)%B(eNO=B2!1Ee4f>wI0fvyDs?>(3%ZqJu73gfE$Ce5av-hnX%XDmn(iK3zXaWth? zMMDWsS>5lXEb+1KH}si%r>-X5r)Y$y*J&n)zbmg0y~@>qx{{VeCEoHW%e@N)99E4p zrbQ8Id@U&MjIYIQ<8CoB?iMS?-GaJYT#jWJd9W_kiXa)lH2F`h!qKI>0UVxz&TF1m zYenl2nETLLE5^@H(fC=isr+(Nr+5$0O44)&5h26FXT(jxF`IGxpaPCB8aNQ8D&UyI zIPOK=BtGgfe%5^4hdQAlxX;IijN{7{a5NY=zM6oe*1|~G!VDJrxIY=kD(7n`kR_i+ z1Koo$bl|DZdItC$;Pdy{1%q?+1Z`>@rFW6}d(iw{WO`d!d0#=Ghg!1skyjf++hk0Ly>Xy`c|nKTBUWBW zt<+{t8Q+<60rHB`<^o;N1BO_9-#8 ze50+yJyNayVU~9YMxWk^_~EeaFM+YIV(v?8n%IxL2-?W;Z{ftkqT-`KiWLpB3H7nW z`Ue-bt5hFxAco%?1TXG4;sj8a=CFs9Qn4XBYrSk@#jL8>AQc8F1<|g(kZ@#1J92*a>6XhS{N5+f@TTtzzR`2Z}Z2bC9yPj5qDt+a?K-GUj)v*jvqqg08R`)#QEdF6! zg7v42YpK=!ynWqnOXQc^3YHhSSes)$jWB*j*oB4NtqJK=y4L+g0OA;N4CLat4Aw?8)0{vMx&DTSPB_IS|Dqw-2jxBE>0!)UQl&TrxO3#?5Tp-rt#9F2-< zZQ@KiO;PW@$l`5=-e&=kxQ~F4<9){}7N{D$H=3&ze}x(pH}oQ<7wTpSH}AdaM*6#ZJN6}WP=CJv%*9bW-4vz}tTZ*T%bp;{V;g^w$6t`l zs}V{05D4f$Vp2X-uJq{RMm!II)yGc|RE;j4vTVhwny8gtA+oRHr+gUIQ%?*Lw0t-K zeFtJ?$3B-%-Ct8xjvIaVS%pDkL~NYL>!OQHTwl$4fQrbNs5pLHA(}-mqpAVs?k;57 z;4;=aT0Pu))aq%h7gWKH$Ed2Zj`>`eVE1MS)YTBiTl{HO^%gpU&_h1*qz=0aHXYAL zh~o3oZ^&ARn7AQ!N6-Vl?)LyZ9Iuz}(75k%6@ zNdD74Ve`E!#*{+;;P?p?~q4)1q-ET2Fe73#Em7z*fUmWE>Bc8_=^ z2N_^^r*|wLySyv;IK_L4k5fIXh3b`;D8x|>&7@*zNIat5+lQ|^yrq2X^zPtem-jp$ zr+5vMss2=NcRrR+jA-z5fJGmM2VDoC@}TGGRBLd0D>O)MWNMK5bq-O2bBcdM#M=pV zNq=YZvCX@ek5B_2%O|mT^$B|G&QrrSZwEfMduQ{p!}}2*JH5C0*yYV?qk2<3l3>J{ z>doitLY;TCoaDUg_@sQYA{Eu-!&D4SzRbsVudSV~J3Nn%o!$+6?DBrb$0^>Q`8d^U z>7aTbG+$0~-syZ&J|&`C_Rc>9*1bzvtgpB53Eor(oFoa(?% zU+{bAlm&;(Bs;>j_|H`B5X!81W!5%j)pljn4&`5+%D=jlf5A%PUmmffpWO4GU4cK2 z&%Mee!4p-$_R_67iUf zbN?_--c$65@>zcv-5IgV&^b_wU)t`M-T-7U)KV_h%D;<%Q2xDq92!KSZ^dM#`y-|j zvR7^;hC!xD)E(&LvY~TLb3qPTs{$voUf_KNJmj2|`&Zz#oRs${uHDDg#T({D+f-d5 z&k}719P`M2!SkT*JET>{iA4ni7cK%^xCrA)TktV!E8yx_-U-pLZYnt61vGqJzp+FJk_iXQ}ZhssJhEr9i*w=P=-Kb^hnA3xIN41JPo zX*anC^vF%bUG&QD(D|rD-7iDkkM8$>7;yVc!0kH$w-R>|xFdO6?^4P0gLcrU3LNbv zterR*ms|i+!Qi~qBhXI?RI}MtAU4Yvnsv(;(UsbmLOgyH@VE`?D~%pTr)K>7wC2&* zRV5zF7ZU})TInAk0F^2p+q49iNG;9l`OItH6Q0|=+k|(J4dg6eYVfY7PWngzog#5* zRUptifj~361A!>l?E`rxQXi3(N_pZL?k!I|BdYI>2IR`Lnu#4G^5PK;9Dl-a^=zlZ zPdsyIR3mx9eUsKzFb%&m)Ml|?pL)RliF$D2OE zZOG%>gyb=8GJ>|sCV@~PKMQ1%aFzEyBzjKynq--j4SX-0G@WYuGF_W2leUSLX$xwF zk-GSqFVl5~Oumh30vjEMW=foE=yXgrlKxV@zPdcpyR--T^4w5eo<~`ZiZ;5@kjJ+X z$z$5+r%6Ipu#xoYyw^8_ZG>o%9jY}72M*AA4I5y1o1wGmboMKB zkPwcI05zsd^emC>zY|`@@oHxaH5I9T9Bw1S@GNMIR@3uUI9ko9HY>>@4Au07g&-Xx zV~dWNJ%e6I{H?<+6GaI%I3(O4QKC?Ti^C20-Y@1g!kgR|;fHOCe}{h68)k}iP-Y0r zgApv^N1Klk&m^GsR!30i@hfo9eW*QfizUCD z>fk#jl<5ARwhjhTUK{j-b!m5*G<<>Z`r)sHVId|M`O+RzdZ(1?Q2YrHp}2JmAIo=9 zslT_SBL6!>aK-;C30&GNS!z~XvVi}En*V@P;os-;k{wLmEOM;=3D9ezOnJ$5b!;iz@6~DBB5kVd@ByW9Ohd|^OZ2) z;xFZ|8hmSq$C27l1}96>oMa_dEoAwm)EJ2H12C$5e7o5?iS2H!B%4bApvp7*Jj5;ZS-LKR}}q!wr>Js5HMOF+$W*}o;jYohyWzwrNC_(!8AV?U zYeHG@0Yejdf5>JsZ;S<3p?;F8jdhqLL9waDx@IhQlu53az#X41d zc&rs48cRiOGl@|rbAZB+?fn-SgqX0^8=ROK-u_yg1dhtYux-2h!osRXu^Diq1~Gsd z3ym6-CK% z;_sG#zn$l39mVpDywHsEj3KYVrFy=0GDu5iN^W8Bs#?4c6;^8z=2&!!*`oZ}t>s6^ zDy`*5>A>q~DBk14eCCBudyp6tMqA3v8MC7n8!^Pp&9r9>5*hDK z7=^dt@+yt5)A zxWM74+jpsDpG#&>G%p5WcmXf`;9Rn370XTVD{{YK&rGzr5Yr4_49OUf5?|_duuHPo$l4qX`8CE%iO8LO`L4cfPhh{vg}5sFe}Wzg)F$(g| z&J7~?1=<(K9-9v&%OEP-D-v}y*CdTm!_cR$L2?;2SdU6?NXY)XLaASGkL&F?KmAkQ zO^9GpGh^kZ`u%@05M{ZYB5@><+!=fp(K-BB6jO-eKQI~pW*WbF>-$$g&*@2xeo2h# zL=p1UBq!2;lk8?_#PE^8f>Pd3Rx@-O*wQE$jgtO$fqVmj{;Iy)bSzpVoQIALC#z1W z%2yq~M72n+=M+hlO6Jm$z{_%BYzzezHFgqLyR zN5DwpA684^AIhzc|J5k}*j|x@e{M4Vy3z1|7{z~SGX5=-@y{DK{;jBm5!RF;w@${t zO(On9f&cVus`Fm=@3F`!K6Gb9hMm9 zCPha7lOm3QFD25tC6H^OPpkJ>{(D`XNa4v>?_kS)yZn0T>Bd7UCJW&fEOJr{gR@8r zVlk-&XA>h<5xZu*((GH-+ep>?Hz0@X0M&zmIH%M7^A~Zxy&2cw!Rr0L?aO!N+zy{p z@Bh`Y5AG(A2AL+S$ub#2@<-my%*mOVY&hvtE$(zmTrgSS;8EH!Axf~}3O}fvQwLVWm(_i@6qh0~3$Bx9Jl^#1%b=4!# z%x$<{lD+Umd7Vw`~5 z#{=&)>mB1ta4+E!1NpSo-?;4VsAZ~M}U8uhfH z7)V`-3Ue>^ZWE}`TM936A1C(sXB%$r-$-d?ek! z2ZFE9sR8|x|4ef+9t(YRdQB$Jm=ZW5uW;x-M`wY`r{J;c)aR1~+>Hvnm6SkZd|`7GjT# zUlmzPLzbJa1ysQuwb;6`;gcjkJDX{R;*QX(Kn?gqrsd6TJpVrtw7qMVN#L0CMF8RrJ_ zZ93og9nxo!HoO%{L*|ySm})Cji}G5bT8Ja^CyWy0&-P9Z^AnYJbk;_15#@6979obg zX`~PQIN*8rz{C{aLW;vSB5i&yGx^vvQWmBdiSvm$NZirbEn(7Dah`Heyq>{_sz*UM zUN6p*(N8`Kbl}H0M!{iB;U%#Hpc(Q_W`l4T)EymxAw>{5$Acg&-k5SL_xMU;D3&R= z#_Ji}nxatz3E>MfMSk$*ps$?2o$kAWgU25+S`1LDNzpi2jmKEKG4dR17nk81fef$v zGN^zfLi`;bX!c7|OqI~8gB2@#ENu;0bX(s!N26O+o`nP2CIP!Lgdq`3)WoJq+w1~C zTVADNl~!$Q$YZo6bC2FOEDw#}uEpGJCmO$%-opKOe3!@HKkYpR`FLrCyOwtW_NL1= z?;q*{naEUW^9!n(fi`5_kI!Bne``)I)ld)}-Z!6AN!Slq2?Y65l$G(|5vIn1tRnkS z#YXs{^%$}d9u%bSNMkR*|1H-}7=!jIe+UWau@U+L4?P!$^+X&y_`{0))l|w-{GcU2 zfGR<9FTjk^l(M2rg97>b&IdXv6cekO<6qhOz)`ASkdQdG2^eBXIvrsqHnxn+Appu(YZGTwAt_Sbsb;81US3vs~e=*Lhh z+fE#QU5VK#o#H-JYIHTHh;5#cwQ;h|B40+PX?y1qcGa!4-kDSS`S2M@$^bKjS=KjYnB;QIg6TQA=2!FF*!eo&{lH(9_gb(8 z5X-xR!n!322|h$*#_B_Vi_lWK4N#cV8k)U2#h}cvsM2jv7BXwH5AC{R*se;>s7ak7 z%Nez%VkBKR_%Mzt(${8okV@YFA3Ozq1K_*D7rU@lqwLq57q62lc?Cpure$LEK4fSC9VE{X{8m1uJc zHrs_MM&_q~4(NS6z!{wj6mf?~)8jHj*5W~tvN*j(fxV~itnKX{jCS5qT=Pi7v~=;1 zaFI#v&~QVncKns6#OUA~(6#gy4 zTOMS474Fu{4c9X9qBptHu2X*51t)p;6A&XL@?iup1;zgB$nb$s@Vh7k#Su{yM@CUB zPDFui1A6;xM-&CEfQPu)hB{$L$;3r5K+zgSaa0t=(FBO0C~_6Oc!K(#1kWa5BvVjk-|MWf>q)N_Th(6 z3lv(7C~9>4r>zbAM*mFWzqmRv5|a>8WVmf0i4=wG9?{jk5nXwSvXlrKqwv8PY!StO z`r5#6=qiez_^+TV5~6~xNRrWY^`nTcIum6%gP<{8ok`G;A>w`&#ede?z;Ea(il6we zpequhg04uC(RKBwh_22~l;s?P#&ormprhz2ihpoz;5T#?#ZUZK&=m<$L02S6g042P zTUuPY!3!Vg+r&-<7qoVe=4S~rm=mkKg_k0oOX7WxQdtQ>J6Fan-*jqLed_WPTJ@{j zbI$BZ_8=7$m!V3kh-Wo&R=Ne>g?DB*N=dpnL_oP{Eq*e%@X`ycQ(H^t15&&o0Jj!D zMHl>@R(a-Y7n-XJ0-ns%cdvRO2ev*DoOxs}@_OAPHIgY_2rPO{K;D^-RcO2q>>`4D zS)nz@%$X-4$6uh2%8juN@2w_#M|0qZoC`CkL1ReAh0gyVO4#57!$M+{Pg$B3Sa zgs&(gMp#H0>&ir95noCAzLfR7<1R@ms%qcMsx$<@;kLu595AnZN8V&XgSL3C&njJolcjoLk;W=UOuibZW!@Y-YVTf+ z2Ie3>C@Nk}Nb(Lw66ONzO^_6MeP?^?^qtW_%l3X`c zrgd{=TAv+_*5*z1vN;g;ukUSBqDfc1HW)5JaV%)A1*{8mgWczXjcIm9-S1gtUr#OkKM`q+!aQ)2bdFo~vxK_{U!+HZ|VfniTrozr6|!s`=hc#yeXLDw|i+XF|;Uz@BBwS2L)UcSh+wUr)#?Psjq zMuTuOq+<^(tw0Akd0_xVN!uCRv}i_6_d)z%ycVTX3mWui!in~&fbCAS-kAts+^G9Q)se0vS}B;IJfiS&09j;ue;*Y=tVUw>H8 zQO^V5r6j%rXYLhN;3a(RD^TA1neFtRV0f2O>=b$LXLhQ5={#GgQw5bZ4F>UN>f6*W z!ATZcLnAo-k={wR&*BK*Y_i(gl^5b(f>OEv-Q2FO1uazqmaX?+n`uY{z6W{nIR`bBTSm)@G=*H_6++e0{u-5HDQU z!3LXFL_CCIojkC6K*QSFI5c99`P5tM@`buv>qfE&OA#d4_@*29NU-5e!;+BH+l2`n z$>fQm=ShEfqDW#b zS{OZ879TbSLEzK0tF|fSHxrIaKaP=nx8pjT_i!s;3D~X$+)sl-0yZoR3wQ-z$0LhG zka%Pnw}8a&GvIe$i4S^smf4T_@YdsFo0sP!ytGnQo$d1W+@ENw?u-%2seG;7E{o5M+#ry8h0^G?j*XABnU>RX;r%NV_bRdN%LRMZ z(6clwIG&~9g1R9ulafn?7GU_(yF({ddy)2mGVX#lSdJ=g44Z5m5FznA!T}6H10P%}I1}1|Cd5z-8!~xUqIpx~bY{21q4 zLB~SQf0p-?be+u$xFrH^6Y$gs7`&}TY~z(HYUk1P`*G9e2Wf5k`aM`f#>)rU?;;Ri z(-^^>4e?asDyVyRqN}@)Qjf!DT3+)n(CwrTNQG}u1>XUs9>e-*?v=HE37!^_%>3E- zoP6&9fn1^izSZ;kJRZeYvZ|Oa<`GX_U=VkJ%Yj8gGawd>N@085Otl-@UdL2 z-bdT3^{)`*2eGf{x%na5HFE75gxfA^5H{`zF&e+4l@pKKgU5r3$6#Ll3C$7B($riV+ioIU z`u?IMNx{9LS?Vh=WL+mwjrt2;Vf zjnSBVekx5oMW@%GGWEVl*#j-wK1+&bKrl8kJF)_H63F`=B%0zjHt$@hrmwq z-qItepWyp3{zqZlZ@~|9PO!^?Z=cJ4+_Bc~BRN_21$*ZXINs4!&N z4|KB?elr50869L3ii@^tJH-Oan~R<$-{g4$d@hYccutH>lh%>sD}fv#>csRJi=loz zYPbh5x=#XNImIoZG<*SsASFOV>rU~zIA@~#V5LBpVU0@ka)-}5fxtT*SmZUw9`L>F zzciiC`*a8dI&@(D|BIr8R6~YYbH4eTs27m_=x(m}oIZ1p$7Q)241<{eSt{|1NSk*P z+xTBcN^G;sB1JJo$N%1y(dI&3(|b~%h1vv>WdrirzJ(NS0*1dwej>o2rU3OK&rB=t zKE>6xvhrTjLE!BBe2Gp+VRTEw z@pd6HKj4PVc(2ojnnnzVcX%SrXM{uA|AeSSV`T7$PlEF++UWxU*yhCir!4HCh?IMS zM7>{CBKqjF)=?oGTt{TZikEsx=Saq##jTdn4yyafzp=AXeY#Zo+K-sAt16WX>Hik) zNxu#~n<)CNfU<%HRt7kXZvlw@c%$b`tJSw_t9KcRoNQMq^zAB7&BW{~U=cEGSEIzc zxvE{wnjyRTG?VPwI*MKWauG7ouHib>?fUIe?3z?Af>*R_Vv~>t{N9voS5Z*t;oSxP z=Hyfv>vn0YFAmuO8-l4Ul`cMS`U~|L^b6WAOvS|?qfmASlTXTbD!5On@)r`yF$VVA z|0JROXruh6p>o^W7WA<#3D3`?7RE#J0QE6ApXqpmcq+T7&d&?ZgUy5Pi$JIPcP)>D z#)6B#St59C?@sbl4*B&5tFs`iIx$idXEt2}p531brxZtV|G1*eEpd5m?{LkTcZ)tV zc+{w2uN3dE<{0gNT#==vuXbU}8GT<|9ZOHZx!s=!`b%mn&&A`5w`2+Wjw@MV#HrRc z_^K;EQ}4HJuhh1d-{s3Z+ukp=eBR_kV%G3Qim@f6OtwP02)>>x72A|N9hG=WStZyA zo~Qkiy|aES-kC8xIAeHlhG{A5X53$p;+;&1-bC*HQZCdjB-k-+-2?hqF#Y$?&&V4M zxMvyr$o7TG%{#);ePjcNQh9KvFvLEREb&eE<<~Ob^sWZgTa7!S$1^j*ox|uI(b`WC zv%#IiGx$2V8+I*Un|BT$6iEDzXk5;eH3M>H$v(;{C!%3Dz`_av|X1rXwA&p|!Be{Vh5~VHLk)u^~G< zZRh%%TT5G~=>;qH;Mu5DrXQ!i-^#Gx$vZSC&)Du}R4w!l4TuZbNeG5_lzs>FOLg9m zwvjqpNlLX-%sA7qt;yi?1mG&H(!7M&;P^}T0`jP%`~vsQBv@rt48^^Bj-go&R#=n6 ze2+JA3N)z2kxFWjSG`6dg88WBZ`iL94Z)dA!}fj*|Cdad5PJ<4Am^BPFeEVKjPhV; z1KVl)57RtcpwEm<7pQ@Cy+G?)a!vzuEZ9}9Q99P8txEIiZ7)f>%~+VdTT94(G9FnQ zai4hdLu>~UM{?^Oo7yI7$pMvgDUq85%Fm62=`U&9pSMh_Kt8Q$Vgn2k(S@Sme>2oGPXB(u)Q;U zO(uCI4}ug4?j!q+kH>N2kIWlv?>jz!jYq^SZK{y@n+N{ZBOSJK)(}mN3k$`9lr;c6 zJa&;=@vw!u!=KT&;4^KKz40n6H66`#s+l=9_q6zSN%4KqlZmG_!ljI@5rVHZ_BR?O zx_?&wW?Pu-#C_H;UqgS|Tw5tI%CRFW5|ATJ>$ql28q4fK@{Jh}%y|Ru#{7jOOx6mRE&Nh1jHXI>jB8 zmyM`l&W#WU-)4RLcYWrVN++G4wx;we+1U1e?(2EuBV$nkF2F2_o@4PpWb=x8b`naG z(&l=P?OmpGpO=&cU4?#h{){YcSlQ7CNIsgERpKu} zQ=ztQq^-F_G-M1#km%t?MTnlU9_5(lCXchm*hVIf@38WT)|^N?^)&>Z`a2eDWh>87qx^3bOCslEQ{?5S%tKGkG(QA{hjc&@*@=9iv;+9030H{)KUKR{{ZUE^{@Nx2LmV4C9j-btCgHB9tbw>6F;TQN@zA&jYm8QrY^d9u zuG{3)ew7l**^u@A0y<9dAB2bn@jfEL|Dy;CEp?>u;2(6)%q~SGZhoGp4L`O(6WyOpUmTfnAKXMn5~1B zJAu@w*u)-CwIirX{A#qOslL^Tm>>4(05=)RU2im>ZnP%)@g`-_x2*zhT(}Tx%kG7+0W2aw2!)`1Du_7xUFL zc3h-8CarWgM*CEu5VsH6Wap6G13d<^EC1XYWAoy>_>m22$(9Oe%-mGR{ivS?G{&nF znkz-e2a`ypN=LLeC-C8bjs%0}$(me!G~Qc#1KueQC*dUCok7A`Yz7N%OJ&pg{@bbY zFv)>bX>Ck-*qw})Imc}!EcAn~m9#s<7(g)&8X?31o+9pnC?7_kN5Zo^$FQdK{~roDD9F>5+OitFO<(OBS06 z#P@0@qTQL)u60QcO9e|D_eCx{*vc=-FOiGjjMk8(Z}Qqep)cnY`rMy#3z|2i>7J~0 z7W45(;=?0u>g}n)gUZK-_cdJ3*TKWnPw;iHRX{cZ=&b_5eg||O5d!p57+a99@t^H| z2oy5e+vGTP7R=vz7tMR%=`$aDcRMvJ|6sK`u`IVk`ECT?Q8Yc|$>YKVd_omyB8Yu_ zmj^2b6>0i)-q!5+CviM)pQrHnCw`rnF3#2*dn5YH(1q|0H1zr5miv6Aj0N9Q)$l3A zT9|($KJrKMVcIib@q!&a@Z1SY&h-5|T-L=_rnxls=2~Y{yB-T4tyFym&n`=cIVpQm z+%?$$JJ9YNYL}0;$r^pZX8auc`4%$PHKu?x$8yYgi&JqSq%hX?eVODT{7c7xpXv>c zvEI2A>J?ZU)OQ_PkD>dic#p@?rMuCmbKP&G_$ksnKSf$!IJyC>cAI=pqvlT5?IEC1 zq99z1&=V=v5H6;elCrRE*ILH3dvk@}`a&;r&>$8V+J2xBHfq?RIbG;&uEjs6(7U8L zgOe=&)!`o+HS1Q*L9=GnZUTze!@r5tu8Dpo;i?(`S_-|6Sgp{T(I-qi>oR|ZUjE)| z9X}Z>hEkxWG=DBw!hAG_j z8PLuaab3RXK(h__tP^K_eAWf=-F`lu0^lq@n~Jm9bf$GUd6-5ET8FIarq*F>7mmR4 z!&r8Yz}ki}rHsJZhp{{yfprXHxE_IZ4sR5Lbq%AtM(Rx&-XsQ_I=rb51NYQtkq_yc zrpTlCS{4$b?eMSPv1$HG;|f&=FWlGh)0=R7EK9W|p#Yr>Kj(+I)nrYwx_^QNx~}|` z)>ijs%E0OxPkoo@S_QAJ0e24c?QV#ldU^0W!;gRatTEn?gSQHJC)EU)g_7;{X`Ve# zp9Og(iApEN1`mVA5b@4y-uO=Ovp>XN!wv)Wy>von4HIE77%-@!?9+9@2}lrF+Hx#n7@Dcw}tls+iGsQ4rm zI;hrED}_}nW||yyVSet8zh_LVqJ0}%4PVAEk7W7^Wcs8bQ;#(?afkYz8vH_*-B2rQ zbkl!9mSe{%OXZ45vh-}AWl32lLzeRmS$a3+zbCh=?|pdcg@4@l;m5XXP+t*0eY?g? zwoXP&*2@!`(-zpn-jrODiE5i_LniVXPQa4ByD^0UbRQnql3x2au_lOKQ`XUdUtsXk zbJLCO^Xq%Ac;fwS8+wY9F4(Fug9Kf7(wef+ZLmP&b)pYlDEc-(&-tl)o(udFP7j~E8n%c$f#TI6dwbT z1}B?8sQ5jc@z>JitKj5&jZQ0-P{+^pH#uB7ybylp{uhCSR%3=~HK*&E(ke9S`4#o^ zUx2@hK@;~~FhSBcKym+P8_1fL7mogn3R2~t1l&3!HS#VqTZrKREk){Qm1!1 z+DWl@7f$(W<)zJ0acMUVW|toV{u=B-Mz#gOjaGjjW^t|A%TFlI#WlYREkJ1ZH`QfZ zsS~0M+g_V%`=7I3o>T{#OfXXyEa^`oP6Qe(^h39@uD{gU{L9EL__M98tjoS9=VYVp z08{sbNC&tTG)vzT>cI^lW_2FO%RQk98nhL21ax^;o!k;SI($orb11F(TtaqL_k^~l zh7=(1S7WD8CuPmV`KPH)J8Njh$}{wR!_qdWPJ{nDVN_YXLR*^8--I@oQXB7SXxe)T zKc%B+eb)OhbX_kM+--rV!Qw(bZ?q8Vm>I26>ZT!$W=W$A%|`XiP+!k4Poni?sT$n1 zf_$5izUNsDJ8Rv~w&on7&!<`YoTks4tTQf>^M6$~d};x1^`9%-64>psB)b`Qs<%o* zFl7TRa3~W^Bx5wz&CVF6m`E;9Fy9brIf!5(J75!uZB4ft)Y_SCO|jPBN!GjQsYW~_ z%GrW+e>nIXPU0`wuLL?_2|D|B`g)%aWqJ$oBmLR(P6+|fp}7V@eFemHp19&DJoH#CTLe0vx4YI)E$zXv zu1L~P$Tw~8d?L+@M+ti^GA+K(j*TlFqo-K?y9RviacIC7<*6%uz9hooSt&o}p`&i1>DbcvN)TDuPM)>8D>4XqPy(C0I)OTVK1 zrrr9|Q`&Fjea4ACEwMh(i%JABr;h3-TlCdZ7n}wfsqXyf5*2a*#(B2YV=X*g%h6<= zbE%f2*18Th{><2I9OZiK7R73h3L9b{?!4weA|dUOeVG55)`F8X|LxWZ=WG5`{A{Si z&E)>O)rqP@|J(X+ir!Z{hW?8Vx)VjQq)?q0Hk9mBtOj+DgmT8LZFT=l@w>w>^=%jQ zOKfi9!HC~Cs}4pKQ)9PEa`>&_fzrRWvKkg>`^~ZD9IDTItbIIv-ejG1Ns?V7O+A778Y z|AL(i-5F!(TI)d^6a6+i9^f&y457uolwcZ>Rt`k3mP~kuJ`0wNp!F&~{qm%QKr@a3 z1$Y;qo@@0l*7liY?QxbqpJtsntk0XQD{t3!tEF*O@;FHOw4Ycj=Zw(=UlVszai+)G z{-}WOe zaW(pNcav%Y`IQghYFM!ZHu`mUmudoe#fNaUSGgMfx_d}9f&AKs^kJj%;OktCe!VxT z7wsu^1^oLk827&%dLOy9nDUK1_&aV(zupIE>%UsW!^2>Bk$}6G;F4;uRjXfPWhXQyfWQ{ragCPUx?5N&6D7i<*6mn)O)LZ3Fl@V!+$X$JHxUTL#og z!+^Ip6|&Tw?cNf)*oT@kw)5$7U%upY z`v_Qx>JO0{JsT{z8zC3*>Ev{FNY!1oAhA{2jlNmktu}dklV`z=@&(g2T5!IIqTzfI0ITGSBS;qsDS`6^(@H4h ze34kF^F?Bz&KH#mIbVbetKnKOTX@kQHZxC;X5e?4&$Rrz<07#a~L1}x~D`Tk}-=ha2Ov=_kizI zsg`DZ^y{7$h46gN^A;^ z68we1VSGvc@=wAS@)v?6_zQ!>_>%l(HQ@{S3qcb6g~4HbN&Zqp`V09BK@$9h!C`z! z{*oblA%7uAg1<00j4#PwY6)M+UkH-mFANUjOY)Z#;S2c-K@$9h!C`!+zaXGS)&{1k zwE^z6k}hc$Eo%epiosYf2hrgCzVwE^xbT#Ltg zQJOr~t3;E>dP0-P@Y(<)V0^qb5U0vxJ*EoLj-X`^J=S9~8mPy5Chdj+f2`&4+5pow zTJTseiiXE}0Z_(z3;p?qu{LlP^Nu#EMnBN=N0qBmo# zrxjtW4H$J4MP3^)P%AL64KSF;Z97q>oPue%H>}Ts@svGCVc#58aGSeyO|Ri})!J-R zhX`X2W-0QVO}@(GwrzAx?^F6LXj7=`kR+5aZsR;PwakpjV2wv6GK8ZnVyiJ34=~hR zpR$35^FTqtDXOb+8|TxWX9k+4%?%p9~&hIJa8sjz|F{r-QJy50yug7U5 zylu?&StZ7}4ev_O^ZOiC9jwQ%dyZu003vyKX$%~W(<%=SO0@>Y*N9)qy648g;npha zmZjPRZoMA0<}ul_7&zQo<=FG2+C*;MM6G!QHWUMgTdR!vNvYP#t@HSG&yPYRqh1gL zhw-V5`YEZ_!uTc=z6+xe$*32_z+rqUqh2i4CNaKd!gom&A{q75F>n~4%BYu8wZ01Z zlr?UIBwlN0#LCsoK*($DtQDP4+1x=sWeddfDGMIt(TV^3=>_|w<`HLzOwp(J4)j@_?e695^j`oYGtbmoPw0@HovP-1t3}@7sU9Svmh=3l ziW4@5;t_3mCG=zATBa_QIeNZ+{vWX-(1RPD>@eGXb=(Cb>FuQ|TR0SEyJ*ezh3nuA#ER z|N8Twc}L7v$Y=BkNAs+EB{8V_^xT0u_cL^jg!J(CcxL1(x+vta2bSFfXO2iz$kS7x zSF7TzUtH&(<@~dHeZ~~=6lj=aQ=>_9f=_cj-3-ruvKEPElcq_}eqN)<>q{uYbMX~2vYQPEPeBUqf+Gm5vqT5hQ)n=*9@8v5qGVhycT_%k3^=i78OZHs| z+h0reon)<=ydm<(q?%57g47wNOL=KuM$X@-mwPEVdZT)}Lltg~EK=MCKmIcxgdZ_g z<5zei1XSy0G*qbNrMmL$kDM!#Mjh2Ec*I1isHOop)II=9?ayb?l~h1DlGJQ~6{h_O zELDs`$+jkLMkNzrsi)9h=<7qk3hl){nC8Nyr*ohu>?bBWD93Km5BSzZ01iKGn=zib z6^LJr2a}?|Fih%6NeGLnnc1*YK$as+jd0Zemmx zeJ9Zl>D}O5lQs2k6l=0^JM_aI*N5zY7fi0t&f#7!K0&G4_b0zsq>k7AYE2g6orW7byfO|3_f1Z4(lg()Z#0IN`L5ef&YD-cdD zGf>Dj5TmkzLUoEL=OGIbPNTJJnkOnl)HZ3}4{~G3HoA}W-uaIQ9ac=ct$}WaxOIm!ZAK$9bao%H!I&%ZwH9Rlu33s-t0;{U+~py z(#1?7FEJ||X(%aV4G)%5sVP(iV%Cv!vyMRGm=(nIQG;Lr4pEJQ73lyRq8|mvNJ@-0 zc@v02%ULKIi#Sy#l$dRdeq^e`0LN)oU@j(MB0qto;o?|pg9XJ|(9|f4F(Uw#(^z^z zZ9)WLm;vzWp>;+APnOKvM z{vZ)6lJ83?JcIRG%s2R;BS!>>nK$&HaHs&EvN~ z?z)xQmOh8tIfbFVwV@v`sBnt65sGYnQA3tc;9=i4Ga(ch0}GDNg>dYO0lJUlcHp?Z zIu6;JdK=;BejdAKN+ZNfa7wslI7Pz588{Q18lBao@jT~Hc}^{c_tz5@3BucF;B{#- zWFVI>gl`Ir8-s494znyqq)(dMCSAe_Lo3LZ{4xH4>fnL3U4+EP>Xx=dcI9B*L+|QG~7z3ZuYJk~-<|-+gI>y?#SlG*{HcI+00GFBz zVg~E2#AaIg2DbME=Awn^?wzPGL?Zj1N&62{{Hza1Sk@Hof09iKISGDu`B-~T+cx*& zic_E6j!mf|!`t5uT}hc6H1d8%v*^2lgkQeneHgxMJIgFJ+DRWtTYG^mbUVDmU@KHz zHXYo1o<8I0cn)8x{crT=5(c!nm0yMj%ZI-&fr5&krk_LctfnHPCC9Ho&MUQa9___riG4YrAD^7p zDT`KRyl)OKpAL~~1IHj=MQ;mzGr(~lVfE4a*>)(qgYA;p4^ORb4n5?&_4FyeqPCJO z%j>f4+3GA3U;AoCimykdt> zy@v_Q#$ZpCKjmMu-VcBrkQ2`db@96zvC_vo>9Hc}{S;NP9?DXTIPJWbe#GhUoO1}S z-qna#p25`RZrVUaOQ~KLO4U1lcDMNZNy5_?iHAObxE8Y^pi32K4mG?t;FRjgHOIuX zRgKqen5Q_eUL{^>k=Of_Pm&m;&y)zSUkdSh71a`u=9PK7FW~i7s>0V};PqbSDbDN5 z3{TK2^UCTG5+Po{9O9MD?StM1M(;!7?JHc1;%S=R)2VEZw27cj%e!8BDKCR7W49?M zX!kB=c!z>_DktdjzQ%C%f=*|u_atBIZ+V(t@duQ6@8U->0q$25sBRFTuNr(+vu`IV zC;8$Y3{TM6;VAG=V8f~)Lktb;erJuxlp}^LS*AEfS;w5`<6J)?+j#J#_#Il9S_Suo zRQ{(sLoFO{>CVvA>}^A2hPLJF(_k^vx^liwxg(i;@U7~R%n<3)|Ln0*%`vMvZ9b)T zpHhdWL_+yVX$#9PAy((gE&q8l{XbDo#7pwNxb|u#!JRp5ay+O@+aq=(*4yR zJhq^Flg{6*kJm}k${erJCSm+2f|173b=FQ1oG)fDtnMh(71k?EEew_(gA4IMI0@st zbHlzt@4dVd_>iwK{yhPuIqx6%try)n-mE(7)Xvs?@!K)S^j|zJc`Tc^Gj0|iB_7GD zw3}7KnQVv6XjEzN0_yY1NI2Qh3#d)i6K|J-x4Qz~!d$ghhN9bl0R~f}s zCd5@nah2)vn5&H9D#JrBlPj4op--rB>zxoH<amJS5<8ID(lm&AuC+k4zxR0~N96Nxy*ZH&^ z7wg^qRv)p@zN{(>$D!B`LaTuUxs&?aj^Kg+f=V7Wa-U!h_}q4P1nrsF7#T*N~DiYo~b$RceOTrn0vF&g5zQx z4B8;u)^hyV&BW8zR(b$+G2{5L&)bIQ#dxzFJ5ziLbPUWu$#$Z-OqjRn0dL<|yorwd zg5qZl1~(E0i9hfr-&faist>H&-U*s1FPS|iAUqn#Dfxk@BfQqqHx+pQ25j+PKp5Zl z5Z`;SG5WpLhv8ZLf6*yceKgLufYVReg?df`Gz5?|fFVGkQNh{^6VzEpVLf%``lQ%a zH11kVwz9qEA%j-~ug2C^2?vJf8pkeS9837MT*O?XJ_QziYOun*kX;lnWfPCu{{Ffo zAYhZ1^ZxKp8qn5z(~b1^R}FAC(fTBNZyVr!$i&-&H>FBG2hJXBE!P)qJ^Mw^}sfDZi~+h$p-f42HnYvS$;c3XhgTh>@l<3DTl<5pAF zdfL7vRnueHO*N^en$^F=TU~2YsdOq;n@*=|YipfMV>W}oiS-S2jm;BVnkP-1G-+~v zYWw8YuGUGDI(j?03f#jkwjFVX}n_aJa@}$X=yT|*t`nxq) z^Q)20X?VaX*kIeL(*0RYb zKXZGwcZaWjXY#`5-k!ecV(+Ua-rqyY0T; z{s$cR@kIw6eALm$9DCgHCoCzQe#V(+oqf*I3qEz>MHgT4=}WJ=`kHI6yZ(k7ZyH%~ z$LGIr=UsQ-bN|;Kc<}2FJ^aX{PdxeE?>+VXr+@Iw^FMy!CqI4hXFvbNuYdE~-@W$w z@89^tn}2=h-S^)A+uuLv-%fS z10FZ9n^H|!nEI%<-1+A07f!kBk#q0(#v8Bfd&-J4@)H(*;=STs5AFNtWfyNS=fk-# z9CFvMc7F1j>!sqzub%mID{O235{AC~54~9Qk(}3yMk@yc))CFgB-UDObd*A8a)#$I|#qv#6hqpr1YU`b&3wgF4#2Meb;y z;EwhX+h&gRwy2U3PGS{%RTb#4Yt5oNX1Z$g;cu5SV$*Zu`6ZT z6=fZipLNeKMo z);GViuCJ&;_4QM$U9b-LUhzLuA=+}!y#9|ne)*s2 zT-uFj4*GwY!*xT9|6fK`{t%zVgraieK1wV9~M<=l&OcnUPiq0w>1W*f^{8b_?f;>M-(UT6 zS=c@tJFwT?Z&-J~fp4Jvd+s-UxMJ!HNB!cKOE*5e=BUShd)iwIw!QmjD_R!KnXAA% zpT7?HpQ@0pTNYn;>5JFwuy}akbGx{8mu|er&Rw_7biX&d#T&X|Mau*GK4br%Evmm_ z$;NN(J@Vjd6JHwK_lhNFKqc!={&$q{ru)6NFFmqb4u=)j*q3g+z zmc^Iv^M9lubHu)%-23qr_5*Oi+(sMxtmTM(pGo1#t~&wW#cf2%EuUOa+jZMqdpLJy zZ5!EUUA6xeh1kFS#qi+5=MM2M*^^?!!R~7{8&l#te#JHE??2e~x6hAUzE3mdzw6+$ z>#F?gdU;{ta|ge3^=U3C_Tg(NSsl9j2GI7L8I+{{AA4^C9#xgSd#_WKgpdRX5E94$ z#S{`I0|o?TD5l6f21p1)g(Q$b$c%!b7J`U^ii(N@QUVSrwzEP@x22$>Vmp8X4QL@~ zgW8BT+Rom!-@V~fwWs^*^PT_wzUSU&^E~y|`mMFs-ut|#>Qn`)LQ0G4`4q%oH-cZc zuGzDhO&|KnBz`Ho@BgBPFPn|d8JNw_{zsP%&unym>$dB6i0gsNciE)nC&%DApws_{ zdlKU7y?Estjw^cB%j(ju1Acw`-)lmTq^GAn+e%zIy5nNNEIRKo1c=A35^nleJSG=d1U2cWoZt z%K6f+?;nqD}Gw2w~QGkdj4lR>`{=|yvse3Qdf_C}K00yF?A1P+ zUO0)gk51e(d$o_I7fvGWqZ9YcUhSjlg_B78=)^s4lR>`{=|yvse3Qdf_C}K00yF?A1P+UO0)gk51e(d$o_I7fvGWqZ9Yc zUhSjlg_B78=)^s4lR>`{=|yvse3Q zdf_C}K00yF?A1P+UO0)gk51e(d$o_I7fvGWqZ9YcUhSjlg_B78=)^s4lR>`{=|yvse3Qdf_C}K00yF?A1P+UO0)gk51e( zd$o_I7fvGWqZ9YcUhSjlg_B78=)^s4lR>`{=|yvse3Qdf_C}K00yF?A1P+UO0)gk51e(d$o_I7fvGWqZ9YcUhSjlg_B78 z=)^s4lR>`{=|yvse3Qdf_C}K00yF z?A1P+UO0)gk51e(d$o_I7fvGWqZ9YcUhSjlg_B78=)^s4lR>`{=|yvse3Qdf_DcKfuTKP2!0Ec*!6qM{3pkf56e_=sjAU zIr};7qkYe;I<${guGr6MAMJZ))uDZ~a>ag5`)J=Ys}Aj>l`Hmh+DH4IS#@Y1tz5C6 z(>~hw%&J5CXyuCioc7VaXI35BM=MwC=d_RZJ+tc2K3chAKc{`P@0nGH_R-1}`#J5S zeb1~qw2xM<*w1Mn?R#d`p?$P+#ePovXx}rd4(+3rEB15RNBf>xb!Z>0T(O_iKHB%p zszdu|<%<2B_R+p)Rvp?$D_892w2$^Zv+B@3TDf9Br+u{VnN^4O(aIJ3Iqjo;&#XGM zk5;bO&uJg+duG+4eYA4Leop&n-!rQY?W2_|_H)`t`<_{KXdkUyv7ggE+V{+=L;Gmu ziv67S(Y|L^9ok1LSM2AskM=#Y>d-z~xne)3eYEeHRfqP`$`$)L?W29qtU9!hR<793 zX&>!-X4Rp6v~tCMPWx!zGpi2mqm?W6bJ|Dyo>_HhAFW)mpVL0t_spt8`)K8g{hapE zzGqe)+D9u_?B}$P_C2%e&^}tZVn3&SwC|Z!hxXCR75h2uqkYe;I<${guGr6MAMJZ) z)uDZ~a>ag5`)J=Ys}Aj>l`Hmh+DH4IS#@Y1tz5C6(>~hw%&J5CXyuCioc7VaXI35B zM=MwC=d_RZJ+tc2K3chAKc{`P@0nGH_R-1}`#J5Seb1~qw2xM<*w1Mn?R#d`p?$P+ z#ePovXx}rd4(+3rEB15RNBf>xb!Z>0T(O_iKHB%pszdu|<%<2B_R+p)Rvp?$D_892 zw2$^Zv+B@3TDf9Br+u{VnN^4O(aIJ3Iqjo;&#XGMk5;bO&uJg+duG+4eYA4Leop&n z-!rQY?W2_|_H)`t`<_{KXdkUyv7ggE+V{+=L;Gmuiv67S(Y|L^9ok1LSM2AskM=#Y z>d-z~xne)3eYEeHRfqP`$`$)L?W29qtU9!hR<793X&>!-X4Rp6v~tCMPWx!zGpi2m zqm?W6bJ|Dyo>_HhAFW)mpVL0t_spt8`)K8g{hapEzGqe)+D9u_?B}$P_C2%e&^}tZ zVn3&SwC|Z!hxXCR75h2uqkYe;I<${guGr6MAMJZ))uDZ~a>ag5`)J=Ys}Aj>l`Hmh z+DH4IS#@Y1tz5C6(>~hw%&J5CXyuCioc7VaXI35BM=MwC=d_RZJ+tc2K3chAKc{`P z@0nGH_R-1}`#J5Seb1~qw2xM<*w1Mn?R#d`p?$P+#ePovXx}rd4(+3rEB15RNBf>x zb!Z>0T(O_iKHB%pszdu|<%<2B_R+p)Rvp?$D_892w2$^Zv+B@3TDf9Br+u{VnN^4O z(aIJ3Iqjo;&#XGMk5;bO&uJg+duG+4eYA4Leop&n-!rQY?W2_|_H)`t`<_{KXdkUy zv7ggE+V{+=L;Gmuiv67S(Y|L^9ok1LSM2AskM=#Y>d-z~xne)3eYEeHRfqP`$`$)L z?W29qtU9!hR<793X&>!-X4Rp6v~tCMPWx!zGpi2mqm?W6bJ|Dyo>_HhAFW)mpVL0t z_spt8`)K8g{hapEzGqe)+D9u_?B}$P_C2%e&^}tZVn3&SwC|Z!hxXCR75h2uqkYe; zI<${guGr6MAMJZ))uDZ~a>ag5`)J=Ys}Aj>l`Hmh|2upfI%V`wgA5XX68LsW@18k5 z`{Z2E`vQ@Prb^b(jYJ)A&)G3s(!k|RXb-Z}$ zsNtf&!;i-Kl*|bZ_XyJJ<}ow~I=cByoS()TN2SdNQVdl$7b7o+UW@9j(9O*^aMxpqcVhg$ z76W=aRL51ldP!YMIy8EYK0+%y))=~E`bV639r5=V)3~5n^EmPp zi0Vc@t~h#v<2d@FK&#B%%^={QGRWTGo)u#Vq zCD6-R<7fk_pK+W_aW%hI$5HzlF}}8Da!m|f%Nj?wAhW$j>|u9}nCI`%@1ebGU#W_t zUA1DZeb7VDxVlHhMND0x#I<-iU)4I%K)#lpr9!4yzOF@aCXuhn1Nqt(#Th|^x0ic1Pjx-oF71W7_g64uc({RjLi#anX5446Ui!y0^SYIa13G3@Z#h}fY zC5uWx&w#RN9%gwBb9SW)9MK0%3DlJqfqr8uWvWJ>Jce#m50d-rPK!ZupFQYO%-PyC zkjkkiEd^zPdear4!Jxi8zc>$LK^M|BARkjH4WjG9)*D7QhOIZ8)`hJ%0|@N0M?wRRI_Qz0G1$WBbrG=mOfWKWEoK_7#L zD>@3At>^@3AyWbs(J4?pYP0DK$d8(jegRzzD&ePz@cJImJaU5`165EAXg8>m8iU>g zRZ{}!Yfv3E1;s}VWQP`0BB(8BDYXQ3V~VCLC#>gODYKW`U(HQage2K0AeZ#ccc!~TN8P!Ov{t_(* zHB+<#)LGFrpgcv_g31(K2f9ho8qkA^ZUDWm=qAt?if#s_#LCrg1@%;P8)&SeJ3y6+ z?grheXcOomMfZVTQM3hgNYVYE)-Ji;gP<%$+dya3$VWhfRqavGSVfP4sIi>o2~fPE zr$8x+o&oh#^c-k3Q#7B4ouC4y#!N4ODll>n?FL<;=w;B&ie3e6Ws2sX5ncl=bc?<0 zp*KL!tC4Sl_9=P`bU@KNpd*U*gML=@9w;$R&iMf-Q_(??pJeS2=sZs=lv5FDUv4=mSOHg1%Ao zPf&ck-1QHjE{c8vU8Lw2&}UZ!MFnWEORhQ6066*OIu_<1yue2UtF7AW$7>J)VV z{Xxyy3A9YrGC|iV$^yNwMs@{lR<-V+XB71WQM5SPmnjGIma6pzg%st2zE{*2Jopb4sP z4rrF5V$ju!NJ%oI%-#}b3QIs)osya_siIXfHgfzBv82#QG*D|9x#aEo_ssrms=U zQMGSCqnR30mhmH~m??|j*~CSO)oU>_+h`^Jnuh*9Rb1<`johe~?C!W}VxN~Nx^sFs z4K4_$@8^WmPG2~UC=I8ZBWQeCc!lgvYu*L%-S-kf^{%- z0johzBrUR>=l3)JzsW?=r%65dXWzalga0cvXjAG`-j&cO>YldUqU+xu_3w8m-LRK8 z=<2k`Ej28f{&)HF>64DdMlZ_iRLMGq_4gyK_HXwr|Nimt zKa=_WZvUH%)e-&A>?ew@?<}qu4|c9LqUdSp9%x?XV9t-p6wk5=nU!3f0-X*m%e;a! z3o^wc?a!IntS__nqW)PuSPNL&(@R;mi1%*Ux3dn9MOT}BxvgqT{upIwjI%x zs z7O!G$#tvoeI(E3LIi1h3L5;?ZcC|DXOuLz1ogarDf_?>cPZ#-Tr+>;?RPaJ{OQX7g zue!zx#CITW<(r?<(#VDmgf52O4}IVFI9ETHnPM?=ZfRO-OXCvgA4)Ic_@z>je;@jJ zsaWw>#4XB1KC?{Ba3OSISs9PN3i?FZtsK7$J&2KiFB3Bx^F&vxc_Pl6w}*8GGF8Z2 z4ZR)u{5&!9ThL<|^Bc6~d@)0p`J#FebOJIZh%cQl=3E2aG+*rJDd?;7#eNP!zruKT zxtJ#f+6_7wIt4l(dU?6n=S_&WAbt+<8|7m4j}iX^`9>9DWLkyDp9hUvDCWOmkzOOJWDj)tH{-I0@DkM(wSoDfTG?lbNFBVVmpXg zR?$Gv07cV4MT#x~Edwp5XImC<-xko#^k&Oh{CDIJDf+c#8Pgs`U6TYIRx}NCMv*^B z^v&#u)p6{x6brh!^|$$=mfcD2OdL@xl_`29Nzi&ps*nE)9mgO?c9NuObrH1<5w#AP z;e8_|slIn3YTrlH{@NwH?>Oi)b=y4@)bRiTEH~>+{gm{*SdzV zk!iFxY-AeU9yT(awn?HFQy-uVI-qDDQ#;DJP#)32)LecSFhUac*@4EX+8M5OpjjY! zE$B$)swSQ}9qA!O!oiMoLXmK=BjsEqRyf<&4<504M`J}tEd3vlZ4~Trqik>`*H?`_whfN^Pg2D`&LU* zef*DfsL4LBBDr3rBH6b=lIqJE9Nt&1NcOE)B>RGrR9`=Dc%NU9a6X&%C=$-|u@8|W zh4a}|AW6;gB}h7-P0fd5Bx>C#9V8#E-DpTytq1YjI{w42seBFTLA7DE^JwWgD&T+X zT?_imxIJwJe~M;bSgjX@&efi#-sB!8=M1Ff()rX9Bp)HUl%{IJ-CQ~;3H!_?FG#+o z=F-;@BQG0n9#Jl}2Av&wwXEU&L@sSt^gOSgOS=?(#E%fZoQ#k=`w~>HC^lWx_9*gz zJb7|tf6y{T`JjD@>OkEumLqQftyT0W=u1Vfr04PqZAQwGpE32NJVkLCxpVhI!=DBSDiV)!{#kdd zoJG7c52lfd#4Gb)TB}Gr0|wLEio`QuFnPp>yhvVO2GjQ-`3x9L8RN~`5Xu6{SLPu! zQIU9M9!BM1BZpIss)<+T;j}@KcxBF`=fXx_OhJ%*R$WY=hSf&VX-RlijiOc)%)N}E z3`vyFPK=>`imm~bE7}O!py+kbK9GFxHimL1VNUud*T&KUNq8QOrP(0)>=;XR=W2U- z}RqYR`J)~$4sP`1vcL-Fd=qJ!>MXlS5Iqz507qmx`T4A566}F#XOr*n#YT8dV zCevv}S8?AoD$SScJpkIO=p9hP5=gP3!zqEVoO zie`d-mZav)pC)G!*Scx6O3}?7a+&T?^at*nPJ0!-%eCorLeV!|E1(tpx87nei5+v9 zHY>{Qn8Tm8IG|`UD5d}-v3emjm4qWIq|u6MFmg%6$iopM;|k?^H)3R#BsJ$=RTD>4 zNZ&<_Oq>zE`d&$D_3spI!kmdk;UnW_%Jt-&{S?WO6D6tD=gkTqxn7d0&6youTPI1? z{By! zC1&3Y+KQU&n?XHg4eQOIgApSOKxaoDjTjkQ8b0SWlGH5QBWgp+!bgsZph=Qc-!hQA zzRaKx!$ua-mGdwQMi$X_NpP@;hRzSKRZ3E|7UkhJuOwCbETWcJVeYeto|UB5J04NH zenI%0BNvAE1yPfp712alQ?sO1hL2o{+S!qvWKE5XS`s}k)w^q_w&mwBW>*VU< zIaWmXNK)tF#|U!OhtC-oK`kVy6}*bN;TWbUx)@ZWs06fCl3FjSL9DQn-tAm(6j8dO zQ=OMEoex??-=S}&qNbT**VicO2Ks~SQ*-W6HF`k_W6sV_{M^UFTtENEK1PLitffNA1Znfjyeik?C37D?)8H>kZBb6#N2LW@vA)c|`pb$s;OOB#&sNB6&pHC8;BNTGigf(VkZH8L0c^a)r1q z!oekqazT4R%PFtRa^ZxmVNQPGSSI@9JDr)-QjvJ4GmFwd@}1*s>KH-YB;oNgo90E- zsv>IJB5F@Z)EZxbU1Kk^DM^x=vo4~xETVQYqIM>tR&ZtboIXiv&ixU!!x6RFSB3YL zOHzG5MAV}E7^!M=B&lO4kEs1AqP91pmcN|%&ng2Q8$Ork}pa1eH>9cp=xV*pFTQzOL*Uxl2qT2Tf=K( zC8^pA5w*P$we!}8_w|#c`Zh(>9*U@4d0TkjYDuau@%HdqYe}m1Vnl6UMD6@L!utkD zQhl#R)ZUJ$J+L9X?{P`0@1i@yYr`d}+HVoH*t;-N)!veX$F7e)jHqq8JABTEB+&+( zqp=(1ESu#SlcZ+(60|&ad)6w$M^X2Rk;`MB%sR;DHeJyU(D@+w8sMV=5hL>>MlOsP z*&sQJb_Se9oDY)SO2nYF|dw=57t|tCXbrzK*E<98oK| zKcY{P>f0YtI~-B-J`mnFQWCw2M^>Gp_dt6hMjlr+@s86+?H&xDrHdrB`rL@xf{5Dv z5w%AnY9}IUrz2|J9tvOYd`W7(s)*Vp5w#~GYP%w8&9{ZmnJ!7qSsPJX7EudD)J{ay z20k1<=SWFv&W#bZhazeTkA(LnNm6|k5w(Vh+G`QD0}-`;+r#JdN>X#)7EudC)V__V z(W96}^_5Ce*PhAv{1}ExQhOO4QM)Fhc0)vMZ$$0wh+6z};rnbUN$qodL~V(x<>9QHQ8Wj1&kniI z#h~1slCA?K{!!AypzjsE1bS$fto;?V;ZKrIgFG)t`UR8~l+?DnIMcB&N*V^*p=c3k z-Al5z8q}~`(u1H~ie3V(*@K$$bG;-Ap>|x+x1hBz%UPm&h}Au>NJ<3x6}6M}s;r#{ z3Mo>1*(+Rnq>exF;qJN;aOOf<*_&ahIc?^3bslI)x*0`terTe>bWF~06qG6z<{jxR} z^u3~`piAD9wR=DhEBXWIBSo)*TD&hu9s=bl`UX^_D26{QQA#zE)INX4UT&sQ6|=Y& zh1GAS>p=;M-T>`al(0aI{8UjPXo*^(HCDJg9DDs02D!L!^y`uL(xgW?Q zO2`qr&R3KRTB2w^XuG2OK>HN!1)Wj!BdFhpV$S7seyh8u%eGa{SM2K{{S^8is>U}d0bH&(3gs` zLBo&8z6(HpMUz4Fk*pPgb|_i|3VbYUmw^r_x(SpXlC`a%^+yFQr|0|posVw^Xcg_1 zBR`QN_k#k8J_U6;CTsr$Em4%%R~*sAIr4H)P|;dY))%t28T62%$7StHS=$3zt4Mqbs+{&I5}$1tV;3p$|a z8c?V2<;bldzoPd+`xHeF5Oa3=L5|D>9o`>p^rD0&jKPSM+-UnxxdPNr(N@p~ zMIV4pD{3@Y%sKp5*_REvM-m=OHMCXLYE#6>cNC4p$is@JfWALF5|sFxoby^xcSW~> zwkisM&M0~eBtES#{to`nAo2S!1nmc1ujucf#}zg5ik*qyryxeAgC;5(017CY3)-b< z3Ft#bcYqT4TLog4jUe&;RY99UHHx-@HYj=w6jbyS=!Bvjpi;M-B?#&iBk66>NJWQ0 zYZaXY9ar>EIkJ)Liyb14Ha%9-d7u-Drh*z8%i1!~8AY2x55=j~L8bAMqK1k&*C|Q` z{VYj63ZfD)l4*ibL$OT+?ZGvqj;4U*HKd-(LGl_>Piqxj%5&CJP|H-&Jk-+x&?~WrhaWQP>2DFWuT)>B5n{dMbU90Z&_G2KK&6UGKx-5& z0qs(BBdB$ToaKJdSVeyXwQVnJFM}p4`T(?A(Kn#elGHK0-9h#ld19Z-I!cmrj_)F= zF=|&U$^bp9C=2wtBDq5AEcB@rzL!LUFtWTy_zD;Hk~A8%Dn*5$&5GolZ%a~hKHgjQ z)neq1-0(TC?m;caYA%$u?HGB#qCbK@Q1mh=?jkwz zJy5!$&p<_rz6af+sL{p3>(~M4Q|lc-P5uj2JtfK-c`!0fQ8s9Vq6z2+;P?lFC5C$AFZBW6#m~{P7c?B)Wx1E~a}F zJqQXZdLGniteo>*&@x3ofj(5!bCj4Rahx2P56V}x7PMN?W1v5SmQ&2=L9WI0k*r~# zm(q(Md8RL=6RIz1bPoS+sFma83Y|blK+CBYh$hHd9;i}LA?Rh$a;gCRQ`XdaUx3c8 zM-$~N%P}%t(JD~6qIIBclGH3usM;pfjw^ZyG-8sRQ~b1aDHSMs7PWZ4Xs2WtR=sHk9(fy#*0@)V?SBrRP+RBkD}e6mNRAFe$ZG&CqU~J z{Qx?lsM!RuUhXW}*AaA`B(<~ksx|<%cRE6Q*?&uN;;va>BJnmiU!OUJ6lfK6APHUpj9-0Yku;p z+H9`*X{D+y;o5R~Rn_jExWKiX_Nm&lT)Udu&yjN;npo|+nmU12(f3?iL5ox^eNuyK z1%F0N`qFPwzH24bE1Ep1&~*)6qG;iy*{)TzRM9n)N?g~{GDY_>t){CK1$mb1=xRlW zc$Vww8b#moENf`BqQuE1uC=sAQ4gjYXdP%djhnpGbt4^DRLHcBM)|N$oUvQz%Me?} z->bWL;hFSXDCel8H48sBZlSTNwqxNTrjfGN_{D`UFwIdT(<^iMxA4tVbTOz>ja*bI zMy>#fD?nwdh~I(Ri1qjJf0Oxly=U`s zKfl-Tb$b?yJ@jRjE1o@y@G(x}Thh##W&9G>`u(o{`^{JSOvBXYOAtGE!&H6|qnkRU#Ij4mbFB zGno3`0#QB0`upQLd&W2R7geDydS;P`TT}^cUoA3SSdxGQ z$M)p0=W)IlcaP-TUpV_0rnkBN4&V0k_q0CX+YhvvZ@u{T0N-xlTOa<;T`hmJH=DNc z_l6QUUd_5KWgV{|z70Ie7~0|p|2{*Zh0tPX1+*5r6uO+XfUaZBp_`#Ypp!^^I<+zF znsSitG$!})yBd=ib01fEW_)MoPUHBLjjlV5dHpuJwxR0@RqdF+pMQH}@BAM0qA@1_ zW!Dg6I>$SWx%scTUc<p3LXp z1mOBA|8e)7yq{;>H$(4(Hs&$8)EwG|^=0=YI)Cb$nCE?Wd(QB86`{SL{h{0F#;FI{ zZBc#EczEgwccJU~si)j0Y4_BBxQltr5AF(REygc(1*Y8|wUfsOqONnjIqgx7-<$Si zRDYxA^kCF|Jf^368!LZnkjK1gJb|t!T+63FKu@@?nSL#QHoC-ab9m3or>~$w*P8_&L?3k>Echf^oV61i zzc-BBV|SywC^Z`@37tcq0C&(Qd{L*321iu$~9)&)Od&`CEX!6pj7P_vT(YZ-4_f0dpH_7H_K>@#icyHR3O@yv(av1B1_&$!sQ5-*)`E!%w$b5;+ zmpCpl@=%j6kr%Ul)8q`|pP^BPm|>@J$BdRu#TjqgbQJH9pXu)BW*p>vaK^o?Z_Mb_ zR6JI*dCYq=dNnO{e=?&l$8XFS!1~#Yp{!?SjAWggKaNNKIwQa7B^@MyH~Uu44D#qLth=g|8){>$-ST8BMhjn$) zeLQAzp9i4Zn^w4=E~-rwkDND+3ipRax3;KoA1k`6#Zlwr^f%&9(zWdWB>JJ~^Q3op zC%JrOy?n;kNwx0DeFn8!%Eu_K5*ah!bT7y8UgthJ{et8|*Vvf@ldp46oq0j>&B)&g zy$`yL^-W`&`^}ldlXr4lkSsE}^df5xy#{^9eSFIM?t|1~*8Jp?)OJ=w@lM{Q&?}DlaX?gujf5D&YykCoy5oT3|~?Ec`iy>%B%1<_FV7H8JSWM_1>KE zJW^;y)SG;@IY~mViwf~<6;Yc;7jjjoh<%8CDK|&GH?59muJm2a`AXmQoEKW?y3ThC zXRhkK%Tp$Ox^75}s5<-CMYgGeQep_xiGU%)LHjSkrM9 z(v9WQccnZLl~&xvC7vTwTQ@d_7T-%1QQ|eCBI^06!fl}yQNrzmZeQ^!&ijf*Ug#vM zU_I!rLB0lgslgdfw%!?aW%0|c#o5{0x*}@q%(q&fB%y__+lt@k%x%R-I3x6^TRdhe zqD0q0_oUp*c>j}fpX930gYFxrip-5uMMh|$YiIFso?&P4=bRB*=z6>OG-uu}{*E(3 zE20wT{LHb?Lf7$PSDT8cEYdC)e##~YIWb3b^9xhqWnZ3}DSjAQD zt~S?U4}~r(Kp z(+duziL2j6mr!@K(4)v?Hx=o*I8PVTb@x-WgWac%A|>1_=0Q}tNGUD+t3 zjWL9OZmuBlFXL@E^McVHt7JzHT9lm83vuJ<(nVs1#J*DZAwEAtWClPlhE8U!!^lme zt2w^l0--e*h_21h=r&?M(QQ^`H0Jl`e_>}X?{{m4@Ji@|{Wh@f=(iENC8Ix97nyv1 zUE9&`Va|wmjCUGw{l%EL{#&4;8rT2fj2Df)i(Yo^j5@NYZPOvqUoHA$MtkG8MK5Ly ziB7M2i?w6bfs9enJ*sZa5YI<`9cO2L$`HDdN6JiMUy(`dyODKAzwEX``Sm(FuD^)m z`ippc)lV6P(etVf@(kmvHfHRMs;?63UR70_I4SyGt_tP6@o?2pydv*xd#6#G5@db0 z%I~V+<2u5x__ZnTa%OU$V{Nl}b)6>p6jB$)!kWVR`>R7<7e~{x-)uJ zb$`#z(Kl3kS#PNx>A4fW-O0Y?H{HfA`S>f4Lt8B2{C*yJXY^rKk>A}x=*EmEa9koj z)ZvNf;EdlmpV-&OV}zeV4|NbTz7 z=bP0o$z0A?n~fREqhIGo`10sap$TI|+!2~lE8?Xb8!;EvuFf=KF0Q?ibt2-z+Vz>@ zS-|g9jgs2?GG8-lYad`0?`dB%uB?43^EFyidxT!2yP(@@b4mO}vxoCz$G??%r?GYX zN6^n$cO%|CUc@I5pWwJLJze`9XPQkABb!a&Ow7<0F{cHp)5~{atOBtoAYO>vFQ1Qn~RN|E9Q!?nbUy%6BKQ7PydC*6W^`6h{+{lj?4JC)e};2hLZdhyLo+$9r(%w$&;7 z;POMo@6=9k?MD6>l%lYcC^51l)Qik8#DOR=Pf+PFBPJ?@n4(4A1ML`%RS*wD>_hB} z7UN5h@goyZig^%I4CaA$jKMsJeNaDi1@ZyJTM!2k??xO#d<-!)!cjNEu|S7GOQ0*D zTcEq4$DqSv#rP8F3g{MSFjmYKf>LA5+*pkCAnu6Ri+C7fAL0_ke#9#fZ-EAp*^M}a z_!we}g9A`+oN&gAcvzfR%ZIoGv7f7_qy5ONKqkPMKJEZATaXDN6GSEirFhH_?HDiS z^dj~_{m_7{CWz|Rgf&h17@Iuee!Y>pl! zJ2n>j60|pT6!bA@0dyhsGUyG^Kx1E%{qCALp{t>{K=Yw zDUKQ%)oe_1lP;cS;&I-o*_7n=UA)aibvR-l;!?ybS-W)!VB~$xE^owcaHda}Aja(B zcvzPZ;$zK(SI3(bC6DhCl~|Ho)WwsC`4bl=*LU$IV*bSX@$ax3B>s(TQJ5FbYz)x19WU>8qw%-MWJ@^@Xl%`qopAL3HPe#9#gZ*9INxoOt% z=Hd)?Y9W+b3TLRL==HV~vjw1(Bw|m}es_MH(ACf@p*7IC&|BiXNut*W^+N;DAT$I$ z#{c;MuhmM7bhi?*2eB9GYqj5fB3|fUz&f*-LTaX_i4Zo$YPGC_<9Ar2v?6fuTU#0>5fF{cL^4>De*SOs|>G9@X(89y?9 zWL6*(NO{CPq)7l75zpuN5qEFs#3oxXCWvYfy}PmEZsbGA979a4#fonJuOE0nh&v+o zA|8g=hqwgs3h0*BV*gtZ?}i?2{S(h{46)Hh#O^j?&i05qA|8Tx7~*2YC5Tr*w?L0U zJ*hZ5sbX(lr6MydRm|x_)rY)asi>|<9hUglj1?HO1sX)vohG`5K}(=3pj)83p`kRf z)-lBHbhwc&G9A;ON=oV65g9KsKBylWfNnuGhRV^GR?#C=CIp+7bint(VB+7;@9 zHf=1b6^Iu@S3;je*A~Q&L7#`d3jGm!exm68Ge*7%{TTX1Q%}YlF)f-4y(CfSO^BPe z@MehP@T6JtEj@pYcUiA79`w$1( ziDL{RCJ(NJ9yp2Ek2r`pgxJ$wjPbS?WBiDNQ0gG^KB&KgsD?VM;8zXmh}k+~6)1HQ zu^$?OdOD*Q8i0nNo=l8{hM?Xqm<{TO2B1M`2~uQ5Xcsgk0%Gyn}jJ-v~K2B0A*osXHJzVpQx zKjHv1gp4N_z0d$O1oiYm9vXm#pq{?SLj%wd)N_GY%M0~E{m=k3bisc2{uH4DS_|z0 z{S=v4#Hp>R-+uRE=&jIl=+&)#{ltm^Xb9@*FV^z)M;;o2dM?D?paEzI>bVGcXaE|5 zdIlg54M0N!#LP4hz70YZ8i0nNp25gN1JDrE<3%1CfQF!+A;?1m&=Ax!6#1cIEk87f z3=I=`FVqhWLTNbiP(L&Xr4h(O{m>wk@{ou6p+P8Jj6BpcQmpQU`k;Pj02+jbpfn1e zK)p~O)DI0ngU}F^Mq@nGKUzF@0;9#cA*g4Jh<(riGz9gGMIIV}hM=Bt$U_6r&^R%F zXq>oa(s-#@alBNK@gna<#)sI4*pJwcIG|LF4q5OyAJh*G zK!eZ_l%`=k)HiLI(KX$N*pJwcIG|KigNTEuh7gAk({wQpO&4Q4N=3$tycZcCVjp6^ zQZXigIDl$UshEcfvA04vfY=N5DTRlK1JEEeq*PRChE&Wm1N%`b@;<~qjPWB5K!Z>! zLYGo8-iz29p+2ZzsTdQ$$N(}yr6M0fK7iKFp8U3-u|*4iN{GicAo3NU6wBG3HS!GG4^KViEfg`<04J0QmqiL1+k>5Mr7u zW}~@cqzADFu@|uyF_mCNs2A!h!CHv@O0gF50c3(oMLvX>O2s^0s86Y=`b(vXY5;Kn z)gUwkr84ZZY?zVL*2CJz?Lo%NF*|_RhuDYMuT)e6hy$nw(Hlf2#BomB5Mr8#V}yF= ziTS;VeNaC%01YY?Glvj|cs!q%`Pkun>QgGl_!0Yg44+xVAt;q&b*LBWD;HyY zi2X`MCV+eZnIJR-r3%cTRE+c@_EumXrDBX9u^-idQZXioI0U5ym<{TM`k;Pj02+jb zl!_T>A-Wcd*n`*$^+Em605k{%DfrA5du8fL8bco2J)4m0j=??dc|2B1M` zh{yAJK}=QHRTbtz>_O~RDylxtx9{jf#t#iZgU}F^sxd<~jtj9@DP}<4hm2pT$OjMy zWLJ%t!3*_4{m=k32n|807HcUL^LP<^Yq1vM05k{M>6}_6+qw{YphOfH47Nf{25NLr_lxdK<7hVjp53V!u-HObH+kD#cC^ zdl!ote2YcKhu9AdC>8l2;t8L(o)O`4M2lXx(s<}02;gu`#~I1Dl(qSvDW1x_9FH{{mA$c2cSWvVq^$0 zEfc-84D%rNDis+YV!u+62_Oz)d=PO6N>^Z>D=-gY@0B9sgZi%&f7|0n98fAULF9wT zgp`WB_bR++zDmsChX$ZQXb4JvQT0H*P#@F}4M2m?5Y)RI`%xz;Dl$RDA*CWi zS7Q~WBI8BuyIRCP!~tjsN-HoP>V^8CerNz1f_heBKhOX)1f^>*1Jn!kLH*DGGzbkr zX_Xl7U)8c1zYan}P`XxRyigz1;7>RceZ`;1&f@#id>_O2U-Nwe-+#mRt@-{Re4oho zXZSve@4w}H58r>s_kO4I zQSU^36!m%3cTtU_TSxbeo)Wzz`s(OsqxVD~iH>cQ*yy}Q`Hh~Adn4|%xS!)<iB!(Ux|HN-1i+we|MaJ6gZcdU~7kHs_^!Q%9vPNZpY7bn0uVAEthm`c>+W zsYY6CTC=paX}M|Mv`J~DX_u#6n|52;U1<-cy`6S4EiwJE^!L+`q&LrKo6#*}PDXjg zB^g&{+?err#@>wRwoTi%YTK^ugKZye`()c!+U{%nLE9s3PqvL~H@Drcb_d#h((ZJ- zpW4NE_%FRY6Fmz&S9(@@p6&2@hXWlx?eJ{}cgI#8H+A~1(@&i`ch2oRuJg3ci#y-h zd3)!5olkfEXXoh5W|>_x`(}>MT%LJX=A)UR=y`P9wl^eWFM9EYOU8bp825^)e39yes~BLjOTAgSMtow z_;J>lKVN^N;bvWDMDwTbZ|Ajo(t4v2evWyOVQMo=Nef&P=^3^@-Ha(*K^G+OB=O ztaiQH^=mh{U0%C!?eg0dwOiMDcjxcgiqJBne*8awh2Z$~- z3Z5gn$S7wWV7$#b&^W<5$f(&tG}!R7dX3gQ`TrU=vRH>2A=Y8W_pHN>9e?Ei(8lpZR}OHs}SS@kS!+1S2*`{I$~7 ztdoonStlE(S*IA~yNU9R8vadaQw=}sG~+bubR+f^q5`AfRiZ+poOOobdyS~bSj{@q zNPL}WmXX6c+X%4EF+6V&`Hb&bi;dWQM01VStR+SkYpKzXwaggFI?wRDNi^TcVJ$bj ztQE#Y)&)l5Ux*eO9@a`@1M4D#-Xf|p5?QN_)vPr}fVI|03=!2Cd>N#AVvvPWHRD?%-Zgu1Dw{)W%zV)VFeBJ3qbE%lG1I2v(xrMJk zx6u3a9$$Mtq)+H59pl?cI>E0dr}&lR6x(--UqMdstH&vR)@oQG8qBen0IFcUSkFe7l=(E27^|yEeL8qczcAXWktBb0!QLFs{0Eab?*cs#;uC z(a>{VUGbu_ORMV^_G~DtZ>aBCT3JcMs;lZ7>WV9>8uB?ew79-(eD(0+hGH5&RkY-t zYcU7bTQt#-c@1TC<`^*<4XG-{{rJU|mH$%8uUlO9FR8rZ%KCrJjV~VmFQdkl)z=r# zFB?`~R($ec%F0mv)=R zOGnf$F0QO-_)n<`^YVSYc<9-#FsP`nu3|J-;^`_bDXuJ&whG72?qNb*X<1zvjHxFD zLzjx34y!D#w@UTqZn@91$MdhJY{>#EcZi6Y5|D(qq}`b7Rgz_<+g9ReUBQ9zcYH5c?S=H(flpvdl8cZt@PTj^x}C z$ip46s79QY@R1}QQM?mTnbJ^KQ8oWx>Np6i91d&>KMnYVRM!ourzzDO!}x!F1jyC% zDyxedc!7!4{1h3_4%bzb;PFG_>gP{wsHl{~##iI{!y5}5F`@3uDYhIu3_njB^CSx z!M4t(0F%oW*NamX>6zT-5IKHmMOAU#(kW~JKT$3dgV9;AsPcEYQC0l#sw%FO#-1hd zs0bfAq=8S}+{F#be?EM^60y~oHiAaYud2pb=F1aJX(+C1s27vTfe{!nazs_BIW8O` zM&*~+@d=4M@Hr!v6qhvQFRkHU`Dj%h#gE3~s**B(5dYgTVu$9elwU0$sbbUhbZ&ke zL*#Tw4XLlMm|rDa&a10l^e?IWY9xlz@Ln{$H=Q$5o?UZMjGD5PFM3N5{_8bemgKct z445;eVo^=_gCMLVA1=61g=P5?KY<@u#SPVUGHb5JmtpamAQMyT`NR&Xs;*kPsCsez z@UqIX`Fsho7*f)}*WrnLAuKB$x^!~cJQ`9rw}M}w>cTDo&YgQb4BJL{dX9Y5{=4eg`Tw8lzn^AY*`m4f@)g!=Can%lTocOV zb=EwWk*~D;To_wcTrUR=X&6_nLiwsDpEhCf99#*?hKcJ+cv?JnE2{FVEBT?#Pjgx0 zcL(B0Qct6*_@%v~bXavM9$59nSO2rmf(e(D)zwv$mWek%zspUi`(0{W#gek$4aAIi zLh{Z^ic8B%#akMY!0S~+FlT7lyz06#d38QJy?kB64CA@0tW>@}cp&6wHMDggSoGR+WybAHg0h=I3y!TtAPWCDoVm^JM~G z2rTLo>&i;X#Pf;kXLl)cW&f+aw~wvsxbg&xq)0xJ;78C5wV3L_E(0?qjgT-Jn*a4;+ z=m43IUTlDFAPr0dJHYB#^-l|il zPMtb+>eM+^^}t}_2j0}In0oO$3M8dwPp=PC>DQyyI_y5_+-w;?&lU1!&A4tat$>6A zhyc7LdkL=rZaK+txV2eH`Y33j@Ci$$hD(fzj5BeZOisom$}JfL=*&$Gb(EN=W4 zAMkp#66u6T{4!faYQw}iJ~-*69;;!r+v%Q39Ov;YPtL^CtTZt7Mtu>FfTT0h)BM7l zQJv;v25%@CMg=R0v+~wJAWN-+B*U3kX-v&#RTn$0OV!%yMl-UVf2nrAjW^7<34osj z84?W{!(obUw$(aPc7aG(zgRJd_67SAB|W)RU572;X?g&&IQhztcpjNty;t3ANlkGY z7`jxW5GI9MQfj&etpd|y)5K3ch+t_sg0aS{Z>&kVOXzCD4JN#V%jxDjM(ebu~EKpilZi1$b#kRp>YpJnT z`$iK#l8Q7cn+t+m)_uGVguxlPPOYi9P=2k5k{OCr0HH;NaX{#LXK z3)9S8yiaYOP^;)h6Co3cvkUqe;kLh?pSSh<1xDi$nFYsU-Y#IHX7bD~a_M}QCBIvk z`tlBHA!{%mq`-8owce2B6;u{P&{94#3&pzz>9tZP+>`Z0uyo+b+>&y!;R+X}3mmCbO%93zQW6An|Hkfq!eZKa4$ zQg!_!S}A#ywF{OaaNE!pq=KWB2gktD!f!>*28vfVXIik(8uwtSrShj6Q43>z5)52# zU*)0)qfZLhHo~BlCr+x8P6ov(vVzj&D^dG)W9fPXC0&OZ^-iOPs=T4?tWrSB+6uCj zE+E`@xd|Rg&cMpVZgQ}ioPi|=@}QEckZ4aUZjh6G+LBdSUg?t<0jZ|D+RaoI{;RcH zHMLSj;9v$h8`8LeVAT_*T<8CK3mS7ZO5UAUaIy&>Cww{Ze&&-zsQvVrx@g)!63l3H zM64!uhoH;LtI=XsG&-NjHMJBwNhHv8Bv^-!2!lnfZRld6#=Jy@;i`x8B{qucQACYE}@>HzFJE7>ZfM)bgD=;lbrMm zJA)#e?sz{{g{yW6rix4@PGFPPv_^B2%c#^0uMVBaSbNDtmzrquMc$0sZ&h3H5Miz8 zKL-liSt?)e`T5se)sI@tuTseN8i)acBiWIG>g11ZNigg1Zpk?IQYlKUM7Ye1l7yo1)51jZ>^XYk{3OkX zTu{{zLoHyS!Ev}yUHYI3Ur~D@V(%~96&on2V8PP4P^ZF4N^_!bU4aAZ0;Y9}n%WAE z+6C*#n5{?f>=P~?LUv?i;9WI~;uBj~6r7Z4ug*dkk0BQ}lL8ku6E{puIT9V7+YwB` z#tN1-aOy2A(v2R0A+3egMtz0fuvr$?t?PNA)>>#RFSKB+F0|2jv$iSIf?0{$3;Kk~ z&_3xqy0xm29Qg5sy%N?jbFc*Ag--eAr9|wTq0OLclfA`7Ou{eE$kM5YAtI0G2EZr!1!4g^hwBQ^DA-B-1>Xl}iVK#)Zy zkeWA*MOG;Nt;Pl%Jb?mN5TfwwnYYLlT{hRNX)apC@~r^p>T0c3oIhV%{Lm}d*nl-H zn&`&rdg7atVL4l$*6i7hb_>(T>~admHE0gg&ki_j_RctLMQr$WSbj9HD-U?F*=#gP(Y2^aT?7LO?Qg|&Ar1@~iJ_PW5DOfFnpw7))<-97uhkXB44I3G znjSsvkR*qK70waS3TIjI31?aX3TIxaB_b4t5FrX@u@y5dSO`nAbq1+cn$=ZVe+i?s zl`el88fOiomt6vPs;snhgxSGJ@D$M*kmfe_* z3eqRr7ZAdrXKQBpDj1A4H{2VAzz7Z@~OkZtf4U7 ztkPRcj|^6L&WP4G>oLO$!dvkhS@?5mw98E>Flz1#&BljOo%I>2Z|~K6gtS|GN^DG; zoYfkaF>}%CG9qL6G@{K#<73%Qy4gKOM_VrWN{tc^E0Nt6HLpiCJT%vvkzMt=d@`;u zQ)(>C)tYnJtMv$$CX+CwP=#CNXdk1j2Y(uH8qj`VeBUSXFR} zz`#L9ybw$B;P zv7XPv*x`O5f{9m{J9(>dH}Y~-%2O-VB;sSPHyUlm_nj=$E6(@XW#+_wcgdb_h&e+Z z#7r{z7(J{O=Y5iSk`PfI?8?S!yN2}_=WKzSk_{kvzzdr+GHZ)9E(+n|XmJ}!C&`gGc z<<;s6ytQkP0m{Jy{-4w+fvn?U!L`i_n#QF)Oj=BU+#eEIdmKZ%wycJJ%kyTrEl1Fp z2Fu_i?hBvReGLofLdI0<64H-{b}r`clu9;3YE!`}EZmYkG*Hg57IWB8aET6b^cX^& zk=sobHD_9B2SJ=LQ};SU2Z$T$oEWTkzy*=hLpueS%36>BvCLE;Q|Bc0GXyaa9Q`1R zOK}^(nX#FMmswysTCPGXq*hRgrh%Itqr4q)N83^~2VK3o1Xa%|oRJfk&5ddK>`6>m z^;+w8gaEnIPO|7()u3F3_vS$#FP+&;%oBxuE8B?h8h7LJ&2f#62nKxwK6sh z#mI@kT&XQK8?DB2dvt0J6Y{#zFA|7hNsm&~th@ELOtQVh-Rn_af4ffq=^ZiPc2 ziYZt%vl`3Ha(+}LDG7mQY0Tx!)Dhi`n~()3>L5fyR5-iZglHfV(8xrq3K8ZP{H`fj zeb?+rhr&!qb*|=2FK81~)wSNL!f#(&mLNbI%X}YPrT0Slgb!m0hPLeQQa`U& zO*W?6HHp1&ZnLUwdZ%o2 z8-vj?q`(Ncs7kTqv>?3OHfEF4MqIufJl3X;)a{Xqa-( z+>JVS#MG8+(NZG)E;CMz~SwZh-(OKP)(%yRk+OhrsQV+h6mN=j(BQKt)bL52Kyc+V&+_gv{ zQBD)@LQ@cIN0N3c;V4o$ZC!#JR9rn!LLxY=nfhX*zPP&4g655-E*2cC;P(LPQ@O8F zj?z684oJpc8Wkw^h*a;4;SpL8mZZHjB3$wj+p#N>M`%h=0{7CAV8KUh$Zj}XJDm7K z$YFcKp3~_H3VnUk`uk+ppqRrmEv!lxVY$|^+*^_)CWtq~?SJ9+kvAiFC}lSc-?V(D zY*LQLc5EP9Vm^zTUBOT8Pq;4j_nnU)|>)y-;6bgI> zsL};vlSkH!;Gmbu6i{kW+7dQYCj@{*@GfqEd$xg1FE>TDf;j?GZ?rt*JS%y98!++ zgQ4VjQS7X6Y;R3^i;=Ls)K#M(*YDd|LF31?t|$HHO(D`y>2RPN)I=NLyQGmFC#l;GD5Eo@Z| zG52`POQ?QfNwxt-x>wFD)$HEYt5`TC`&Y%Q80Yb=xu#C|r5XeU|KhE#D8zk*+_I}$ zNv+wNx1%~^NF2}LPBvH8d$ww#Pn4Q14glo_ozrn?X){qn=V-46v+URrmrVwsxMIbf ztC#GgvQ@ffmQyvSGc94++A}~w3i2@N*1Py4|KqhZAE%s#M!m>JzcamV<|UucXCwh0COfBm3e(&S`rOmF%TVu#$Wm zbEpFBaWF|Ah1(T(n(d~&mP?UJ7U1NO_ye;edB#TJ6GF08YUw0DfI7*XkJi>@j61xs zh}*yzGlK%C)f9rKY6TZ|Zc_|kDWi_jO&o>w@1aPThFCJQjEgbG5FP^2Lb}oH!p6$! zv!~CUJOeM$$q9U%Ii+)??zGZqG(Ca&RK=pcc-b&uALD87YPGH~LW7B40pRvA8*Cwl zbiu!lqrB9OSeNRX!QKP+T%3buS~5KFIMG9H)Kj?|lp<4UjaS7cUN(iZCFo!-Y$CRz zOg4xxG~0+BwapEFIES1Tr(;oFZd^sEw@>!b%X}-=IJX-yxG4pUdvoowdkEaCb>!Fp zB)4r(*H&t9;|pE8La9fv04xci?1U_V+7X$J(G)>*R6$1UoM)SpFXQw)m6GrWqLVf^ zT&mr{Igi^QRuMyrhlq{1VC@D6`bM;{fU7)i;X;oEL>}QMS&YPjSy)DBNS-q02*_j? zqN{ndCZ8$QYc4k=ASPQ~qQRs|Z(=E$1V)%Y7eyZy=I7D#m`~Qm5v4|=m^pv1hF$&P zf@E5@F!|0PWg4-sH_*_;phR4Ygfht&bPLUoxN0YciBflrM0@g?JCsXN z=SpIQ%}`s5#~tQxM;EbuyD2;)yBtv5ia^zIUJ!jMSK9Az7FG;Lg_II+1Dw+o20E$b zyEblW6J}%FY)qKdakGkNd~M)+dE6{dm?Z=>mm+-QYr^0K&o&S}tM^_kh+5AkQYoFx zfl|xoAVY~ZhLEYrDY;CtDn~EQ0G6adFa}(T3>|N4s&gkfU$rghm7qx>rMxun(Z|ID zZI&&B2)yR1Cyawl)#PXRbwIY-y1J6jc$$+p?P#$Fy>}X?@(Kf$d%z%y2p@3;mM+Z{ z#Sq6tbp2c1ykI8^Cv7BI+M@8R!KKV&Q&nB;VSWgZ8Uj*lG6SVwEgp+CnZR1(rZvIZ znB=|{7&6Q__N7KsYGd3*qjr3yx`Pbr-ko%^3YX-#@>opgi(7H?QHUaokGSWH$aEV( zCBk`?4n16j63B-h!1l71xeoW%1s?f=7-9oO4ZpsHNEZ$|^J zU4@XJm||?2D}>WKnL?1@P`M=87G>k)D7~WRt1w&5Ip^g|yZbV(HCr;i6aUT-@rA@`wVEi%)R*esUT@@=bf zy9X{Jl*F0b3J8V^ULfO6=h&?i!9$>GYOAX*F}O7q<>giseX|kLAQtTHP~H~xq#eTF$U+CTWGs_6*stk!R%CMQ(c^rPuiz*OyE>n9wGrdOjE zp=n)d-A5ZkkRDg<6}QHUb8&gVJrv*ctGBBvDiHBCa^t56tJ6hfmtA<|G8V2jxU+d3 zvTfc@E<#A2+)(j063t)bJgS2&lIFRg7XC?Cko zV-Tyl06{)4W-ewqoe zD^H7N<^+p3E;=Dko+&i`O-UF_xY%ixw{f}}jX46QqfsN|wJG#?6 z4^@}}J+>6BRhu8?%P>^ktgYN`=d&<~mtdLZGh|M$ZzdTw7IqyMIZxF@pb$8(` z;QYrOqtZ4W#=0+0t)#pyD0mTtgH?q{l)H~5d-cUArU;nJRI>>T#7E;@WGI|t%%#aO zCmt6M4!04QTlNA5GZ*2qGtgXJO(3Mtvc=Z0QsaRMIn-m9iwN*vTfUF0?|9D!Z1;=x zyEO#&d1_mh+gGD|a$to(y2FEWDz;?`ac-`TTZviy#(F}A+hZkbD77pQ8m6-k(@JWu z@KS_xva;fKq{Nm^f(}49s}55KUJ~r*R+(arM`}IW}>2a(e8{#S_z~&Q6{< zb?WSy6Bnj0ymI2q^qI+t$%(1S3m2xpW#u|*>eg`xLBj9_oLmCRMO}Nt0Zo%_4lArz zCtfjM_`;gpHZgYp%ozSmoH;RW>=@7^3t0N;Sh`e;R+lu6jZSul1q5jh%UNKNA;c?M zt!EPl`e{*QD|`i@*|c+kv?@_zf4C!ujj+^Un+o4}-C|6ivpbmK@jBTofJE8h;AMJu zB1|snwiv56*_mIBu-&(qm#4R6dH0|@N~53eD`RG!Had5RsL;Xl$Q0%<1$X{X@0!qx%M>6&TxHh9#KaGPoy z5#P{=BkN8*Ch~d}-UT_aP^I+9o3IU<*s;T2MPx$?D^MlycbZk`2z+@8#DBIPF^@10 z&}KrBIzx(^#p=#rMF&#E1?JT#?}iR8bSSk0P%wt7GlmD~A|Zys5jhG@ z>2`;;b?R1TauYf^EQfUE$w4vIo#E!Qf8v&E`phW-mt(f_B*!)hX-~#!n9J@SyV|%1 z7YYuSz~!#w(yfg)a@l4d`6Uw#k?1~Vo|S9a{U5mX_C9vlU}b$9r#^5#Z5>|Qh;blB zHdsbZWQs4;ROLP)T)qn4-qP95O)4@djcjKT6A)@8b;&P%+>@(oxIt3nMw;cF2E~#O zvsWrXeYdG3@du|;?7UE`uWz*DbGPm?VH_&R9W6C$)%!dn1|t9g7aTZ|6QkBT2p%3K zOD;E7aD0h=%=k`X+~erUMl#dQ;!rR=GmN%+`I%P-Aq>XB7upD-Y|t|Wp!QxvA7|01&5``iap^d4bhQ= zJv!(}9!#X8HNgx?0mtQV9Zbh{o~M>lGz~Br+FOVdcwr;A!sV}ts*i{6N z%A&nzleGGchFlGl2bwOb1dV?w)(_wzEM^}a-Ajhpk7Z@uW63E;ZCoAXY)TO=pV`P6Ym z0-wTCn0MKl^ORUu-D%Wrk1`VIj8%8&6521ZlZhJKyB^6q{a|;gX01Lp+d9sf#a3r6 zkm8AZJUb(gzmlK1$6ul0m7dMV&!x=}iXVC@=C~;6s13cGEq4;Qz;0_^U>dL&+u)nG z^Jd|zth=}Y6Q=?Na*YC#lg38v_=P#@&DF-ODsC!ox50jRt#&;Bh#yK=NtQjZde!ZV z04{DCp#NXz4t9lHq00woQI$yS$)!R}V(fAJTntaANUe6vG-qOL0_`WFyy}qTjM9)a zHJ+q)#C~EeK(U~#ISGkX2J9XvJDhJ!1`|cqmK4p#a&lR!-^DTki$|N;RlCw>%pd0@ zH`o@RNNTUKk$vKhK4%<0-L)jNjQ_S zx`88{(X9>cig6AF*b-~&3^*s|q=38Rmb|$o&J2!o^Abj!rROCC_`s1+>+a)jbvYX9 zs-^j)OKG9no1L&g;I`k`eJT0b6OGk^vy1{fzhkbO6q731-*&f}T~7LE8qd2e|Ek>M zV$?-r9-Um-WVE>Vis4#37RR&8fQi$$a*Bg#xG+O}3OnGM$gX=PPA>*LM;Yn5^3$xKO**sbCn5#Ry<~?uy{lP6#IUfB?p5 zmV*45Ts2d7r{xTO4OdJ1r``fMys{bKE4WtZsu*PXi$t?EW1W+&nab3zpM<&Y`TT1W3k!?7 zunING5d@T@SocNrZt&C6KEp__USmC~j}iKJd|?5;32x=h)9NGii8}wmU|E98>=n6-fhx(4l1Wd>}zR>jW>qA!`wn@uaBnV|_c(Rk3nT%1&!PWcG;s%$D zaUu}NPXt8xVTpQe8GZqb5-DtRxbjdQDWrBNnuS1>gxkDd9@xq9%1F$~Q?yH9>B|Ob zc}TEHM_5;d^(VUlDK0e#%Njz+YV3=QiiL#PEm}$W$=I2YSzX_v1La}1=^_Sp#JRYr z441|_JX9JM1qTpcyhsBF8{kK6J@s5R2eJ$W_<=NqsN<%e~X$_&7p zc(jEPZcvM_<^g$%K=7##M!>Lirjz9oF0N{^6Rj7?Zdv23;vJfkxCx-end!D>33Zr3 zWK9SRjI67J{KovHSBO*PNZ{PkOaaJar060uevz)iT3UA?sT{;UAbpK_F1;jgo z!U<2c;mP}&gx}l{)T^-KT1>CHheSub-+H7E3qKDD*ik;ttW{T{@zD>~ zSF*p-AlX^SiM>E_IFFCE+1m`%6jx5b2>~?b$@Au_nKkqH#m_l&5#O)jhiT_c(`=Xs zX;u8TFnsEGub9*L1=2BmuVLTmD*kf!X@o-y4O7Rj5m)d(LTVMkF*ANXSn@m|?f`QY za23?0wY=00!du2q3rn>Pm)J0LS^?!bJm#d)A$WmGk6|2l}6Hk8?}>O{7mc<$3UTb zJBGHnma+^&4#HcMdEz{{OJ1i3@(EfULcx-w+c#He!hGjZ{zrN*$RGR)~Ayx4vNnw@gEeN4PhlE6|{s@ zuAr_8ez$xaTzW}9$INm3)UnnxAvH~aZ^Sun&dK*lv`XK{Y|c5GGhxnXywsC5RxFt>A&nzUOER^FH}alzaKy1b zVEi&mUqBzTueENLC0E$b_icNRp@rJ=V`%L$ge;03jlIZ;##%lIXv&Zolq!aN<;0HpE^ zdOB2U2bx~UV+&IAY-mKChKzFjV>E#(f3%%Oi*&Qzra}iLatj^w zR5I#yLmZD00?esfbK8MeD2>^Gu@ev;__hwP6T@coDy6t$)qSSEUa*M%Yu7Va_jgJab;*OtX#@&MhMCcdp=@y1r_)&qb7L%9xpd=={HicIj=uw(c-6eNDW!@Of|%2klR1%;i*^Xo>B8DTfCi72Ql z)ZwP;)ztPw?|yh?29lc0>ExNhob9#OgS}?HtirUf+K+^4G+z#-?j}7}q)+O%4##W@ zvU0bVG6k(Z?504cYRvOgC2E$W6^DZmW2;yBWDZl&IrT&{!JIxXL!FabTJ2CFW>Z;0 z@VzjF>GVAec21`{b&ktB&DjV8vJEL)htY9O2I*~422Kr7VXPqK7{=IMut4SBJTD50 zl1syY=H#Q4rx}M^f~BQ22q^DrCN2sE<|(D*15EmLXpHwnrMzd1ZRe#-J1+sBwsRgj z;hHfohFdZk;>oLFSf7^@F$FYKQyiVt(wAT`(OkL+O+?OXO-XMg7;>~qn_kZJ9p5uG z1^Sp+b8u7P_7qd(W6&wm^s4SOFNS0yR4ZiS%@FL)yvWxKJkRZc7gIaS@$MK<&yBDQ z@1-o42b_4FIqOMq*UK;&UdBA9lKZkqF4A7e;~h0j%k=WOJX~559mZVASMw#c244yb zOFy>8axAp*Tl6CFBO~CMcc+{t5$Go158_K876gz2dUv^N-9LLNCmY93d z`suQTI{!JP+>MyDMsxZ|Va(~hv@$KpSU{W$mkMb_pI<0>FEFs8@TT8Pq?E|Go*rRb})e5T(qw$YZfyy!ferOd~IQaAQf z>g8C|x%T>4m0G_&*^vy0FXwq!Y!&#pQ1)=Pta(10qHXufp{)V=$Z{uB;%K@b^8I9< zS6d*_*lg=1Z^a`z2D)HBe8wnxcYh^!>mgtk%Ki4{dkIjlv;Hj9UV94VkL1hmrEaI0 z_fj|TozBk73k{Zw}pr^t-yAG~2WcAiW$|iglseFWyvJerxlXRZ8@jnd> z7x73oJTrs3+VEkD6Z_R{E<+L7phpXKHX^o?)QtG<-!BxUXL}C-6N6%Epn>(S=~pRGyk?!1$gj4O#4f=ZO`xzk#*KEpd69 zF6iGbgdY27>ypFf#2k950lB3wt0HR+4SsTlcFt^ui|BtcFBd_lL%1<~A$H0J@w3ht zx|>v)mlHp&`ew6zI*ZnP07!lrL!Lpm z8iHQ*lhP+;j-SU<0$BtH`cR|FC@~Q;erOi|No$MrAH5IWu7VFmI2d+Rm?8*Z!MK

tvxEdUP6SX!ZO=)eohx*1J$so5mkd@lrmoGBabs*{h(=}I5vyFSWWKFZNY*?P3T;6x7vb}!x)LG%#J6g_f`)#HaG z)5d>}i?vixTK!q>0wU}F?9VJ$Hpe5kp9p?^Bjxb3nAqk(!o|L^W>%Up~9m+$34IgT?cVyfUNvQ3~9VRR9h|IrLjF%dr2#dr)-V z!{rU8)H)GWGQSATb`G|XsD1++Wf^Y0QE4&rPO9FfOqt`7cWx$Lh2*6&@mO1$fsPfv zV+~p7fvm80pp4Age5X2tYs*}xR2(Z&$DLn-MU#`mEjujMNWQe|tgOo}6rMdQ(z6Z^_?1uN*h?A!;gQ=UUH5<-~T&^@$gs0;>vFVzOrf-26j)Q7ME%9O9vtf~fOzU*z1_{tZLkuQFz z`{Hiu*y9$YSsOI*;3;gK=B3_4vYvNDEmpY$qK4f?O`iD&yRy9TiKTW zy=Kx%s^*bfiSq_MG^9!*rmOUbDPQ`iY^8@v9g^0=Z=mbR*!>nL3vBo=>7?VOpiF@xbLkVe6pxkTkbgr+6i_dRW^AU~>P;;rHuh zd+pMNn_xD-r$Y1h>8R669*=%w;9Lo>F$N2TMQO)2lJ_ohgZ!H(){a1$#p30X5T=tz z{-jXIo=sqj9LpnO&T;(eKYS^lXRqRNzX9878e}Y4PZ2VakwS|&JV1d>Lu4e&i%G%k z-*kehuN{%Xi>jpCrub2&jAZ>?B1}8>_w`x7c5Td@k!`K1XTt}QkoD9g+*05udtrw* zq3@nO1AqAwNXLT8i-< zHzr9ZnQlG-o3br9xo$mVs=1#F<1B$5vQnqGN_=Y*S&IB2?EtINI+J9|AFY;JHD>C5 z8cl37zel0wte{4z71USBsv)nS9)L7g)n_GEP+tR6H&(L*D=3#Mt<|_rUwS}{d7huz z3%Y|&zKcpH@pqbRP+_B3(ifSX=vzHVZRXdhwkn;y*|ymKL3(`Znp z--x{u{f0kMb>_D*B`^EPC;2hn`(-Lj8-v_&QD%~m-Jz0H?;}^jHYiQxCT@oT%E#AS zJKlaD*_5a|u)BdGSxSJKStY4nDw)YJSAjM-(_ue92Euh3Ie=0haL-74h;BXv&E82f z;IiCd%(n_bQD}U6H}@752Iz>SlaG(ghoM*zxDZ!UhQ92WB1c7w&YSq5gPKvbxKw4( z(r;q8lIbx$$r8a%r z)22C#{=?F&7;3i$!No?(mbiEVAytB+@1Dc-<(AE&wfQdObgL{wo0K+Ozq6*T8mnBRfF zt@}v$cO+cv6?W^p$y48H%Lc6P;QhlbHkPSWinYz2GN1n7%FI|*D)V!mGPf-su%1JR zy;oLbb+6VIs^RFNk#+h>nL2~p7GA&H3;6+JZwPI1;>xTxqS#Dr@jqQAtqUpkqq1Vo z)?ymk=g;4Mw5$Exj?~un^&N?Y9p{>j8``_ui^4rc;RHVGx3s5HiTUlR&h?3&L~l_T z|I=?XQoiFlwrnvI=bP4+4WqfGXBRNNX-dJ^&aU-awr}W2%t>``=rkKQA6*n~nwn1D z(s{O|PfMd)on4zGy;-BL@7}SsLy}uGa(CysiaK4Rrgo$zlYB~MnBifiy4$-YXC|zg zRWP|evBlhk3f5093QuW*^v13Y9UBv?SFTwE0&0^0+S%2?l*AO!P?e6Z4V@bk$V*}} zD^)~hT|95;D$0v0*m;?hXaW%xa576O7mOOHViql5eAe<4?DAp0MqjpkHSz2MP=hI4 zgH2n^v)i{MwsfA`*_~o@rlKY)Q}bTo8rKlkhoD`9R-Q0~r-RAMVo{7WG&DCvY5 z?A1NIc!{dVl%}c8wsSXj!Xk`S31!$uIHDaEZ8Q;fs#?>g!l-GK%isp2r}++uD+U-11ec6Jt8f_3PI+n${)~nT~%msF>~BJG$1J z80io@>pL)3PD)_J+>Q}7F>lp^B}=%Orn$|uX3e5y3zjcjlw3a{ktA>oY$F9{rMj)t zlAT@M6F{wNx?tMIGZM2C4N>&Wpbw^oj0o81Olvqtv4jEZOwk-d+yW>)2n0k*1T^G?K| z!uiIKSGk#~eTSmX9T(QDp{|{|hNMaL@61-YQK8gGqbN_~dcRcz>S`$pH}j~Xw=MO= z3FozMIU~`T;)>aAwjn{R_VwMeuRw&Org=sI(e?N^BQZBIrfu};W5(8ws~ex3P~R|d zQsd;NDO0C4w@jZgbJpym=FC0%nAUmo7c5+~_}Jr?9Dl;n6PGPtanj0FtJj=-%G!0O zo_6}_XPkM~n4@4HrjBNP>e$eM$=>2ITTUP?O|txYRn?;~7NKo0Hp=#)zSJ_MV2jzc zDSOPC6V@N@Wyv?-jTN6a(3bmkfws7Y})1KdMZNS{w%o-AQpwnMCe6VC{Xs+pUp&Derp*I8D_x$V|DNp6jLdl+J|nYtLqZzic(x|H&!PY&<$uR4Cd zK@SD-iQwOPQyZHaTbgD}#Z6=(^28Rv=oBHwUMxf({@#Q4VaBe)z}mGbMG_OSn7tGS z_+!_s68pX-zgu_gv1^v#%uE~r{v|Ba#?Hq=frRl1;DqXw&+na3kOSmj#xz{(rl8sl?t3pRlS?P^`*b znj03E=WYS~G{c)1ex2cC41dV**9;?hhap+Tu#sUi!?_Gk1S}SPd0XOF5zxT!(UI4W42wt&(a%h5ft|Ty{yI7+#xh*O@N9;?46kFjpW%Ov zd2&opgvUNPW|U|fyJGApv7O;=z@WHe?9$v(;%=rqIrd&~f6M9DkPeFCTH?lPi9QD~ zD7tD-s~sh-LVApNs`ehF57&~O;5d>@j3ddpfI+bVlvU!Xan$PJx}~tWk>UJ0(y+en z-m&Aw=jw?27}K8sEEChmPk@)UjVBM^JDz;|H^87+oh1DqOWr%SN-Up1K74t?VR-ee z2_&<-p8S7q1NnJp15rM~@F9jj01S$S6PM;*BW{@}#3=EjiKNGvbVZ~}lrkI#I7+OU zMD$CUas^;mygG?m{Jut#e1zeg$%)BT;`+%%xs9P{x*`%3zic84Cr=>{v;$U&!&8V} zHgzd9jGIc@R!*h%-2xaC2d7fIyaH}e)J&sv<1|V)GrX($rslBN(L(M13BXYzFnz^X z>K)Wy2-1Hgq7HY+^Bk;`u{=C9A>PLr3qpplo5Wp^42enTX(i%G=qNxxoWds(C}=Q9Cv<6%W*J!I37A| zWZvn_tHO6x5D#D6E-FQh*v`Bj=8YD8j9tZ8t+<@ATN!H*xL1vQIMf#-@tX@bFz+$u zHKLxxdk(zOqDkDtyx%jgNqm*DcMS5`6!9QS7GqEwC#H(Wm^UIoys6@G<~4&iK}-`r zWZrV-O%p$2-a7CmiDvO@#x??*0_-;|nPSOi@!K@sE6nRvyx%eJYUFFde}84{Heh+c z-ek!yv*Zl%Pv$)W-YonVG|0O@3;Z@P7g#=H?*&S7@_-dEHYcYf=SKV<#4yH|Gd4#= z8QZ|vTv5STim{``2*xgB>==KJ>Tv3a6_u~!t(Lfk_LWOQ%w8j}yy{a^SB6d&4+UVW;4z!NuN4!=^XeJVX2_ zuN=O5p5dSJ;z<9CVNQMx(mDCl0CNjx02UM;1z65-ULi&L3c#TFS>$4*TZ(Q0+*EWI z;E(c1a$6C>UWS)3_eXhO0p)pyn~L@$-BkQFz)uuE4R~!a>HJdhvw%Mt_E*3chEe*@ z!>Bd?$?&~lRN}Wwo~3dD4RL4bD0t@UrDFjPFdS1h4e2I^$CQ!I;~1_ln+f`6hTF<0 zZ>pTUx}%(AE@fC7T?0xZ!)J$|hjgl(YH?KjGNd1le;V*l6}KBfQC{^uz{)DJZB*4W zpii!P&d3$-R=)~3bHtxOIVzqPaA8Y}kgCR@mE&y`->sh|0_5arH8>n6ZfpOEI=qVYe`rsFk*S zkuiL+4nCKO#~8a!VFwxeuEZ){W$a1Cll6N^VX}TJFhi1-;(V^V!fF|NT45(M7Q}2x zlA9QdDQqueNrnBAu~!uKC&u1Z*vJAZp?JL1vXU`O!mM*UV>1=Dr(i53CnkxvQ~bD~ zUIfHLj9n&v3(0_3Izi@(gb8~|VMj4`DLsOMot=!$!9yX!u4L>wg?)~(FJU$YkG+In z3X~W}K|mZ(*bi8;UtvFE?AS?CC)ELOb}Q_6%)3Wn|72_!t}?hK;B5@TR0&TrwiA{u zfR=n*$f4S%3Rhvh`YL0WiN3;W^wnCdohjdL#xSTbb|+)EE9^eTHn&LL<M^>ut*S zPsW;Pi3}_!LOP?fBv!-Nl@eo51jV&!*sTtBI`Zw4SpNFR2CSQ(P}l{LPGJ2K6Zb{B zfE`xYH&H@?sG3dX{oZ&ZvJ==ug%uZl67&8Fg^en@7H74a7?Z7nOT`jnpOuNL6h?k2 z6R*&PWccjpqT7J|eXhh#09Gz?aRr)cyQZjGM8ym98RPmzMZd(j4pH$|8jrqQi}F!l ziHhqK_9@nK+(OCwHe;(7N$fCV?SA1ARf#iVogGRBlG3niw?yG3DC zKiH|TX3lr%3aO=)v3)1$CDg8x*s;ueNnz(Pw(DfQyw6HZG#5XJ680(VyyEX-Gxd}v zSt)+1c;AMWO3^}_D){=T;^%<1GA84*TI^XXOMe5B)ncE*iiZ)lnl5R+>|yn2y;p2R4Y>cv9}dyFM(&sU{0)_j2~ow2nSN^Dd)@sm}v>N-0OFt>G`xv|GQxbcEu~!s!h_U9~ zl1Fu)D*k?@#NJ_^xJqIL!-@Bh!YUcN<{IX4-KUBhC6-?|e4{Z{JfN_-j6JQe)r`F& zF>%iDb0GPS!bX&yV>FAB&&u+4fHz$vCB`Mp6itdpKAS086-GXrDK_&1-OI$wuxzGy zOJRRy?15{g&OnTK??_DP%>BINH8OAi^%7gi7`A)(TqcfZY|l*+YiI0^n@a_xlD*SNuI8-$&5XID{E1U|!e}KoN3`80 zd9+5EBYvQ;1<*N1yr8hnjBUPMN_I2Wudt6XcHJG4cNJsLeUUM?WsZ1BV&eYz6~-L# z4~;ih{9EzJvbmz~ZLvD=uPer+7Vnje+YbUy_pl4c;-Lt*axg?*Z_7Zi3IWBcxvlHX!%;e8T&hOy5{ zjO%`kxG4?$l9Hsg_c7vrhxY~J81YlZqt=`+`uDL;)-qqb>R?~MDL}z~SswXpk*HMI z+bDgJn5eMvm4rR;bt&1xSoA@OEoQ7%VdpS*>9-|s2V+k>B(ZB4+x)P^?qRH7Vc%fv zqVExJr+B9FE@P3n?)wsZ0obu({|`7H*I|ixh_P$MpDOP+mWbpN%oA@{e#1CkEL2#2 z)x*XK;!KHgz7xep2YUkh>^>z)bzd%CQP{jH!omlo&Si|vSJ+y{Rw--;V;3px7RIht z*yD^nt*}2Z_KLz1)l@?5ld^=hjIDWEVisc`QP}4h>r>cw8T;%rQu0N{o_v-uuHSO; z6N!nn)jv0uiDR#N5*o0DkaND60b{QT!)jzd5TB2oGd<} zu-Pnm>Ca@oa~OMFVk+NTiYN0eeO^jFC-W&R2fyfbvUo^hD&OOZC-eP9VNEP~)eBO~ z2FCs+F_kayqU6bZO$xh~C7=C;;53Iv5b95VT%~6cvbRNNJ)vQ685BFcPmM1m9^qog`LOwmcAyn>}G7U!lc!K!^~4U z!xB?gk5HIwhph_xDr*_>N2&7>#uolbV!xE-y)LnTGdAbX5~~_bmhDs6G{$QGB6*7$ zdqQCsF*fH7$=fIMDeSk59gvu^n$E<3Fpgl^czRM52gDf$r>Af_X9CfS0CC>OP;x1a z@21cwo0!tclrF%4&?$dmx`adzh{QzFISw!&8USr==Q5?6xq4dK@VQ3HCE@Ql{f-6$ zlSx|`Fh>jn%oXK;d7=`~5W2SWn@E!CVu(jL{R2QdJ!XoXmK1o2Wh6aY`o?Lb^G?7V zaX(S|9!x(VqB z=X%Y!uy!3Nm)D*R?k%;OLH|;17bq{)b_Zq!UJZQ=>08KJK1nR#T-PgDIPRMTuNf`l z9xhlCSUT>pg6qYaaR&j5^RFtP8w7t|3D9PmL@QqVA|jXCPWv&GdPoC+d!chH-UE zBijPA>*z#;e6kCgw?uXXUKwXaqFk390g|~|EJNPcjMM7K+Lm!wBE6&Tv(S7g>)c&; zKbQ3lP;RdKNn}^x&bk*OwSqkPhS(38yI8|ryuN+SSUOJNJf7@af^vI|d4XTlmEzo; zJhor_vCfK&HvV0Qy|ob1jxhHs&Hd+Mse@6DK53D|!%RZ75nIPD_5I=tZQv zVPQw|BIMeVJY>8E$`z2`k-VztHRGD(wV>aSEQJ0qC+~*NM_B(8$*&>(8&3Zh(q#YX zus=587Qng*M~S-vbmBMKm^~qcnl1$VF)aT+G~ZeH47@=$zinJF;Skb&6P5##{Ri3d zgW|JHxdZUQz}F|N0sR0|o?&=-?W>@?JK+t$vU-9I3>Pw7!*ClgV)$c*{S5!i@V^-rGz5zu43sobxs?rHD_Rn`COHgwCn0@M9L114a8OX)4~nHs zIRo$w)UjH;&24lLKB>mjw<{ZJkoUTV@qpyjNjHN)92ck*bmmzp=&bWM z;@*a1aSpd|0=3j^z=E7tLnjx%5g1c^W^pOf8;W*NJQPo1{Zqs<4TvR9kLKul1L@0) zUxS8_F-82U;pXDeqP6(8;+^R4_Z7cw{Gs6xG%t*O8}#C$M?t5)vp+yBwLd_)c5?iW zhMm8L{5xZhE_y@t);~5-pDmb3G8Gf)M2XG}M+-VDyfx4=@$bczu<&2S6U0dq#jpwD zyon*eD<)Q>U+kY)G;DOv9S!BfMjMYn!)W6NfCa|Y!>We8X8dkq0uKkN-%Sv2Oq@|N z1$wH*EQSR}<)o@%^Eho76DQ3mF$}4>brK@h=$v$P3BFKj63'gv(L=)7=(pmV|r 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 HJn(-2LYuaQ diff --git a/SDK/NUnit/bin/net-2.0/tests/nunit.util.tests.dll b/SDK/NUnit/bin/net-2.0/tests/nunit.util.tests.dll deleted file mode 100644 index 9a2b9a0d843a5fbf3f565ddbc4e40df5795a2b59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184320 zcmeEv31D4Sng7X4`m%JPp(RNdXd0lrrhVC0(gd=WVq0p{mV!}uNnYCrNp8F^DJ>}3+M&mWhmzSKUSnufk7nGIy{ubbhKm!u?s>W8$Xkgr9y;fkR%~4auAra6Jo|ez#UN#Dx1NCydZRf z<3ABbtZ;HU7+Ndv5Y;^*bp8pVC_l)A)q6#mB(^Y-E{T*f6=cb;%NIu+nIyXtB!hJ( zk*EYtkPs46k-{d#^b%cWts?fTWn31Wd6paa>O-2X{gBR-~0xEgmIXM7X+38&YH)#jS1;q2zkJ&4eLqHR7$R3yJ697ba1P z^a*X9O{DgJqwGrT|HX4Dzb})aVe1?UmO!Bi6iEQeW-c2*W>w;$RPr+w$Ij0alV&`7 zse?!tm+UwswnI+-lPP3kq-5ZnKzo4#A@BL@|AKByMRFrVEeVHC6hZ~bDiZ!&JeJz4 zAYEa31WvmWrGg^sd;nxs>G}3RP?%DBzA|#5wTW2GUVvvBcDqBf5roc=Tp?AAvfNM* zXtj`reF0=lZU$9J*g~n6SX=OjY{f$WT!nV&LeN55&~En8PNDhBTUuyEL0$eTv`cx* ziprSk?xIKy@u@ZV>~;8{Vf3VF@>%Qfxe8Qw7nR$G`M1Kh_;-zs8U}nS{{!HUoI=i< zKw;)-3O-Vjvkua5TFZ)9<~5ww^5Qa^(<)YJ6|1z0Q`7h~(kS9I-sVr^GMPp_(zqpY z^BzEJ_-QaHv?#Rfc2fqaH&=!f^71s~tQJ#5$-N>CIcv`(ucor4{1kJ3KIPBPvt@o7 zGUkUu=a3&FpF@6#d~W$U8;w~B=jS^a@&k#fv|t5Bc`PqB?0D6Z(j{f~k`OGdbcsezE%r(J+%fPj_2ePd`M|N{)+w#Q_@`fRAsgM<9 zX<^wcn(l(T3(IHGh+x!EB9a|=E-egO+X!Nt%jdBeW*Vh}2b>#fpFr0fZ4@DM1iDg$ z%B)UAVwxxN%9v=m{Zph6igY0W96~%!ebD~3*78XzU;Bc5RhTEKnC<5{AZf+15IMi0 zF$4dFk{G^}%%DBQjOqmaBuDZv=RzeXL@6OI21T-)$WUbnOFu~r*Ggt!XM{MD5WR$e zLJF#1fpIHyJOOD7tUd%FUm=Df;1(8sl71$^yoMqu5}H4_TtX*^wKc$m7)KJJ#6^&B zD#z_ixW>cLCl^{4$hFo(5}4=?CR~?2(My?deMXL?JnLCZc(&$9xCj)AYy=9hlgZD~ zsvfZvUV}y28_B5MfzxVOPb{#nvZ+qQK|?p6_EteE(wM0uTa-;4S<<4iWjzj;2_|bfl3ISycPsY z3+*KZ@I8#-T@+g5^b<;=T7_p&bOoX01aW~k1(E1EdltV^e9K~DMu$!i^%G%KxNve3 zcp0HTzXi`2;dReidS8O-VAAXBzLAtRIyq5;RFD%x|y54|>XFMbW}S8D0%O zG}b^`v8pbQ*BXH*rBi`G9>i#Tp2V-w_~)VC%n$^hEfK?KOFzyihMaOQfM_#o340+} z(u;MHa_fMR8yO`3=v$CS{*#3EMk<6CBG^73Z;=-fp$h7Df}Z6MqF8b=V7=HE!ycz- zjFlArgrs3GnLii^@)g=YcHVg|@iFj0aXWnSmuNm=E-R&jmr>-f zO#(@UGeQPRLhI!qF?2174Xh%2h2+E8T>hPu5A46X_k^Ze1rsq7r!kg79YpA3Cuf&&Vsm zrQ}Qzxf#ESrCUT{^#Jv6=w8Dj6p7JK^-nO;pCMkM$g4m$LlHw5WS2#50cgD%5B>fc zyeD6aN91*Q&@_oL`JjZNiv;7o&vf0^CY>Nd6IQ2BzD4pP*V{su}w}k#AR#03i%3KZ=+Iy_48OKUnId7HHO-YO7NZCfQR*W2rjYjW%_#@dJYR) zZwG=kYGyucy#r|bAw-G16K|M*{5>JQW+2{0h@TSTUZRj=n7Xv-hq?Ay?>4yQg`LO; z>?;7Aq{_~pj82l^&M4zj)nr7tnK+k%kPh{Gh@jeuDqubB1S8CL0`Uac!tX;t$@f4K z3}gQRKTE^beI!?Yp;F~6^he1srIcB<4p1-}SN^8=Eb!w$Ny}}8tmN+{W+s-+*T8!C zawDSn(mdfCy52LhS(!h-;H((s8n!;*E9pWL<0)ls!euGfNMk1}bWGgo6)yl5 zy(0a{UJ=v!0-ndXwtgN^9$ROGwDngA+oF1PKO~bKjs0o|{ve54{VwX>h^@bSQ&?&e zA|GPX-7sUOq}m>l(e<2)+Zp>lVorUkBK$BBa)ZP{3j2VAHL_M>Kdd8%EjM1ZlPEPp zD$&;|L1rndsz#8ezWzQBs7h{&L!6S>BJh`F_yJVf7Qj{8wJOKn>olk5N*!c&IU4 zfw&kv(5Fy;Ks=m}y~gtY}%@{YZ=dRPphMiU(V&#bpC_$61WUc+Ei@<0H~Njq$EjER{T| zZMzd$j@^uuB;u1KJHM)g-VTKIDawoNttp*+aR%CY{xih!^daffF=V=vc;AJGy^Cyt zYNK9HxRh9wk&cpkE0^*;Udl9@Gtn{!4hKWO7~;4RdDAhdsocUa9}wX`8DT~OUoh#7qTyG?>g|Z?FWZo~ zIv1I27Lu(clUyufn$#%&G@j%?gNY%m#HQw7l6*Ee=frn17rwHTxHJuIOWyvR87XF} z9h5evi}Ej1o^njvlXatpD%M7M%l2ykDRciO35+&dHeEC!)zdg`oVi=#2CXd2GMVNq zdEVjWnZ~w#?bO`U$E1&V80kxd)I5Yxf-5W+n~OyQNOR9y&@NR`zrnH87&Nenkt0Rh z*PO75)p$=v`>D4Tk)twuV^O+R$QfHX?S(V8BFr30WLZU#Un3GBHF7635-?MCo6^+z zuA5sKX3p>wYo~1sn6TQ8E~FOBnU|{(8D_GsRk6=74{n$UZdc(_O}^cr{MK=YcbKEt>AO)H!>Xg z7eqfvla>u@*qeZb1ClkC8Zzrb#kx?jE?jGWkfIi@b0;u&7p}Me#7M=z@Ep6bgorj2 zD=r&K>=#JPQjJ+=|Et6-*O(Rd_ax>FllO*|cI{GTR;mfl)a+Mj%xca4ER8AC>~%&q zASWy&dp}O1aul4MvpN$bLD*HNsXm(YI|a8%ltn%VrJ^@mhjx$J9uzUYl}K#lU&%u8 zN#jPMvA+Vg*5~mWwjRNgU*(uWJhn2tnincy#lshf_*>LL=B=bPvMa=D$M{zZrfSM+WAeOaN4Uk=wYIfRw7`BBP=ayH*Z^o%I9 z$=AA}l-C4FRFQN@|Gh&~oWiEq@L4mP$d`ya+UzgmSAI|e@D&FTkDXZzozlX$XkoF| z>SJdXImjXxS?C}OT_hEWjBXT4UK5o`gSh1r^qGy`H;Mbcrr+0!M}MN?CU7}ZA|~L52oCi;SB%SrDwSDEX4mij{gF@+8=OXw>)Gx!+)l5 znI6N1Wg4!2KW3SL>~2DR&$SXpKHrOU+67dgT3LaHvQ?nB5{nEK=piRuS0Hcw`6j~c zKNHb+UEw;*fxHTj6y%$INUlF$4??b~@I;sO2m3MPpZ#0}+xS>LX}_8Xjr#Mj6Y@h} z$T(R%$DubfPVpLqY^Fy$9%jgXLdNNl^oGc~fRE>385HtT3ZaL|?Ufp7-|GwE{5(Rz z{`@>nNS3;Mt>R|ypttW+1(&{Rw?4S#A?=@Ge7@KA&+uI?Omf(d6U_9gKG;ruAZhIU zbqJUCxdX2z%<+wIhR2Cs+Bd@=aA8+1k{`o=boi6Km##+=Q9Mk0XXNExq+{TI< zn5)4TmY@7DsAgs>24SHS^i*pgLIT5D`8`46(RJgS<65`?h|2mQDOA1xh~BBYWZpO9 zH$uF5T+VxN;1H!qVe7}B+@xat1n*_mf8#l2(Q>W-!Q0ZvPw}*VhDV|O0?NV9@v74? z(p0PpGw`zSqxip|_>}oy;-#AUm6MQ<|3dDBZYE0kcV}ud@FBwWZ2vd0_!t_e1v!pOvb22Qyt=ul?satOV9Q|$`9FZ%Y}bddgd=X8S)Q0rYGHZ??p-) zYe>$zrIEJs=h)waENs}A5lf>~ju3VNGMBK$NulSi~o9izQ1y-t2O_G}|@d?E`+A`0M0{K&`4e^R(0ezSiDdtRBxp%&_R3D+mZ zl3|%woySNXXy%?rijDzNff1d+TvbH<$Q8&8k1?cr(us~u4@M$XEUAg4(VA@g-E>I8 zv?}tZ6P%ggbRM+pVTdP5G`o}DD6)MY-jX3G_aw!N;24OKlVmTBl|4_bgHIM9D7l1+ zp_Rg^eTENQz~7HEE=soG`#0gSb~g+fs}K)ta<~Fx(I-OKh4{E^)ARXzHpZW{ZiDEp zA`q73%UwYBhpDRk0@fkQmTuWpSblKXnIYyEF0_h?Em^hwDWdv5QGsGGiTs9Q^V;z%!4vh=C-W_d zAgM3NFMRbLm`ql&Wn|s~^7-mvF}oaTnlhA92CM%;>4_S7>`|~*fJ!isfwqNcuTZoE zq|(yhpY+eHGIDh&iBU$L?4Rs*^zW9h{X^38OSxQ?C})s{Ig6OhI)-397c>%GU5$0t z5j5~91H7(NuQjx@PrV;fdDwshct|a7$gm1o;}4*^Rv?Z+Msy}9&vnv9qzGp#YL>^| zxDmq#He(rTU*JbXUBub1qB4iEZz#DVT)tuT9pQ=%=iCuqQ+`KyZN(kob!+YjuU~sd zIPyEr&#W(DE#?}><_bhtu#9%2o9H^7=sKi{lq!(Y8l<$=O-bfA9k12^UWo7T0-v?u zt)!N`u1+JD!At7T5L6;M0#bv- zYs@mY4Y}87eHuFOe!J0jj-l*Yl z`jflSCFA>P$!r@nCtpN;pJ~S%7KYMKay5cxAVWd*HK@acikt-$-U(@y(R=kB!tO<8 zm<7AcRA@Ou`O|Tvg6XI~_zLpFf09P-%UXkA&%P{T&L2=M4l?&;agg!Rb}g}1%xII2 z+$O|W`B~SWkQ{|EnGuZ>l0iBe>E)QC#ex|ng-f(xdE|fwhh&@^ucYl)=*#3qkZ>1Gh*^D~0cnP(id zoNe!NfphH3U0?=dCg(&t>OwC99BG3Lc)!?rmwwDUkq30sXp4Etd*zo4@U5>Mv@;Y- zErX|5>p~!9%~hn2uhgW(RFTrFNy>?`5QVfp%WBj_HjFiN};LkmZKcT>fXSKVqFSiPm|9<+~m7K zMjF<$4DQsiG6(+#X(M$b1ruwsaZ^F-WxkE@hurwA7lMuW)t}RXl0^1rD3o)UWmzks;|-o4o?auyrM# zQsuMHVZ;!g_IHTv7gTJs&t>fM2>VMHdlh4^CT#w>4sDFF!-Oq$u{a0}3E>nVY!r8} zj@IBNvD<-`?d1$S)o^6dQ?-{DLMIGzgNgACjTfO*n!`fJ=V~1*syLE~9Kyq?_0vSM z`iXpfC@YQCplg9fyi}|v!zA{VD=!ejI&4G~k5ve@9vNp`5lz@Sf^Z?1C982(zF5D3 zj;@e$U4~zbMyVW`Y2|K*sg*!ntjjPM`H7Yl-u!yVTEwLMDht%n6}NNeAq|W{a1PHk z;J7+@Ey?Vz!3kSqKq&Vb*%r~~F+KTxBjZFK=IxjE<D&f;wC~M59o?aRQjX+L_Mr%8`GLY!m>+{8#LiS$nP zBShI4`MuYY9ynM|NtQ}d9`vtf;?>L+&Wc%zYJU^rNgwF!6!i65<1dpm98J-n4&CAg5#G z=0+kcJ|7|PBr#?A=d*wIVn+wuH1cfCskqz-?mmnf9($Z_uoXP8UibYKmy{Jhb`J)N6HzTj|9BVc& zWlxx%3G^T+^GiS^=dNM96SUS#k&cS2=CL1?np%hYdj#>&DPaBkb)>@+2ti%c$7;QZ z;vXmKLi1k*~>Qt$&R&xqy@J?mlkqKF5?cSD5WH+(xK*>Wqpke@V)=cL*}F ze(gBqQu?)Cju@

lJw06t-_7p#21!B^H(ls+<;@Nnh$=>lWb5eHF*)ySV(1B(ho&P)egE|@~>l;0_WOOF1YrZv83=tCo^kybyd2%Jx$AIR|E63*1SPN4kPYhU(oo=MSbbLrQlJ zx2Lhu1kyoYru|<`#kC1N64xf;CQC&jT(d8<-8MnsbMB9k`%Sa2LxeCFj?op0$7n?H zLlCF|m27t|7FEN9!g@!w0)pli_hMi{e>f8gLo6*XX2=+jg=a9xD##B#5ysdroP0e= z_Xa$K7xl(e)UBzgH>INfCKYvCD(d!B)SFXLZ%IY{Z7S-HRMcBjQFo@I?n*`7or-!} zD(df2QTL>x-kyqjM=I)_ghDT`&jmvVOLd0|$yuj<0m_ocRuYfnEKzi*g3p6FY*@+X z6=UIgAWt9JfLG*QNFv{YQIt$Ar7FnxZ8-RM1HXydoA=;F#zp_B)7wkN zV*LYxAQS=CeR$t`mIB@jfKLxX$G9c098zH7$7JuLD0HA}^8I+5AsoJEanJ{Vkmntv zy6f>H#?WS(*8L!ohk$90A0&>35Z=%aQE0VX?{FV@@t>p)o!CQy`!iwx6ct(yvJ_WJ z(_VD}u=i3$!-{Vb(0?LpnL3fx2{X@Er6Ms-WG(m8mS;G<3PpuDk}!XXo+@(s)U04RMKJEyA=JzcHChBN%ekfG+Tt(bifT9|zZ zk1MXkp~gm4;09P};cBHC*~5Gk)T_c<&M6JcPoSGr9U%Rm6*P5DT7lhNYYD{q^k-bk@uV{Li~Qcx}A#pqL6)V1Y>z>XY^S9lNhMLuMnO&K*-Pu`bj>FbY?J- z#AHi8_v79AB(S3TQW5zSUhH~svOdiyp8Mn5p}17GW5nacK|JJlc6l5ZzJZ2L5TCnI zI81@rT|wkC%;65GnNqU;iNH_gg&g?nOUc$~4}%-*nEHK=9|d)JO@8^7ytVKZc#}Yl zVVY*pBp<~iU20I0`jpf}Bez=WhMcUkVZ);@>TrIUJWw)<%p2a3%T->Ujue2 zlodljq4jTotgqvNouAeNlvn<)CyynP=biCUWkuFKPGFc1k@1k+g+RHbOCB&o5@=5E zK$vkhY!UC9vR?&}t5s;0qu&&!IVAy!w854h{K&{~c^+NN{p3*`Fa6 zaJ`{A5cqR1Si0F0TI&S|T@ZRB{gKZD&Ka8TlH%-}Kw*Ch57yW+h5aL8qtyz#Tw$*O z!hW^Ju0pvmiw_g}=MH*_LT}yz^nN^;Gfhb;OJTPxmaZ-IA3?Q7V%#&REK<3(5)avT zX#(dYDL+BE;xLYctve~QkAo(-DIGzf|Cryx)S^6-&#wuW!kgfnU-Q^%xq^zY#tJH+ zsij&a(FMBb)d@Px!heDeBb^g;szvt=)JF^PeEfsuh>K8$XX2Os2#;1v{2u@I0Z;2V z=#TK!23-K$wLW|l`2E1aspsK?`YzD!3b?Bre2~rDMJ4-FU9#F{8n*(Q#DmLQ+su0i z`%8^=Z03R}(BpV8@hWXIA0+h8HG0uz*p!};HuErS3F9NDojI!pB|C_Rr=7WtuwT^;BJXecy6+J-`%3r6j+TZLEB308zMY9IQ@^;Dmt0*B(G zC8GCo@i+JBbHn7FjhMA%$?KmeuZ^|7`jG&_zD;Aj8sHu)pq12ln}6mthxxaXI07u- z46oeJ1;a2ybfY7ub_(AB#k=wE=lEx~Yt&AC9sdf9_K4`IoeBZB#=uiM^?KkjZ*j`u zgQVO4&7|A(hIJ~M;REOBz8}Z1s@1xVa&gU#(r#+(^XssP`D*Ir^|+G8xMw2|Xv2|* z6T=8|E^asu`-htc!!jPCVT=|Mm7rDQVWQPvUZr=LF}E}MgR~e1sYT#o4oAL0gO;~a zK*)ZM7t3=L8o!!n{o2?&siOXe5%r!x>?48L-+Hk!nOES7(|T}bri`-pdttH>D%U&k zi%F<&%ojQ_f=mYt`s8pg`ArB*!@X~j&^+9e0o<+>S>JZhdZ70hFlE+v@U*_muaDEK zpvUK-E*@`6Mj6L)o5Z1;Wf?o8w>zED+uJCIF35v97yPC-l*e{%=+XvHTpsGVp{?Ff z9{I^o*5TKnLwr?m>P7p8>wmP@D{8#T6Qgv%g7co`7yxL4_7+ z(B_)+pQN?#;!$S#w8$l4FKG;j$wRU%F;%net6gZL(K1uJ{O(V=?egQkJU1dy`;~YE z<@t-i=aA=+y`%}Eb4{90&O`QPY2zqJG$SE`Vfj|??SNk-yqhDpvuG6{{WOzD*Iss-VY*j2Dx8~E9LHxVpJ?SJdcK^|2kzXGj_)`o%ea$k&Ixu~ojl9*A{l*@khK4O_ND%h+X+Uy+duJeEg(tzTCa6c^fm z1XH>Gv9zGbe$B-iVjI9{fX)kX%Avkn%WHoUuPUuC6V_LY?C-kaKM4x|e{OhDPip+I zT|rpV4LL;O(37T4eneG-?QB->(Um7u%nA2svMGK)&D( zck=awCY1}XGv&*WJ1Ada`<1<}+_&L9i`)-`#FU%myWc0@l0L<=gjb+vk}sRyjqqT- z&r$x@LA0#$ztfe!xBoQT%^c-_F68mZujeQz0@1Mo>(LJ+lGCxV!Kvxdgtf=Eu8EIK zbuBNc#NW2w!ArXL?vVf?RPeszlkv*V%Br2#NNlXi6FfRSGIbzsCll5LQMA_7)wDOY zv=~H#BS+%nF@vVQrp^dfNo=1^j1q$rO>OYho&vn26iEW8+?wVn+wH_? zdis4a`*0iyP{C0GJNlc=BGcOGi;u;Q4<-(C$sdZ1CF21sFPom4oSt$lNGc=`kWQ?ZFDmanhBXaDw&eS5om`_o9+ zXN^pc!}>U(tO-DqgU82*tuf|4WlslL2+2a6y2oHj#G5kPRM&1cB1EJAc1(=eah73> zD?O2CV13!-RAM}FJ=;{KqLPNXCpLA27!D^UhS(B@(kNnY{BR;U6}M4Zz1H}S3A|d9 z*@|gzeB3%3C*s3#n+rRu1?{urv8l^r_5`(K-N}C2w(P8t6#dTl(fAl^GawVS^Q|Cz z<707{bpT5$p}+Jha=I!q<^15TopZ~0`Unf0ZzPmswzt(frEQx1wp#x{d>gf1CJEOHbmC*v zqw$~$L-fH0geFHDwjP=9m^ftBj3m>jb8vcCk34&=(R5uFOWZv|a{=ls(Vb61gaDR- zMxT?oJeaM2$^_k3o2u_^wPwL=tCe#<6v(#P;2Glb67e8BirX$aHa=E~AtufFI;&_l zSBb{Y8pQymv+DB1#He*$GFsoz+)#B9aSLF!yrkHeS$0-QlFHsKTcGq}HC61aYOATE zX-6@&dYx4xlatX=IRT1}$!Ww@2L>DJ>Y9m0Pb2s5=I(s%sMy?l|*U^n3|!19PO;y6`R0ZYP6SKf!usv#KVb{y_v-<=0WXvd^8c8ihH7`i{Qai z#p|q+IWF!!60>6?7$c((h0RF*N|F7?rs5N1Oi3q%l~~L=;hZTI9)Ql{TwD8(VxB-c zlAKthP&;9~5qhVSQ`R`g$%P#4A2t2kM<-FPb2S;bWa)&><#+7<>QNz3LbUV=&*x<$|5*wAqm&+(+%iuX=W zU~&{!E{e{oMup#>L|)<}vLPJ3Bp$;w)G5nib9UjzVY{Q|*dCXYLw<3>(-)C4gT3*j zHEoYzLdwmrkUipDPyhknnC?6!7H z9EsbBDOG`rDXuYHbycX0B<@#Qr=H28Ad7V$$3#xuD3;!tU9piPn7%vc^h)X`DRMC~ z6hz`sJegCyI@s5{D|T%>7q&ggkz7d!j`doTx$uPh4&6lJP{J&k^eR9VMOlqm$H{Gw z3;#Vg8gU*s2Ny^_Mn|u$-XphxA=^5T4Uw*_IqxS7ECJNqmM>Xb)O}4-132L&l zG|sy-HO{IlEnaM#^^od7?}9eY%94w7YMd8a;RC%-yH?oOF!M;+b-<{Bv+h=%`71Zp zXr?i2IU1)4W@nYh_hEF!aw;N2w^r(zN&{Rb_-||Fp6OwHRl-bRpLK0~qI0;lHP$@R z+*04(*c7j8Yu{SwjLf=ibl+1Lkx$$4&Rv5$cJjze_F&uQAfe%?NFyeDO%_hpV{PP@ zSCg3Hxrple7Sc(2aC~gx1obM_=dLJryb_o-VA_S5iP2>b@<5b7N|0v(;z|;pAa;y& zjNt!c$2u@o?65}1IuiJIWb&Gh;n-A1EICg9j>%~IClb$}j_<$_af-((n3^^X^tLv( z4%A0`Te~qeZEVH&&AOJBXhU~nLtkriLwCc#08dSed15KWgFgg96nky7W=PwKbb?Gy z%0zWMp5Lo(nP!&3Jkn3AYY;Raj)PO9u|vmFVoQ~$j*@g^o-%LM3h>P9H1&brz$sC2 zn%+@2?Q-r7RZ8!NM;fWBY+?os=bjotWe()nlZqN9EP)hrmh-nDb3OvQo$NRQTRt-0 zk(hufPmFXNOVX!d=qSK?+Z)^4@g=@4+ScCF7i}7@Yl^nD_4hhdQpAJdA&Fesmx+$2!nx9HK|ZtaXK7E4QOUw2D)PfK*5 zt*$QGG*Z_VZR=_6j)ME)Uhea$hC0t7ORRYd-m;P)-aYGNVE&2b6^Uw{ER2lf7x17&rTURXdrV>#>OYv zv+Va*_BXdRwfDA0vD~FS+SJ|G5N)sTX^-}{wKmi>V)W3^+{EP+1a0jH(UEW*}Ee@qb2Q;q1|W~r`!)_hiv`n%vm#_YCx9Bp2rinD>0E6 zkB#lc;uEZ6>Z}^*-Z|K>_+Sx9Vnn&>5eXVlBoTAbM@e*_pJE+tLZ6I zrfSk`XkC)M4G z$0?egJfkZ*eY8NYcY5+vZ(4dIWO4dUDyxAbQA6g6JDjZW`pT5P=h-_g<+;$K+fGDNnvlzG3k7&|djK!Jjr`So#9M$U> z)Wfj_o8?QXQ&J6@85{Fr7TeXie3LDOI}3&(xj_0UF>MPG7nVMm^WxNXJ+kViU(R!C z(_=J_q_Jnz8XaST{A5g_o8)j;)d%`Q&OOTFx|@Y`9ynd^(9^+FpnU;z8%#^HVC(#A zSnHF`N1>Xm1#nfcV$+Xu7Z>sLrn()n=q$j2W5n_naeY=^m(dDZ^lJD9;ZN> zM%zQoiZ3GsLI>L5frUHa*Vu zxE-@Zoll%oUW>T^?Q@Ram@K(pY@eTm_Sx5D&)+v9N4whJAe(r`J-Pl6wkb8{&e;|-!<{7KP3C+q(G3TQne<%TBr={#)YD+k+gqYoF0j+&DHPP5&Pxwa`lSYQTh8H` z*rhWv*F@5;e~{%Z6@)I%a5OsJ6d9=O+4aMucsEYBPle@><2nDrm@JMJUrgVEgY-_6 zS3ar!6Ysi$-aUKN{tYT>EYYU(5Vp&GP(3XJjo9tf6K!g5u8%eiv|}F>aM70Lc5I4j zY;WprYvpwXzI{+$p3jU$2T%E~rUhM~;4Vd=r3$=%r}oM*)p`f7URYdiKuZN=XP$9o zxU10#3oA42<4Ucr&b=FZCajSo*N%+YHP-MomE*|~%Z|ruut89l25*h`tz#HEFQTd< z3AA~k90aL*g3`MT7MC~}=I|Hxm9Y4fmN@(sHI-Q!#hho^{&iM*$=JerPt#ZCQ&_6t zHfv9_hA+pNcY38Pws3#BE!=|5^|`}FZ|$yknA5HmI{rjj;9T~)INNeK>XWs=Vj*^( zWN}9XY&uDq@TH$B)(p8bi@7e;s2MUm5i-rW_#jja)9L9B7U#H^M72nZOEngD+elW^ zGmK|W>pg0QY970A zIOudFiSu2I?JY8C_o+SYiwB+3nYzXiHgw*UVIx{&-Y?f_h&(giw+J#8_gtA&dJ3oSKGe&pqh#;_B4BVugnDr7k1#%#CPIcY zU+0`@h^4+wktpWhspQ$W)hJCq{29+JmYMth3x_bRqBF_ljtsdsyRxCCftOhO7^cZ6 zWm=0eV2$CZLwxY2k~?zk*!a-sgn#2yKyLiH@;UspS{Dz;)tacR#Gpi<<=Z<*v&Vfn zdGIMaAeZFgBY}eJvLUSDun4B*>6CezFi!iQptCI8yvw&#qgj|kdaR$95QOx+jkJ?%D4i(V}YP{-8eaq*~a58G-zBuaG}m*VWve4SWnDU`jM7u|HJTW+@1 z1_i35Rgm|-n=ZQS#);+&^G1{vMA}ss-Fo9h^Mp8&)crSIJYFYSjZhSFd9tht^2q9K zwFXX6c^o-P(aMX1j>NndM{6*}lhfsO;~<*f*Q29)+&LOq8;GS@%>GIAuDD8OEOwZd z+j2X}OZ!p+xElFd18)Q2H+@eX+k697%&0n|>H=4%8)R*u>g7=?bsk;LKB^(DS4Jzs zl$otAr_=xy!?>=e%ekuuy|#Ocj~0T@VF|jaN2igVK&9o$z3EEQNq7&L4WfX#n>YA$ z8Q1r);d%m9vMCq%ILW0A;c`&-_;k@sk(j$z`)CH9NpBZj;3LVo2;{^w*nC2loT}|6+JuuNM ze2r3`psaOD(Jj_0+>6!4H~yTq`s8#SPkDusHT$ovKJCD*JD%aIb8JSX8jg2X`R0+j zCqfP7p^-0mTPiR`e`!z*X1+LdOW>WS$|~XSyVf%&EJ1y69pa%;n@wJ-U1`_TgI~G@QcM>oai6 zTl2}0E6>ecX^qLf^SNakrdNIOBrA+6!kSd`Key*HdQxZkWm>PnqF+H?w5wI_bsczC zhx`@!6{LHPC#;K3grn}wz}iX{oe1z9sXKzTPJ;aeYN{3-s7BTSH~ea6Kv0m173?Qa z=>-R>m>#FW>2M;*>Z2S2=_}Bp$H2Wwd(mT%dNa0L2?DOocB@^go6V_osXihJqFYsdcU~ohBeSPa9TYEe5|Or zd)3o_AI3miQ(ON)dw;aKuO3(0w6--z+k1O^qkYW{?Y(`?tqpAhr)eJs982n^75~x@ zJz4gDx=*ueT9Z@XLL`^Ohwb=v^gRwfo8hs*YvpyEl-YEeGy=Z56Q%kpAF#Y7@LN1Z zq0jN@>CF%AL``4e1F6-gcB0`iLI9Ebshz0YQ&Rlu_EZld4dCVVq=D#y5o_{zC7gQ7 zFGjal4AIpfw2&z|RLwWoP`Jzy1y@yeRZdKgZ94bZXa^p#jtk@v#+1i1X(w3*t?@W4 zB|xNU|(WHEEr*zYm8bvU^xD%=K zEj|tZv>)5ErIYp}e1Kv|F8cFLn2FN(@SaA(l#lBf6L7x;5?O}D*`9CiL`$FD(}-YP zM9f}jBF|I?`m=m?y2TA0(lU&vIWOmO2`Ci*0zitMQ&m%w?Esd<;xE0j@%Q*Nc|VnE zmZ>g0q69j+vPGItMSEs%=)fBP-TRDB zhr9dt4GmxkeEd4gzINzneNBB$Q)5HJkoxLP2Uw)`+<|S6sJI=Ez#Ma`KfwnGwE)?j`v#7*J3ba7v(M~}8%_~p@Eo*#(<&t*#OiJe=?tHdkP~_aUg6JuCY(H zfA#qP{rC?@98Zk8(3Y&r|CdtsPx_9b5xN)mKq5IE8ylRO9!*%vr=k6a2X+kZ@7{Uo z;3eIA_qcYZh-iBQSvT+XF)S9r#y%dRpo42q@zj)_=H~8}{^rJLb89zl%5A7?j`lRR zw?uo}+i}@(WA{K)OE;ZpOFA|@8FM~0CC%0t%7u|dU6Q&b(BqwJ_&k&hgwIf~+i7*E z1t~Vg8UdkK8D{E3b9M~(2o_|Otm}bHgSmWm8;Rxuz zDf|9xOLs^b;<;oyD4&h3$mcWPlar>Pv*q~d=FwR^l7k1mnl#P=?LBe!rTCZgXae2T(U`wW&Ttn`*r3MQ z^*3~>)jRr}2lFTykCQ;@@2_Zs%fcU=VazJC9fOh1IiXGaG#z4LOfoZ^NZ~y>;z>J5 zB5wB<>FIAKDm4j7O(M|&23D-Ir42-yoSWT24){svmi??BktP zdi^_6-T_Os$K#`k*i<~2!jp_tY8~gub33wB>kWi8J$l!mi?%o>i3DWh_Mbk0AyAMSkI6aAE(%j>C;na|>U z(vGzCt`Xu>fSc=D8y5By;D*M5fx7-CZ0YN6ZbnDb+Zyd|Z)%IywYRmlcDJ;aoDT8onzV5s+0?dL6Q^W&Iyr4z1x}6*TN7i)GwC$gn;~u9QK{bt###G(YOP#E>8;-R!8RwfYF1rQ$v;`hR95W|<8QTWapD#)dtV~rzHyCo8X%{4L z$GHlp43(B2cTdE|jwchzz0)Dz~mY9j!_=S#2$+-ek44Jk?EB8%_%M8C*cKu-Ie;4?#|2ljSilf0G5f zd0IDFi&ka!mE47%YDbvM_apTs#XUdQ@xZtqVYQ%!ux z@yQh`#ry3}*@pDAN$=}QoAR8__oX|IYNlfL;rLY2$;`%Rv~r(SISy~^q2rau;c%)P zrb~7zF+isKShrTjMn@%nDwe#qGBJ@%jK(Xi3H&=$IdvpnsW?^+;YL$~#0;k*qfkWH2Rwm=|%3aO{ zK+w{-HKC=hAzs_$n36XG<07H>A#6G1)m8Fy!M0js%;}}=J_O%YI?`yAe9!u#pf2ey z5jPbJ;Yg#ulE@uOm4nvU^b}=)EPHDu?&27aO;svqbS3T+s#{)yLM7jGr0T>#cYhsj zRj!LRVzM8tukUM&_6#)jMCzW2y+xrK4dS|LO(;7q1O*d6rHDbtv$Iuf+bPWaP zcFU0A{~m-$5ZpO9CO#RT7==q7191{y5{EM@!QrdxpBPnuinhGOMVUG5ZyD$tXlv<- z4m9@FQx4(3Yi?~p4(l4ao9kQpd;8l|4%H?a$S&W8y}1X^GZp&(uJDTT@S6 z+d#Cpt-d$f)I8722%BrQ1Dq(f01{?r3XWV{czmTRZOD=EI)!r;5{4RBb)I?Y;dyZTRxh)J;VN zr)yt*J&LNkt{2kvwl_6sW1MuZ)h0`Hpdt6Q=IDr%zt;Zdwx)JCxayi(usyE3uOSM4 z?NDE9LtSHgV^c$O6Ms|j+SG!WqMV<>WYt7XS-GyK9`_^LxgFPGOj<>n6T0!tZCSq@ zqYWp<61ZYfes9tP1fwmR8y{>~+%e&dGcvMq7-QwS{CoZC`Hsihc|3NmZw!a4B%94K z%tDXS)GF%v4AxH9AWMrhpRrc3Obanaa-^F3P$^ibg&pEJ;>~@eV~Qv1P|BD=R|3zV zLHna*RS6iX&?Rb>xTn+U&J|3pmTZ1@C62{0lhbQX96}%7jleB~L#EpaJrFVy)J=(z zq(=FegIk&qN>&Hyggr0_puEgYRM2qCtGQDccj*j!Mm$orM#kqd1ammLt@5ey^J#kl zCG~S&D2chK7f?>g@6@H!rl(5QBcU&hEH}qe_rbpZh{e zo@xU+)%nZow}T*#xsBsJHPT}To)9jv`EYbKd20OpC1jTW!g5|HiBrq{)a3M+`Fy$g zY{gUNzOXrzx-Vvyx}TdRX`Y$NUelO$>D0Kp<$vnDQ*B_OcxIL|w~3|4f;@KM31KUk z4@XzVQ{$JZ{1=w2`S`5QQ|7*~Ih49DW|q1?H%T*Irwm#5qfHG%F?q&=flsHP}=?cxcN(Gp``TlT^MOo%llOFF1ekm zWIl@vtnYIz8$VB1MjbL=j{b5n%X^`DFPzk=<$kKN`pe$WFRPkCbGChzD1I_hq z?fos$`u3j2Xj4n`K(u?H0b4HW8yf3-8r!;Cn)*-IH#+67!3Xg{S)U74GUdoRHH zxNX$lH|l4Uk-ILmKs)q(?hNvX1vu@CPvm3g+ z66qGjVU&|4rPYty;LnARD~`XT%#BMX4b4>|&C8WZt4MQlT0m!Ih|dVI+DP#Y+p#l^i?t`-}?f~~>$RA*H~`n{>WJJnJ; z+uWck@6(OZGN;Zey1xr7v8E|wZ#RdtinCqD(mNla0!am9FgOCLfnqUwjIyTw0oX5>tDy zODHBk)xs|5(lw-Mh{O#Fttg~rYRI-+uhv=Bq;~8UZzKIlMd^LNz0=7lYn&SZRxX`s z2R#N*?o3Qv8~2m|Z;Ya)ahH_%GX;aHM4d0fxC9}?aZP%@4ar>h}Bxh{-ao4nVptYn+vJlFzcyF=?nYv`0!xdKAISz>-~-$ zSLI~M;!ht92VYPz6*xZHqM8VrwzE4N6nz`T-##4x@Pf23%j%G z#9!Bm7N>GJ#rw0}|H48r>6#vq2#P>s;@N(V}?hv2T?V+Kuf( z0cl_g7Q>+vy<-Us@CHZh#N-r-^%rrYGxgHe1obsBn|08Wn7}|YKns$x{}>f`f)#Mt zL|U@JDLXMDi4GkKpz<8)AMJQ7@(87XtVJK31@@)SFZ40_;4WSK5Cakt45C7nu=Mp4hGYgK93 ztPNNH`j6Nr`~uux{B*X_Oa(uGBhAD$$VxNOn`WA!p8WM%>1n<(M{R#jtu0hLbT_Ss z0BMN>tClnH4`%LVD$j-urVJJ%U5o{gW$t(92Hv!CDw4=cR}blXk^`EvpaRM*)-(A2 z6Uy{9>6)NPBZ20h3gX?~$w}4yI$zpr# zf)>hXZrAk=CdP5T-hm#z)aI#D8Ej@^WNdmgZd5jR=FXX^HEI>8(w!(toAQP+Z-2_p zlQic4U3~Yeb9@6IS0*iT8>oz1VEKf{rn;88g+1XhC%1qj-u7wSL8HX;?D=|{9Eyn( zBTesv7L`tt48rT)-0y~P<7K&@Ml+xRM3>{0P+|c?^@h;i7Yv&%UYT6mYu`5$u+wH`t6U`Uq zO;CP+92_|kACGnI=x?rbqIp7`NMo_%gNefv`T~%?xJD=nITYtQqrQL!U2@~`Xmm+; zhP;Zx@pI@5dR-b_mrZCo?d9+iN~cEGWrq%FI)zd4d7K)s59QHFb26#NtDzIB4aAbY z?4QKvcT*);)*rtJ9oW?O~?$oG@X79Q%_(V*l5@U+`X0UZCe!+o%@ur*08F2n-vuc|#Qs+U0FF5VJDRaL|H053tB&i1)&PAeK zX>Jj9#~d!HDo*#>0Nub|qN8_7qR(5l`<7ZBc=}R$>K85vwk%<>a6m+2+|M)y9Ck^`;Hs*%cwFRFy+slU$v^i&9F8) zK0^?bO;^#Uc9)KS5<73c^S(@H*Kz&jcS!quQuQ;3lM#*C?$h=zos;w4U(!1Na|p2j z&zSM?4wEBOQtv9Tj?OV#>l{II$0q!rssdYT)1qiuC{*mly~)E8}Uz)6Aq z?fq@N&5ez{J^j2h1FOo_%zmCH^LRGC%wbyJ&YGPU*v? zB=vpmZGFwnJvhM7d;H-kZuyY2e`==PW7%l&tAVe_S3EV~LP*vn_eynGIT`n#>8N)$ z&4G=_I}x~xB&SkMyGz2^Y%v!$?uG<8ftn)|y{{o?E8RRmje<_ri9X{$q5rD(_k_-N)zw`{GHs z&*HYaJqP-m>)kpBcXuNNy5~+QKaKB7588O#9uUbBuGD&PA~v8uDyqYWyN)*0z$q9M z;zrV^WOXUYnBGCUbiKBfOltgg+nS!-(bv`7);bbvY^;N^G}q%1i$!Ct4LJ3;ZDe?~ zxoxz)egxWt0D-X;b7OEpi`=@lQ#Xjqx%kSWAV>4QBh%x<6S2e?lR8k%|~^vSvBh`c3Fx6;hT`Qy&@(E!yrjpJ5*HhU*pNBVDTWiOVW zPTTR$iTL!C9UI$Pxo3J94G%tK?X#|pPjt47Hjgy6wY9|$wbaEMT1U6)WAQD!+s5`U z+I&axQGCV(dykzsifwCM1Gt_Kt)K>_Ekmh;lkt(np~Q%8t@rVz-hQky{hS;>X>wdc zE$V5^_O8JlJD<{gk0(bgn>OaTUI?x2K;_THJvCpRslJG;_d~cNigZ^$z-m%FJcva* zA2G$&Zjc}H8%~%TUwji zoDr&PG;jeWuyIP)SPkkb7$hM_PR-mL{7$`tfj4p}ub|2i?Pc9H$nz&P6+*{O-Tmev zr_v8$q*zIXR4H$!7^2~y8(c%JAO*`%xGc>(HJoxf?df{7sIT;JlHa&^5y=$WRLVsp zJ%g9_r$dNyXN5SpO^C1d;hnyqPaIAX#nu~zxS=1o z{e$A2|0Kjp;LfFk2k`p<;4v^gw+E+t6EXfmLgZb(;X`@F`2hZq*C@(>!0UVQuNMDC z@$ZvB&>bnD6~Dzhh2M=0Jj3D}MHITdgz(QTxfOBWvXo-AFC+X{mr<-=@iS3MG$%`m=0Uudh#!>`<+=)@ zJbMkj|90&U)|QCkbrd>?XPJ0l9i{boJlBfx^_Q$K5x1O8_?MnTd@iUY$}WDske>w` ziBEOa8C50X%~ce-`doT`{M@_FJx6?K)4iL*Vqc^u5*A5*-p0@O^YamY{)nG>n~CPa z&1*M@#g%xj5HH_cTd+dhfoE8}XY=FG;TQS++ne77{Ga)KZS~_weS39hby$q>`?2bG z6;z2ks&B>fK0G&x|E&H(b(#1n-m68&mh-lhh^x0yj*?p_r|;Qv`{C)uME5!9%KLh;R@LnSB+e+H_0^|Qs zLy}k4l59~tSBSn^!W>}CRs4K&?JH`-;(olBh}t@e`|P^M^J~Ptb)D5U;vf0>-MTN= zg~hUZqG_rpnt}%6S<27*8z|jyBjMW{NuIkKDHk8*=O6H_604g?{$@OD#NnoWO(kMg zGnLU8KVN}oSbU_JH2GP67PS0e?Fw;z3&q{jLUEsqXNj;{$dX?UJW8bHU3h*3&lTb~ zz^o8Ot+k-s(t0c2ds|6|R|8Wb4!08jldWv${Jx~^`>kPdIi4%Tu{NT)rH$nIAU_|$ zvs!$=?Yu2j;x}!S?%H7J4YO1=(h}2iRUvE&Lhdr6UP~UTgB}RbpTo}wu-lM>N^0H0=kRC_NcJ8GjvEn_c3%F&{?2-fT5cKEfG=iQHI{i zP@VWOL-#Y(EPln%XBcV|XXKFv|C6B(v4)}lWvEkBGIUmmcwQvVWhlZ>x3~Ze`byCY zXpQI=)f{$Eg+&>~f_fSHFrc%1 zGqgh-WaxJc?G`bH%JNCh-C`s!1j#NyU$s%}5r;VJA`aUl5)56=&^|HEd6;16pqS;b z7cn#>UdGVv3|%c=#n1;C8WwM6=+g|1iu(cms$dng`lo_&JoA^(vzVV}ELn^9(r^^d zjp1@p$~2`+Q>tj*Ueton_Z3};=O>FU!t={Ty?B1FXuH@bep*zH=kNIWXFT)7p^{hN zIZ<*8xE(Da{x_8n{uX{-z0}3Lf9buzS1%(==~?!EJa^++FFwDl98Z!5sVw^xo_}8U zS%o*>H4TMI$`;YJvRt%?XYunOKM&!VC$1~~5}yBD`b|8)#!ngR|H{7u&QFw6ibWNq zfpaUqhi4t0DCae6@mzyvo~T>%L%e@uEpf|R_e(tAzm#f|l=FG(ehzMUsHnUTnty&J>Hm5>^TewvpMzAWq@I29KN(MvOXx0!{$>k9O0qj8BtFDpMO!81KQnZ(g1*ntNd=uz zM3Q|%LEQ`$MPbG6|b=PY(Sf8B$wq3 z?NHEqhQ<_B&Cr__w2h&UD`*!(k1Oc846URAK5Xgv3^gifhM{2vy^NvPD(FoNeNaL7 zF!T)ty`Q1tI?3}>3`G_6C5E1>pvM?`je>s8(2o`LM~0TyOD=^al=pfCl`?ddf;KSp zA_YYmdY^(WWa!@+x>4*cc^0^AZXlinJsY+7fCC-Gyye9XbTwu$4?9poV7%)}0DR#5Iy(A3h~0UeQ$xN+$nfKEz? zrLGV!Q(+Gxy$W%wg8q@Adld9phVEC;R~Q;&D=(DsW|ln&sLFxP#wg`#2^GBplxxJSg5ChiHR9C_ zy;$6V^wx@dWf-ToRy-sjL3M1c_?Cv26I6sTG1<$?<#zzu%g{^2dW5YL#}pK0=(`H) zV(6otQqDaLt>()`Un0gCdV_+lXXw8q#Imdtk23UHF28l+XNr;}TPF%Gk~|AJUL8X> ziZ?*Ab>b=&b~nP-i<1ia07L(-pieXOFWtJz4($0V@<3VzfjP>alExX zGWG8=)TyAKF?2*hVg;psgM!Xt=-Ud~!q6`j)Xh*uujF|pLq`-e!O-6-=q84~tDrj= zIScz0 zpQ7M625+B?I*KDRpgi9M9Z*KU(T<{`sQ=$@?Y-akJ(sk>ah{p~JSk+Iz1CiP?Y-At zd+qD{z6QHYurC^nBkX+jPn$L8l@fQ}7LDx^>?VT^3N~)A+cYN^7x1R<6RgKzpA>A; zU|$hzUz_Iqe}X-1u<-fJec$VJT%};=Z57P4*e|XnW?Sq_?f$sA!fE5auH)3rBIRj= zy-l!n+a#TOpJ3w#`>0?)-|m&O2q9mSc_oaHrNiq=66WR zP!@9b8EjIp(oP+Bqi|lSG12E`YNKHHD4qKbgX!E4nRGh$_Zv*-K6kg4sdKN{UbeF4j2BTeHuD)ropGw@u*K5vS36?V0r4{7-puyG(_6>t|3HEz~ z-62@b4O+^F1-r>$UlHtXgZ)gfM-6t-1o$ica_ZsYyxy<1U2HPgszZ&dM1)KLLI^8D)+hnkR6>QvKzZdLR20Q;k%3QZ! zr+cknaf5XVcDupeBG^X__Bp}6X)yY;%T;lgmhx+fYc|;2*D!9#U@^hIXt20obK^SQ zU4r!(?8}0E!eGA>>?woAE~3m|80-eYE;^v4yhE@x2K&5V?>E@r3%0OZIK^5oS4%af zHeO7beFnQhu)j9g&4QKnm~sl%Zm@?0d%MBDBG}Ij_Ai3nk?`lYS1|3*E?4i;abokA ztA_*|Q|snEhO#_su-5^*LajSUDP!vOz?P_Y8LW5Sk5sk#gxT4EAxs{@P$%oh?-*y;{nrC2p?4zAV@RgMCY|Wd{46V66uGiC|p@ z`?X;IY_K_(Fo#f5=de()9R_O2I0)5lJUGEK_}g=^U1+Q5~m#cYE1JDRK87*Ku*dzOFG-ho?j z?1I;_4)+?YMlkh8U9t|r5*jll>lf@Eb?rpNwT^{|gKrarAP@pUovWs7099aB#kEVzK!PYrgyU`zf~=e|g= zj~T2gUkG-q#!T-0g4x{fHJs-~ncro%i4?O-zC&ZGH@e+fp}I9DGFPfT!La6v zo>VKtRW7|Te z!5)z~^>!WiWu4Ao-w|xnJ0(uaxk`0wOkG+b;}OeG+2D$Cmm?Q#U`B9>RSdo z1kN?;S;1~s!wXLW3%y(NE538#J*rW~fJM~{C7)mTRi{yHG1xxAQYHl(Q~!6-Nu>MY-J0_yaIRC|GFa#`V$T`u zHG=)rV3!H@dxNbOtn9s7N~>T|gB=pA^L;w*4T9ZqpT^!H*wFnN8yD=AKhxN0!9M+d z!KBpd)W-zVePx}R5Nu36dD%&n^T(P~eGlo@tBXINrTk2=YYY}%%(%Za*hPYUTd*;; zc=1WZz3Ze-cNO9`s1F)!t6+a=upYraYp}FnUo+V4f_>Lu_X_qe276ermkstg!HPeq z^ZT}77aQysf}J<6vYhvT#?}dTiNSUVw!~lu1lwb<+;`VX*rJQ-4mG zdX=?7bqJ={up8Bo#?;rqxl#SlV9yBl3xoYuu+W3LWS3t-&Mt#(6zs1Jwo|Z+|3Y(i zYfgiW2==VO-YM88KBPH6ELhKnHTI}r>;9+4zN6C_>^FkF{~;YWe+kR7@04I-JsS~p z)R(Jy-{b3mj#{(SgQu{A>?pzj&Ze@%LG{I)*dR{5a(TY*qnz>af6GVLJU^^s+CN=R z__Dx@>lyxyz~6>ghG3YK>4aykBB!p)(FTV7@bg0Xv(=ZODk2ST80(;5$8AIlWIiZn7}&)-X-up zfe#2g1^Adc4Opoj75KQoor;tv5dM*~Q$1FF#(7fc&p1D>zDMD_vHDk__hKB|srE;I z=a3Q%JO`eVz)rPb=}GmBbNSN85L>r&!a3t?U3zoiW#^`)Zwi!%s7qtt4c?`e#O_x|R730@$Zv^FLPAIE1%W>X?2i2# z;IL5MBH?=xZdTNGz4LJFSHXJcGmud4P(r=)cd_3Fs~jy^)BiCR42`Mhg@^PJMf#(n zjWf=9b=9FW&c$_~2|g|wcp|W-?xcDmu%WIJ=N;5oxr#5GaCVACl`D?C<%(nalOmy9 zakPI%(mod$K&s~g!*!1+O4}8BA}|VRF9!a+?t0|%P+dJ@zfkwl&~t%r)twGK6L_xf z@z8ye%YEt$(pIUL>%Ij_aQQ!ms#MwXXA!<|`S$>;mY-Djsix&W1pVc@XG1RsNPjs% z&X)s>eL%f_c_8crlgrNwKcL>c{Gu>UiI>k0KNGlb`TfY3wJr(%CcFsru~{{MFDzdb zo)`Qv_~!+Gzq}C?o)Vmr@|?nX_=a#*u)MwnaG>s*@M*Q6{-ips>gp>2x7N3ZtAp3q zcZ91{y#8+k)xrJI>%&i|-ugcY)2_M^K30D}q`kHN7}CBE;nV74^|v7W*?QV}y#55j zUqkq``kqk!RVcqeF7+tqN!1vfzv6yCwncT2ef9~l$tTq1D^3dKZb(?U0wq-ciZW1R z-wK^po000YwDK8e&x(444+&)m@Qm|TQ1%AyS#f{(l={$$4+EY*no=HSGNYDjnr z;U`4GY4!YyPok##qmQ9RXCz;GiRR$1!O5CF5pE04UHP|xwqVuDe?Z;qSKg0%Db)7P zAlvjs)w=Sz@QZ5K%I}5Rf;X&uHz>)K_W<oTunv&Nz3hyg4vWX-KP^hyC22iEdw( z+Pxf}rzVBM*uBsX{ExtS*duO1Y)d(Btn4WN4EpsmD=$L$pH|{l0Q}qhq9iyUQ;$M> zkEtWU=W8kfS+*m=y83j{k>F*ko(i-D_D4sGMuMAH-J`~Wsa0<(8VimgT&3<UPG(1@Jq@;RM z)ivC&o>XfZJ|dLA0^HJYGra3gp})T2k)mgWvpLw+@YhB42tQu*9N<@q#scJdPQ4K_ zpHt%v-!8fj?eZPOeyrgh^+51%8eS|qB|3RdeYfEf@cf|RF+lo?=ft-^r+zN z(irMp^S+{Hk=7Raz?v^c+Cm>$^S6q5dB+Qi2E>X3&Q_3 z>mMTZqAT2UffuS5Ey32HnR@l~nn}b4m;XrMnMg7eY5Zm6@nCtQDsBusv$CkTDsXu9 ztl}fc{e|F>5PQmqTGn`8_(+IwM6GRnL>&q31dNAnY`g^FWaB*uk4X50gx@LQdnNoK z34ct&pOWzBB>Ytg|0BYCLqBM|U)>q{edEI7dCmn_#Q^7D)lhs_XlzwW@qMA#RlAEH zKzVKer2U@??Y-)7F-P7L;S#6+sw2gxLT?7;bV&Rm=r4zl1lfYsfxo!w5>+Lm&&%o~ zSG}e9bm0G7^^W34L(g6X4-g2ieGkHO*J8v8v0qT;{h-h{J{npA`su*c0y_mJ);@x{ z0c%&eJw4ax1K$>H@XoQhuHfZhknd)*zX*Ney_@T z``V`hPli~|CqtZd#3lR;>iZ+7+Ie>E`%0>vp9pl;F?^B08i7p$uNT-W@R-223Vgr7 zj|=>~z;6qDUf{0j@btOS zdGGp108g#o5N>q1chCqcC0rSOw4~8_RARY{(CBcVVN6Y~|6Iv4fgi5_5@KgBxCI6_TS@PW(YT0n6-MzDtHYDC38|~Ec~{n z;H#Qte9%S{k)i3q&6eGQY}IF0<{X^ zYt^*~uT?7nXQ|k%7S(}NUFv4QZV8V{_*MyzOL$y;RGlA~knk6TJ}KevtCnDK==(xZ z4kbhdE^;WdNy6O{zE$A3!xBCy;R%VI6!?9ir~oAd156v0aFf6mp>zuz70RuFmS9cM ztwOmquq?8uXk6$I3S~mVUy$&mgugFg6%_eFkuTvz5^j=ki-fx*+%4fz3Evw0S;-5| zxP-qT^hpVSU&1ORGD9L$!iyx_B;ghbcS*Qg!lM$tRl*Mn{DMFgre=cSYiIvONi%$ae)&8ACKGs{iqU_KU(rNnn@2QGw$ECj>^z$lp{({?Rh> zj|-d-7@Z@ra~Rt-hq0pq#|2IZoD`_eXKYkplfW*4qXNeTP6(V7sLF+3V3WWufujP) z1x^T@6sRhMUtp8KE`g&0$2I)|Ddz=JPJ!bBCk0N-{ZSD#GxukJ>Ozqwu<62Js4>*d(w^;HbcHffE8J1*%JhUtp8KE`g&0 z#|2IZoD`_$3%|f7fn5Se1&#}x5I89?T1oyUfn5Se1&#}x5I8BY>9se2bMm$1R|_N; zflUIt1da+E7dRnsQlN?ozrZGeT>?i1jtiU+I4Mw73BSN5fn5Se1x{Aoz%ne9zO#^= zO#-_FjtU$XI3X~)i2O~9#OfB2f7HN5CG`{6*9KC`Pnyw&!mx1&u6B3>jsFsK{fn7^z&!bCd z&*MUw5I8Atw3;%?i1jtiU+I4MxA5q^QU1^!3iuL7S5d?WBLf!_qq556{7 z6Ko0|45ou`4SqcMc(69KDs*Eg5&CrKE1|y&{Ur3O(CS;9!sFqOhbO|{ z2!A*HgRoQ7U-Y)3cNe|C=o>|oML#L}WzpQoqR6$8*GJwRc_{KXk?%%ch`gqFe(}=c zb;WJPiQ?nM4;Fu{`0|pPl2s+Qm%Ov&WXUH=zFP8~5~p-&>BiEw(myG^sdS|Dy`}%N z^mOT$N`G4V+tQL*7tC5XYZ-QQ6`l$>g*(L#o~R1qMoJOxp+qnj#P+s&+bnMLzh@S= z;y-%c=Kvo&kCZP9ygu53T?BXuaVkh%X==b%u0Q5 zE#>ha+vSNSrJBlg_+^AKDHrU*Dp`??d>9ojUwQh7&scbA;F6wuA!_ z%dS>x@OB;UNBCl#(UJZD!lS2j_^Sy2^iw+g3hAHK;TZCH`0sR>H(;Bd*5P*|{Pd4? z__GL){+kZJfbhkTPWcs^l=|iz9o~TOngu$11mTIxba))$C9pvGw+=5eAI4MfO1}??XO=gDp#e$65wtFBs6x&TUO=!VeE)J#a=X28}DofiDPiGRE zZBwd0o*dBM*cGOXl8+K^O5%$iLwJq3A@X(H*LeihlEMeH6KUbSCO**9mq@GjL_adb zH^KP=nM}t}DvdX&>ulOn-G^k<5ee2qRa<+-PfXYB=}7ee7qTv8O859C(^82 za>!KHeCpY>A5_14aC7oF-+Q7q4fpqZjiEmY4H3F=z)fgiUnkcVEgjkI<+j6EBhDE9gZ9;8CXs74CLZr!Noc2G7+Ofs zg_FGO;1R0pxP)n0&g??&jgX zK4z8A(9)NP4@fCuG&a{&o1U%ky-~kASN(9Pn=le+l~~7axpj5TdnT?+4)vynhc*qH z4}=UHVx>@7`yL8l%sx$D#_H)<+KG|t5u5w^nvdcoZ}KT?T_i-d4Uidc&rfKTYr(q` z@IwO`X#}`RSP>=5*rQ)mY)kEu`5GOJD?ND;t;glFI5xtRM?_iY;T4tjZ64@xrCN?= z7GVJ2Z9R%Q;>+sYi5@sOaltt#B|tcAt~ZeZ^Y%34wI>IL;bZ#o*$0@`j=tec9&t+o z@5qt&OW_k7(wLy=SGwSRdh7)Iw+|#*`x5;St@7eJkEKjpW`76X39||2C7$Q(tecVt z4<=Yx%TM*>3-3kqxZ;r}FUjtKKDbN`6Fu6Eix-rdu!W^Zcrydl<4zK2pRPydYpvA~ z_$9UWfeJkZZeF1!6Y}|0m2g9w+qSlDYi@5Jj=xE;3%HeAFAjf2SNjh#! zEc_@N!i(Gt!}KV+BEAH+W;Th&O(Is$W?;jRWrIF0Pc9=}p&sJn#cShCp&6|)BUK}Y z7mipyg2K`wyg50L%=ChhVO^Uzk6eka&bto~k-%MpC?ACJofE`3^v>R1$nyWH;x~tkS4_D&N zhX+-A{4g3#=D~_HT6hc^nH_7*K;ojpK77EWz=Uu3fD!Am@XdxD@q-DMkl@fLuf`LL z!E5XjtgM3GsB{Sr^38dfUJ0|tVg_CsA@#)vGl?EyF*?@9!bmX)m2pERsb?t9uZ#;H%KkHfYYQQn&5S9wYW9cHoi1WSkRVHkPtm`wZdybShkCLUqv&C{~vW3^}FAj#qE?8Pj7*JR< zc$$fc)vt+zdppVx9bs|C8JrIJg=yvON({i|O%-c3;1{M-m^YDY`FeUcl@J}9mB4gU zKP|s#Y!c%c@+`_v*ZFGGGjv0eDUUaS&XOXCO`2_wS>3>P6^z&LSP8qRRxQJ6PA>2U zSabm|%t3@7T$3SEI?OIiGBG#8{INHI$*DF`mbPC{uVI32*ao(zcjHa?Y2}NvB&crp zAlKv_iNQFGFO|-~UrO1GY+pp1+goX%bdofd)Ibv7LP)+LfrNcB@e^|=pvCS^C+U>D z^}gyK!HA26zf{Tu^>}9xyl#3Zo$_-T0d1LGiD5WU>*ch1vItJ;wBSav0j409o(XB1jQTUJ(62+3wLH+X-mbzq>PQc@-PI**OW7cb#$^Gw z82$Z38d5NaXDq9nI>CUQ)JZ{&A<;N7zNA@~&$`bljn4M%gn#fKu zWhU8b$WByH2L7D`7DoFR_z+)0Ql^JZ$zYLRX|Fk2L3pIN41nA4jr92aG-l@({Hm`>QVQV=k4 zosW-^whduDchKET$rmQOFxh0Uu#hA1HXm-An2hu$kt^78xM}lQ+ncXf?QPr85$x`J z#;zW?o1-`6G2uvHV$ywhPrPr~PDXNZjG=s4xtXePhY+1=2nQjcaAjyF7#i7rG?8wP zAJ>RXSFjbNvF0H+0zptAxC5T4FG2Cd5U+ERVLJsQfJT`!#whG&W)dBGdV!6?B zd=NWUNQfHScpoX1#>{DJJY(O>3@#z*0(jFoA=>r1A#*CFnK?VtGjU5|3s5DPlX1Ti zWDa21vh?Rf685sZq$Cu`gk*miv63IcE8N8r-IpZCa3HgC1v1j-C5V^pBmP>NaS8TR zNnM>dh)HT|yt|hZQ6*||F|&ZaCXW3&OkTU0qfF_{rdE#}dMUkkV`g@kT4F`jfy0$P zSWdD>Bx-)mr!fBc@kGzn!-ud(!tKforpvOu#lq}}cOQ-)N?_|+|007StjN9Hd3WEQ zt$=9}Hf&O9`-*v&tu1p+Y5;X)>*q3=F66P8&(oQ#Vr(*wkal-ImmcHh#z3Mk6YK0A zRQNNv>elpn8(^bgYdDjz3D{q^B!;{s+Xqa^6FoapIBCm|-#wt;sc#u%6W?^)4EJWB z0MjtCj<8X(m4b;SI*9G&x+N?|Tatq;OrHn0CXOchtd(%*L}FZmyJXPkU+QXi7shO% zn+ELAr(x}~GlnU(+p5iS8m7>&I25xd5gLKH4Vq}w9-d?XCWmRfVT})LjSmlWb5A-e zPIM)!2BYI1roh&M{FvQybTF<@+GIPMA5zEp2f130C%T7+WT}rlbp(baED@kl?9#XK z6C-`t4mG9%$7b1V`l%SHR?{ABY#Y^w)j76?806yB?FXgwymY@l zENpD&X@k$k!p@69xnQ3DBRC4oC>apof_NYRQ#i^_$ryVW$asmodYGT zC(!dICfg2=jxTyAy#8Znmjz<S5O(TitxFOE9g?zJw|uyMbHs#BO7oT*}gPE)>?u*7FFBj zbVhJ}wy$~Z2&E(tx0*Y^%&>t(8PbSpU9Ys1gH+S(*7fT?DG{cXY!%(QazxpdA`3j; zuoQ=W1@*GqtfrsJv6kHfmdcqT40)x&$<1Ioo|bbP6D!-Ty9eFQ&H|+IA!j*~;8q)V z5a3A3-hs2Qz8={ww;Ac86o@eH#-vCMngr;`n{k)|=a3ps^IWvBT>Y6pcwx9mbL?(v zou5@9-Zs4(?sMbbfodkUC4qg4WVdSLP~BB;bq#~*#OI|^bJfgE98*M=w@1-Y0mR{^ zQ6lV5XIF!#lD6&W?|Fo3wto|c;CQr==5SmS*JlSgWEJn}*`G^G%S1-j9_Wt`#9<`JQg}Ex9E5mVoTPTz;!flagz*nTkiBp}!Ir}Pl!o0(a|yVBkQzck ztbCf6t42$tN?WqDl1JIoftof*uifJclcunkk0V>dIDMLzEZv6i@tnOmvXfEA z?eT7W;!R0smmVnNsizUKh!!K&myb`evKdO1b3V_(R6ZzXM^s!=!91WpK4b|-mLaw$ zGZ{D_?-&kEpvO_O)q>^LNCpd<7;j_YZ&Rv!SWdUmSumdlDx(_KW7_?1f(yXZ1pB#( zHcU?r#W82&&R{o;vKH_?OkjEyWN0HE z1@+?>0)=7++w7E8nxjG>Ns4%>D} zCiPP@?1+oXr)EI!O%32aL!sZ|KbSKJ+fJJ`0oU&&h^{fN z$B#=W5)FK7>CJA2_KbzQK0NyIb@ zS62FNmPsNrGMw-lR(D1MTNTfT3w5|;%Xan%8t+W0Hn_7?pB!k?OM;h!o|T+aMw*X_ z;+!5xB5{>&7|%*o8Y3bjpP85Qf6yKkI_nqi0|BCRxsgo$Ym z#axr|QML4(#G06$T+@64sAYe~7B|T(nv)_sKQd)y<`Htz>D7lVC)qT`mzyS-bW|6) zWDAW5H|bo2F?ya(RiMG$i$Ml=*N()c&t`E5C5wj=vsg%QIbba8JS<1E7nI@*xka%> z7B<(X31)|KGD|A^IZ@B!ZGnv@`UiEt)%Wk{yb|$#eX$lj_xO+r$`5=QE+K)eFOPVV z&{-^d%C5GGGq7h)6bYRJfszkq>{v2|b=!5;MSvDD9$` zvl4GSgqQ_;t6eU@CE+Sa?l>ky&JN5re;aP4AtP4DH+B%sIicb0A3Jntb|}tXIB~lj zZQl}gg=7az_U93ihXi4@kmje;HEt*K+sQ=9Hc zdSet_7MCW64{-Y*nPZC(O)e81$^ljPQlV?7NwGSC+3dg)27a=@^obJ8#1NwW(?MTM zz6+8|A5^NfDK-p;Up5#oq_Ah;B8}@RR9f~r@I^qh>~VPr0bZSVR9IFkMcf!O&LWTl zsmunlnHFwJ#<2v!N1nTR3tA#s9@AQu!lc-A#*7sHNKZ=HL|kU|a%Tuz8Cunptf0 z6CPzShXUOx?!p3Xhkka+ks{{D?#W_~PiZyR<(Vgr`PhJ%eR6imlfWbo0Fha|UvBnz z?P*UUc<#q)`jQ@(!$71qhl2VzOj|5%m^m4TE+#EAc(yn;^w3h$OwvEmEYd@_Sfl6o z!Hq(08tP487lSonsAPS)j+RvflG$+?6J&gJIq9><3~wS!QFIE-GFu0*=1)tXvtbN7 zv?>!rjD?y0W7sr&o)n6J`hq5NH0gKJPW2y9E zZZB{gaqYn1boFKi?VIGY5HM&ic2Q)T))i)-x1t-7@evP3X{}om(HtfZH=V9rU)q|K zudW^sm#7Kz_!j+T&PtXeI)`@mYz~VtbTypPVO%(ftz7>(9ChoR!RhQZvp7*012;qc zbZVD#b_!&ec9g{c=YulQl@(a;rjI7Oaq&XW?^!!{y^Teh2_vzvX{RdA2q#rIEYlU2 zm4GBQQxY!Je7;hQ&}41bmGVpPC^gx(d+S#8N1CZVrb8Ffc15R&MF_4r>nhQ5 zwqB7WmLN6ext+qzQgkmoA={ns?MI}TNQh)NrYwo_c8D;{`X6cGrjd_?rC$!kto?jc zZ@HOA%ub%Qyd^ISXP38r+$6KnzAQ<~&d;OxQWeZePY<}fwRvfZFP$d%@)No7U4QA3uaMZEh8Nt7KH38DKj} zPK@nE$2x<1_Z5$`Ppr zM-&_^qz>yRe|Tg^e?pS(%A%#V0W*iBD0)8cppL6jk1EA&kKY7;2iGb`snY8p(q>18 zfXT3X-hs~4KZwc-GnuFb45~viMhsDndpc}WU=ZN5o!FibPB%h3L{A%D5*=d)W{)Ei zllug66@{m$oc4OLmS0*?N80gAV`gsxrz5(Z49?}eXhTLcIga8X3i|<1QpC}iUs0@{ zdT1-4*>S3dT{*D02J9=8pDdczs~;^yAC5>4W)`vq-xz28#3kdNe;=PAmsJI`GV?Y= z7IB8OyUh||x@KawsWY*bzIZ0HHF*Gs`6KnQ?#v*3qS-So z$lpCUSlgqYDyZ$#$@c3buh`M<=_Jm?`|*_dt74vh1}!^wn7T|S1393qH3gbR)&2ao zOn+Fi{R1g%_z&?wY8pEC&WzEkFuR&gnwzAsv7LO}mGA zrp`9yxs|6IClkx`4V=v?4V$gRIk>Gysy~-l_i%k0bv$~&TGG)2=jsP8uPyMolVl(L zpR?rGZ)-O1*T~VeT3@Gza2S>W%&0oN11G5l@Y@600X3`+Ask0c26#UxeR#`iJ-!yw zgAhJQ^arF~@$X8#(o0?UD$6~r((tI^W9)B&Lv%u!J%*}6^FJ4`$8{4#8}Zj-@LIJABb8f_SM;5HH6G;)OTCR{U*N>I$2Bi7$OMB-G;1m;Qog$i5oX7W{2OxK%lzE%VWq z2`#_H)U07>H3?hFpjA9uR13UtA*)m?H$lh!Xb;+JJAMc7cL>_Y(WPm(3`*1E<8s0+ z>MEu1kzQ-@g(Q2iK0BXw8lQD9^CZ>58f+~+s?U}y+tIIVxi^bG@TMKqi1w;3^vAl? zi%5+M2m7b4eU(z>tX;nvL{Aw~$ML5Y(7um}eA2CaH-6SNh-ZI>_0QP?n1bF8Ksxdc zUa!=p*CU@K@`ysqDM;k+u%u8W+weBrcC@alvY{z?=d{2w<7lBiNP}#VYbCPp^h5el z{Ptu?n}VaH17$eC-fTkX%kwPFD}yPgiCN*RiHV8mG%ARXJBI5OK3p+t6Uv~ypPI7^ z;XeG)3!=;sZNqAo=ONXlXYr7EaXt%~!#ew9S8Cb&(MI$&y?8s>QH1(XPvks@r8)?l zH zDRmRDZfWTZ%0X||C$VgcD8eaNfbMNkUa$`qxexj71E#&} zx#Mp_?k0Wtj;zw5?Q4!k%b7#3ryX(xsD<{j$38pq zWv6h$G00YCMA`>US^L?SC&A}crp52Gmud0)yb4Aiwwj7;LwSzD^J)9q2d((+?yO~; zb{bzftJcAH?KW+e-3C$2C-CW(%BeXJyCn*HT8B3= ztGHgDU5M0@%U&&~#n1Vq2(jMS|SfZ|vE{kgL>~y*%MDEwJ?z;ZDy@TFEdoF4%H`cR!SC4Rx7CyyYs~IBuR?1{T{?f+vP+R|zuDG8ZE8y4v4Q2# zHXl{$#%u6i^j5VOqelyR;V%5w3Tx^Fz8ih275F~<;+_L+`WRY?b=n7wSuYzy9JcU5 z+vd{tDQbL`Qv3fSq}RH0A187UxnmxJah4@hk=Fskm{$HezybW1M7d=&>z<8wa+V-` zT>2?TD~@1SK@%NF%bAmBk5REkdX<~ia&-%QkWS5h$-d3;i}uRY{!Z~ z*B>RX)YN$ust?;JD(%Bw%uUvP6B9*{r&PbNhX;jg*Xe)JVPHTw5d{YY440s8n-dzF1D$6~H;BQ(}&Us&nSCHkad7 zNY6{_m!(TJWy#9(%G&Htt@YvQ$EzdDH$`n*rYqqrG8Xt{Fjqg0)%AtCef?C->>3JD zv(pxkwb<4pyPkg8$Z>JL>;keb&_35cpHmm)+mE_nQ=aXqR?dI)Xu%QD&aL(6$dy#~ zyqcUt=*?-Q@~y5SIyV*3ITV)4IWAXa)0P^hG{3H`E`pe&s251~|CXLHrYnHbBC zCuu<=o%5nJDBKsAR-G=)*C1Lu%SQ4oRV^-*D%Tp+McsKVL0M|SW|We1VfqEOv>%5( zOkrz&t^%oyt>tnZ^yNic(P^zV{9;WAE^uB;v%=WL#>V@?= zIMz{%dqkK1a#NRn99#{B%j4HUfu7Y?xVD9Ap;v#0k#l~}hIXg)``PWS&XQwxjrL*f z%bC!WIbJ*6va{ajkhO9;+RGV#uGPN4uVJ=JA>H|TR)QyQe2D0}sCoLgfWKRyOBhG$ z1NiI4Uq4nxb{(whtV~)I|2qeNZ8rZoxG(i~=)ASMnI~X}P?y)+QOnv(SX9Wub99OQ zYrl@z3u5^5(^d#gQ*%=1%mkP&ha+b+e^t`+(&m?n@(PwLXWXBvMoc?}gq(4IY6)kN zk>%5=M}G~_cgwRW7zOHcDcN`d8RCP_$yIeujs;o|97lU)l*mq@=H%e8%&B>`EDf>$ zGMi^8wAMQGA623;&`sz7c3JV6-Yjhu@W(lID8O++b{WZmPoj#2Z1#;wr2Fv#T17kf zIi`_frN3=C6X71?LHx%N*UlUG8-)(I(&D^6zr35>9%RP5jrly<;{E=;kQJM;t}1(u zP+(@!I=vjMC-?I5N&s6fP#3>OsADxnPJT_3?;JU8nNE49A?HHRe|q~s3U=+;YF)Ok zueScp`uZt3ugK<{lCRFLG__@9&nxx%oioyISPS=I)!JPM+5K)kr`9R`*2aATuITkn zwwpHVJceVKj<-AAS!2f)-k3stWbXlc`&jC%eBK_FTI-i*M=ek5XUzjWz>a-hi|Lhx zJ(W0XdYr0Ri_)hVb_Wz52<5VIp6qFstHh?HU3(?8)K@L9isxC`yT#eN?5e6zt98RZ z>~5c`^_S$F-0*V#)I9%Y8b2+k1Pjg)pJ!udkp=IsEkP}|p|iH*S-5Zz|+;g#Q?}d0W&J$UlCmobktsPaP7!BB$X}M`=x)%&2rB-!z;00sKP4*))NNtnfo9-eh}pdVn=lGbaq75Ebh6Q^GY|&RaX8^the*u zDWydnt9F^%CZVAO>ZNtXQys3p52N0^voVZVTBtiapTn9B;T(&4Tdtfeyxxbih5hlX zG+xe=Fzy1l5_}YsrsSwdhwc&5G={VURXv2(7?ky99r#w@e3d!rzk1L~Tgjc}Wwy5d zll}ef&Tun!9@whgsGkbrlot0VXiJ<&)q}P|p^_# z>D+6fEvVV82yv9*E{2-ZhJ09KBio#%>eTd{yaR)|OC=?9N73exRla#G;N)&~3fgBM z;3&o3pc*$JOxfJ8W-dI#*L%{OGjXq*_Gwdccbg~guz@;j&C}#xU`ysn^N*ZrwvEr= zWI!!wMqLI`wQ zkmuAXSS_UuqVBoc(EU?gYV*yFN87KZY-%L?c1JB*<6Nh<&OF)-^I&W6E|YtkVnLzO z*_y#FFtFPEzY zoMgAZx|+2c&0CA2-gxsw_c67g9p%p**?oKW3-qlI_QE9U#@%}VxT!AmJlk4#zM|^e zA)hxPl47^4Ng=)Sj+V9;wK%&BQ}m0KmOp=#(7joY5LtbxdMe5EIa!>GJn6QN=kdTg z?0>2*S910qtCeB%P}QFNb8ueawLlCWDtAP2?Gvk4pS8AZhqkSEpsm~dw!#Kzn;b=B z@V4GOeLHmEzh%O{G-TSu%_Rt{yK;JU)%xd*-`ruT?na-|H;V@074(T5eVMi-e7p#p zywl=T9fkkS~{b&AIt$S-32-=X_hqm*VT+4O3azSyQzZ%DIr$K7Y%Db``Ei(jM?{{*J#kEl%<{By3+7Rk~Oe`|n&#Lx)IIGQ_@$N&aKS)~E z_?|uU$nE8RtvPkC(lcg_?zxh4e0Y5!PnMs?>orcn5xWJef*m>jB&WA6ng$PU6y(cM z)!sg)^|4&@c%I9hd)Csvz47-P+}Gvz2DZPRK`>A6j&?1i`g1(1hFbmzGH{RK)tAG; zJ4Nh$W$uW+dI?sOPJ6Z{|DDpXr{%2^?7p&^=j~bN^tQP z4l@R8AGHB@<*Yo0>!zJfRdUv*Z{>5Xnp1)!e|QQ0!19bf{%W#p!Q{{`lvwerp&)LC z_25Ee{)KC;nhqF;{~ETYW~bz_f41aTq0+H=|8Z5w-4pP3e0ZleyDfQ(cDszmg91Bc zEYLTmv*$buMO}5M@_(>u;#@IkAHsFD-dE#pkADx-?%=Q?Ih)|fH_`(ti>#qz4U0@Z&N)thHkl~=LRfBdgh9X)5#&lzzxODnT8LrWdW zQ#JdKK6jy=jEHKS@)l`tN?{XWo;b_*6x8TH{a2{=%2(BjxfV86o6<5IOwCiM_+fOq zY*Y5OD|xYin}#_07=8Z#|LSN)Rk*XNccyczElOE=cAmnjdHFv>HJxJmL$bZYDsiDT z;4TJiSI`|qdxAf#>vTdcAJX6e)Gm;Vk{;cKWbsI6>n*q4gO1S`|2wOt1770|sJK`S z?y}S&%=sGkig|uTrO2uArQYs$t?@w_aFNHsE#f}#=g}|ZsxOaP&YfmIp!pf7Xr(8(S*=;Ika4zH&by7ThD#6Ap@ zof%Ww7>>G}vgm0?wu;o~2XhOxTeX4xk6E-_SvrU57Vw?_8QsSoT2tGH+#?q;@;Nq6 z8;P2&m#4ZVRY@m|L>?b5=TS13KiqDTWAj-|$p`OooIQt=HQ&Mcoa`y4s@?{(?$Yr{0#aaD0A_ z&gk3zGaAzl@OG$JrM;Cj96JYnkh;QFhRtcI`BhLYe3F^nl5=GJbOyVYK1pUnQyF^R zPdbMPDwO=XJL9?F{~Bu0b1LUT?+OR4lz&wy;(h-aEk%RWu8t!DJ+*%J*tVQ>zrKQ>YPk!@Yi?^MN~dc(dw^HxpXS$xko?|<#5 ze*U^+!J>-lKv7wss5lr^PEj=A%&({oMV+!T#MFnB4m5;{Dn{QAN+bT(VN;yHRXJa;DJcdg%zV8a>`1PbFmJF87yP$DP6cz3`+$*&d_OsPlg;cJz3{ptht`2 zvWkn@s>KY>pRegJ-Q+0qLi8BE875zFao<2!6YbC7vk!RXR!!8r;B@_p*mC|?6E$!D zT0f8&#yiFPYN9*v63%2dUQgSJ_rwjXKXB!h@rLe()%A@lS0$FOX;dmu6hx8Ag27ankFCyv|?mD`cnB=8v|qQ2urb%H&aTn5nf-Uf@SmPvwUT!;^Lx6pt7v845b!~ zN%s=tuhf2QuO!`DF}54+7G%3YS)oXvEFfmr$gWpbAswuY77LZOvC+}QG|Tk@rJGi? zA+o$x>{$4kqmFV^XITV|-8bBmD94+d8XIZ|*ATWR&@IbQM3gOFLQVGL|G)*=sY31e zP^IJ;U~3ddBEe$t>sEXHo-I?z`)v-ST4TDBiAj=n&o! zA3dhO--gnbkBv|j_z_j~YaAshlZNkyB^5L0`B2dOGBIp4HZ(xQel#h*-?-Z{x8&w1bA*y_*r0Lf#Z0yc5_%yL3cCN8^(EZG&iuWSJKpAt@cJ*Gw z1Q2v867XNDqB@Kgt(;#Br6np7mGeU|(FCLSN_2vyM0!y7BJ+x|`9DX3m(7ZVD~9!d0b~fniKrm5t(*@o zz`5BCsoMqy3dc}Z?5O3#96Oq_8&F!?ZNEi$$roR=8ZVieXA0W{<=_7G$Ji zBmx2G*3Zv|?ncKrP*jY)ST@g5bNOb*OcXDuPNe&jLwJ`q>ZTNHcZ=lx62_h&6T#%hN99ks!QcpqQ?JUPC-nIXn~7jy+F{uEeOq!aff# zD7~Xxq&FfjjB+oPp|40UI?+}v%0AIXJ)LNyy30?r)5V==LjVv$5hy{uh>yNQ1ns1S zq6Kk{l@)?^02wR}zzU&>vAv>?8(HHMaTF2O2fwZR?B0qKH%5@(`ic{cM;z5>-d5SR zogd%Hf3NBvd8lFqM#o@0bbkSkBw`RJ8ezr7^P98#MKL~jld7$cEqD7ylyAI@(yL{n z`0iRF9UbaTM8OfoTlx;7{L6CZ$eqJj^U8mTAV%W)rc*quAGnPPCL&JnQEr5M| zNZjR#PwJo3TIQo7=(93TocN?5r!{h#8aeTJ35$1{-M@^5KJET5hHcO==TWNMQRl6Q zHN@(d$Li~sH{vqY<&LV77o0|unP?m%m-+NrG<7hlUwoQMEfFG%%xq z84b*6U`7Ko8ko_*j0R>jFr$GP4a{iZzpDlubv~+gF?Ln5Ysg&)g(uPS>Eycxf7ee0 z)I^Aw{x=cAn*eYdy93Xp?@@eLZ3pguY{zrj`|-OCPq%Cr#?OX+@;e+(Dr_aI&Sjp5zlJ%MFe3`4~L>)aZn~+ zJJ9Ft`I27Yv8gd^ZE13FKQW2>IK{=MV93tGW*hIkhK+Z@O?4xvBrGXpQS#8I|z7} zK>=D+EdiBpkY0%6tBzkiVMp?KK&&R#y3m;yi}7EjIn!ADt*(8TH$l; zF?rMQxy!fQt?vrR*&%m0c=LM@7;nV#s?{MQjXASKyM#uK@=Db%ltkYupY*W2xxL_QePENMZ-z#w zMf%xGXn12YjFr$GP4a{g@Mgub%n9;zD24*xcqk$O>{I}G={|6|~I=KJ< diff --git a/SDK/NUnit/bin/net-2.0/tests/test-assembly.dll b/SDK/NUnit/bin/net-2.0/tests/test-assembly.dll deleted file mode 100644 index d483b65a49e22cc6cb94631c1e58ebe69f90d078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57344 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 diff --git a/SDK/NUnit/bin/net-2.0/tests/test-utilities.dll b/SDK/NUnit/bin/net-2.0/tests/test-utilities.dll deleted file mode 100644 index 3a8144a7b5c2708cfe3e2047db4f9f23279b6d81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 P7J*s>Y7zMJjKKc^x-eW9 diff --git a/SDK/NUnit/bin/net-2.0/tests/timing-tests.dll b/SDK/NUnit/bin/net-2.0/tests/timing-tests.dll deleted file mode 100644 index 7de12f6da11c722f2cee0675d803893e09f0ab97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. \ No newline at end of file diff --git a/SDK/NUnit/license.txt b/SDK/NUnit/license.txt deleted file mode 100644 index ab91df4..0000000 --- a/SDK/NUnit/license.txt +++ /dev/null @@ -1,15 +0,0 @@ -Copyright 2002-2008 Charlie Poole -Copyright 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov -Copyright 2000-2002 Philip A. Craig - -This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. - -Portions Copyright 2002-2008 Charlie Poole or Copyright 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright 2000-2002 Philip A. Craig - -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. From 006ce2da730210078f1c1f861e1244ceaa0c0850 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Mon, 19 Jun 2023 07:48:30 -0700 Subject: [PATCH 09/14] build: update ZedGraph to the latest version on GitHub (with patches) --- .gitmodules | 4 + MidiShapeShifter/MidiShapeShifter.sln | 55 +- .../MidiShapeShifter/MidiShapeShifter.csproj | 8 +- SDK/ZedGraphs/Properties/AssemblyInfo.cs | 39 - SDK/ZedGraphs/ZedGraph.csproj | 266 -- SDK/ZedGraphs/ZedGraph.sln | 20 - SDK/ZedGraphs/ZedGraph/ArrowObj.cs | 323 -- SDK/ZedGraphs/ZedGraph/Axis.cs | 1445 -------- SDK/ZedGraphs/ZedGraph/AxisLabel.cs | 180 - SDK/ZedGraphs/ZedGraph/Bar.cs | 523 --- SDK/ZedGraphs/ZedGraph/BarItem.cs | 457 --- SDK/ZedGraphs/ZedGraph/BarSettings.cs | 485 --- SDK/ZedGraphs/ZedGraph/BasicArrayPointList.cs | 147 - SDK/ZedGraphs/ZedGraph/Border.cs | 250 -- SDK/ZedGraphs/ZedGraph/BoxObj.cs | 348 -- SDK/ZedGraphs/ZedGraph/Chart.cs | 256 -- SDK/ZedGraphs/ZedGraph/CollectionPlus.cs | 162 - SDK/ZedGraphs/ZedGraph/ColorSymbolRotator.cs | 188 -- SDK/ZedGraphs/ZedGraph/CurveItem.cs | 1229 ------- SDK/ZedGraphs/ZedGraph/CurveList.cs | 745 ----- SDK/ZedGraphs/ZedGraph/DataSourcePointList.cs | 304 -- SDK/ZedGraphs/ZedGraph/DateAsOrdinalScale.cs | 339 -- SDK/ZedGraphs/ZedGraph/DateScale.cs | 947 ------ SDK/ZedGraphs/ZedGraph/EllipseObj.cs | 259 -- SDK/ZedGraphs/ZedGraph/ErrorBar.cs | 388 --- SDK/ZedGraphs/ZedGraph/ErrorBarItem.cs | 364 -- SDK/ZedGraphs/ZedGraph/ExponentScale.cs | 404 --- SDK/ZedGraphs/ZedGraph/Fill.cs | 1145 ------- SDK/ZedGraphs/ZedGraph/FilteredPointList.cs | 321 -- SDK/ZedGraphs/ZedGraph/FontSpec.cs | 1503 --------- SDK/ZedGraphs/ZedGraph/GapLabel.cs | 176 - SDK/ZedGraphs/ZedGraph/GasGaugeNeedle.cs | 594 ---- SDK/ZedGraphs/ZedGraph/GasGaugeRegion.cs | 598 ---- SDK/ZedGraphs/ZedGraph/GraphObj.cs | 505 --- SDK/ZedGraphs/ZedGraph/GraphObjList.cs | 304 -- SDK/ZedGraphs/ZedGraph/GraphPane.cs | 2330 ------------- SDK/ZedGraphs/ZedGraph/HSBColor.cs | 225 -- SDK/ZedGraphs/ZedGraph/HiLowBar.cs | 378 --- SDK/ZedGraphs/ZedGraph/HiLowBarItem.cs | 149 - SDK/ZedGraphs/ZedGraph/IPointList.cs | 57 - SDK/ZedGraphs/ZedGraph/IPointListEdit.cs | 88 - SDK/ZedGraphs/ZedGraph/ImageObj.cs | 342 -- SDK/ZedGraphs/ZedGraph/JapaneseCandleStick.cs | 485 --- .../ZedGraph/JapaneseCandleStickItem.cs | 353 -- SDK/ZedGraphs/ZedGraph/Label.cs | 202 -- SDK/ZedGraphs/ZedGraph/Legend.cs | 1038 ------ SDK/ZedGraphs/ZedGraph/Line.cs | 1455 -------- SDK/ZedGraphs/ZedGraph/LineBase.cs | 474 --- SDK/ZedGraphs/ZedGraph/LineItem.cs | 394 --- SDK/ZedGraphs/ZedGraph/LineObj.cs | 338 -- .../ZedGraph/LinearAsOrdinalScale.cs | 244 -- SDK/ZedGraphs/ZedGraph/LinearScale.cs | 234 -- SDK/ZedGraphs/ZedGraph/Link.cs | 304 -- SDK/ZedGraphs/ZedGraph/Location.cs | 566 ---- SDK/ZedGraphs/ZedGraph/LogScale.cs | 443 --- SDK/ZedGraphs/ZedGraph/MajorGrid.cs | 200 -- SDK/ZedGraphs/ZedGraph/MajorTic.cs | 244 -- SDK/ZedGraphs/ZedGraph/Margin.cs | 264 -- SDK/ZedGraphs/ZedGraph/MasterPane.cs | 1179 ------- SDK/ZedGraphs/ZedGraph/MinorGrid.cs | 294 -- SDK/ZedGraphs/ZedGraph/MinorTic.cs | 501 --- SDK/ZedGraphs/ZedGraph/NoDupePointList.cs | 358 -- SDK/ZedGraphs/ZedGraph/OHLCBar.cs | 436 --- SDK/ZedGraphs/ZedGraph/OHLCBarItem.cs | 345 -- SDK/ZedGraphs/ZedGraph/OrdinalScale.cs | 233 -- SDK/ZedGraphs/ZedGraph/PaneBase.cs | 1220 ------- SDK/ZedGraphs/ZedGraph/PaneLayoutMgr.cs | 561 ---- SDK/ZedGraphs/ZedGraph/PaneList.cs | 237 -- SDK/ZedGraphs/ZedGraph/PieItem.cs | 1091 ------ SDK/ZedGraphs/ZedGraph/PointD.cs | 59 - SDK/ZedGraphs/ZedGraph/PointPair.cs | 562 ---- SDK/ZedGraphs/ZedGraph/PointPair4.cs | 218 -- SDK/ZedGraphs/ZedGraph/PointPairBase.cs | 281 -- SDK/ZedGraphs/ZedGraph/PointPairCV.cs | 122 - SDK/ZedGraphs/ZedGraph/PointPairList.cs | 935 ------ SDK/ZedGraphs/ZedGraph/PolyObj.cs | 336 -- SDK/ZedGraphs/ZedGraph/RadarPointList.cs | 216 -- .../ZedGraph/RollingPointPairList.cs | 655 ---- .../ZedGraph/SampleMultiPointList.cs | 284 -- SDK/ZedGraphs/ZedGraph/SamplePointList.cs | 198 -- SDK/ZedGraphs/ZedGraph/Scale.cs | 2930 ----------------- SDK/ZedGraphs/ZedGraph/ScaleState.cs | 186 -- SDK/ZedGraphs/ZedGraph/ScaleStateList.cs | 178 - SDK/ZedGraphs/ZedGraph/ScrollRange.cs | 97 - SDK/ZedGraphs/ZedGraph/ScrollRangeList.cs | 129 - SDK/ZedGraphs/ZedGraph/Selection.cs | 258 -- SDK/ZedGraphs/ZedGraph/StickItem.cs | 219 -- SDK/ZedGraphs/ZedGraph/StockPointList.cs | 171 - SDK/ZedGraphs/ZedGraph/StockPt.cs | 316 -- SDK/ZedGraphs/ZedGraph/Symbol.cs | 680 ---- SDK/ZedGraphs/ZedGraph/TextObj.cs | 447 --- SDK/ZedGraphs/ZedGraph/TextScale.cs | 328 -- SDK/ZedGraphs/ZedGraph/Types.cs | 868 ----- SDK/ZedGraphs/ZedGraph/ValueHandler.cs | 372 --- SDK/ZedGraphs/ZedGraph/X2Axis.cs | 260 -- SDK/ZedGraphs/ZedGraph/XAxis.cs | 255 -- SDK/ZedGraphs/ZedGraph/XDate.cs | 1732 ---------- SDK/ZedGraphs/ZedGraph/Y2Axis.cs | 255 -- SDK/ZedGraphs/ZedGraph/Y2AxisList.cs | 188 -- SDK/ZedGraphs/ZedGraph/YAxis.cs | 255 -- SDK/ZedGraphs/ZedGraph/YAxisList.cs | 187 -- SDK/ZedGraphs/ZedGraph/ZedGraph.csproj | 61 - .../ZedGraph/ZedGraphControl.ContextMenu.cs | 892 ----- .../ZedGraph/ZedGraphControl.Designer.cs | 78 - .../ZedGraph/ZedGraphControl.Events.cs | 1557 --------- .../ZedGraph/ZedGraphControl.Printing.cs | 240 -- .../ZedGraph/ZedGraphControl.Properties.cs | 1246 ------- .../ZedGraph/ZedGraphControl.ScrollBars.cs | 395 --- SDK/ZedGraphs/ZedGraph/ZedGraphControl.cs | 857 ----- SDK/ZedGraphs/ZedGraph/ZedGraphControl.resx | 120 - SDK/ZedGraphs/ZedGraph/ZedGraphException.cs | 77 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.de.resx | 159 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.es.resx | 159 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.fr.resx | 159 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.hu.resx | 162 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.it.resx | 162 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ja.resx | 162 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.pt.resx | 159 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.resx | 162 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ru.resx | 162 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sk.resx | 162 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sv.resx | 75 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tr.resx | 162 - SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tw.resx | 162 - .../ZedGraph/ZedGraphLocale.zh-cn.resx | 159 - .../ZedGraph/ZedGraphLocale.zh-tw.resx | 162 - SDK/ZedGraphs/ZedGraph/ZoomState.cs | 191 -- SDK/ZedGraphs/ZedGraph/ZoomStateStack.cs | 178 - SDK/ZedGraphs/zedgraphmsskey.snk | Bin 596 -> 0 bytes 129 files changed, 47 insertions(+), 54893 deletions(-) create mode 100644 .gitmodules delete mode 100644 SDK/ZedGraphs/Properties/AssemblyInfo.cs delete mode 100644 SDK/ZedGraphs/ZedGraph.csproj delete mode 100644 SDK/ZedGraphs/ZedGraph.sln delete mode 100644 SDK/ZedGraphs/ZedGraph/ArrowObj.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Axis.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/AxisLabel.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Bar.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/BarItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/BarSettings.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/BasicArrayPointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Border.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/BoxObj.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Chart.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/CollectionPlus.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ColorSymbolRotator.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/CurveItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/CurveList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/DataSourcePointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/DateAsOrdinalScale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/DateScale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/EllipseObj.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ErrorBar.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ErrorBarItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ExponentScale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Fill.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/FilteredPointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/FontSpec.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/GapLabel.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/GasGaugeNeedle.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/GasGaugeRegion.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/GraphObj.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/GraphObjList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/GraphPane.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/HSBColor.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/HiLowBar.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/HiLowBarItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/IPointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/IPointListEdit.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ImageObj.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/JapaneseCandleStick.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/JapaneseCandleStickItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Label.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Legend.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Line.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/LineBase.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/LineItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/LineObj.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/LinearAsOrdinalScale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/LinearScale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Link.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Location.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/LogScale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/MajorGrid.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/MajorTic.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Margin.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/MasterPane.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/MinorGrid.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/MinorTic.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/NoDupePointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/OHLCBar.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/OHLCBarItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/OrdinalScale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PaneBase.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PaneLayoutMgr.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PaneList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PieItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PointD.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PointPair.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PointPair4.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PointPairBase.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PointPairCV.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PointPairList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/PolyObj.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/RadarPointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/RollingPointPairList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/SampleMultiPointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/SamplePointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Scale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ScaleState.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ScaleStateList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ScrollRange.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ScrollRangeList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Selection.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/StickItem.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/StockPointList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/StockPt.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Symbol.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/TextObj.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/TextScale.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Types.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ValueHandler.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/X2Axis.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/XAxis.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/XDate.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Y2Axis.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/Y2AxisList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/YAxis.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/YAxisList.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraph.csproj delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphControl.ContextMenu.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphControl.Designer.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphControl.Events.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphControl.Printing.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphControl.Properties.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphControl.ScrollBars.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphControl.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphControl.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphException.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.de.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.es.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.fr.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.hu.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.it.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ja.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.pt.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ru.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sk.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sv.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tr.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tw.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.zh-cn.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZedGraphLocale.zh-tw.resx delete mode 100644 SDK/ZedGraphs/ZedGraph/ZoomState.cs delete mode 100644 SDK/ZedGraphs/ZedGraph/ZoomStateStack.cs delete mode 100644 SDK/ZedGraphs/zedgraphmsskey.snk diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..40be23a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "SDK/ZedGraph"] + path = SDK/ZedGraph + url = https://github.com/aminya/zedgraph/ + branch = midi-shape-shifter diff --git a/MidiShapeShifter/MidiShapeShifter.sln b/MidiShapeShifter/MidiShapeShifter.sln index 34e3af9..da6eae0 100644 --- a/MidiShapeShifter/MidiShapeShifter.sln +++ b/MidiShapeShifter/MidiShapeShifter.sln @@ -5,8 +5,9 @@ VisualStudioVersion = 17.2.32519.379 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MidiShapeShifter", "MidiShapeShifter\MidiShapeShifter.csproj", "{D19470F9-7D1E-4385-AD34-C7D826649F89}" ProjectSection(ProjectDependencies) = postProject - {2541686B-1673-43BF-AF89-3163945DB009} = {2541686B-1673-43BF-AF89-3163945DB009} + {23A6C1AD-296B-4A10-A27A-ADFF30132902} = {23A6C1AD-296B-4A10-A27A-ADFF30132902} {B4218BC9-9736-42B9-BC99-7903FDBEBA28} = {B4218BC9-9736-42B9-BC99-7903FDBEBA28} + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135} = {DB003528-61D8-4FA6-B0B5-F4F09F1F9135} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MidiShapeShifterTest", "MidiShapeShifterTest\MidiShapeShifterTest.csproj", "{F51E9F9B-101C-4F76-92C3-F28904E58466}" @@ -21,7 +22,9 @@ Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "MidiShapeShifterInstaller", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LBIndustrialCtrls", "..\SDK\LBIndustrialCtrls\LBIndustrialCtrls\LBIndustrialCtrls.csproj", "{B4218BC9-9736-42B9-BC99-7903FDBEBA28}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZedGraph", "..\SDK\ZedGraphs\ZedGraph.csproj", "{2541686B-1673-43BF-AF89-3163945DB009}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZedGraph", "..\SDK\ZedGraph\source\ZedGraph\ZedGraph.csproj", "{DB003528-61D8-4FA6-B0B5-F4F09F1F9135}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZedGraph.WinForms", "..\SDK\ZedGraph\source\ZedGraph.WinForms\ZedGraph.WinForms.csproj", "{23A6C1AD-296B-4A10-A27A-ADFF30132902}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -96,22 +99,38 @@ Global {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|Any CPU.Build.0 = Release|Any CPU {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|x64.ActiveCfg = Release|Any CPU {B4218BC9-9736-42B9-BC99-7903FDBEBA28}.Release|x64.Build.0 = Release|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.All|Any CPU.ActiveCfg = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.All|Any CPU.Build.0 = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.All|x64.ActiveCfg = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.All|x64.Build.0 = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Debug|x64.ActiveCfg = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Debug|x64.Build.0 = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Deploy|Any CPU.Build.0 = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Deploy|x64.ActiveCfg = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Deploy|x64.Build.0 = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Release|Any CPU.Build.0 = Release|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Release|x64.ActiveCfg = Release|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Release|x64.Build.0 = Release|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.All|Any CPU.ActiveCfg = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.All|Any CPU.Build.0 = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.All|x64.ActiveCfg = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.All|x64.Build.0 = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Debug|x64.ActiveCfg = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Debug|x64.Build.0 = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Deploy|x64.ActiveCfg = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Deploy|x64.Build.0 = Debug|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Release|Any CPU.Build.0 = Release|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Release|x64.ActiveCfg = Release|Any CPU + {DB003528-61D8-4FA6-B0B5-F4F09F1F9135}.Release|x64.Build.0 = Release|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.All|Any CPU.ActiveCfg = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.All|Any CPU.Build.0 = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.All|x64.ActiveCfg = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.All|x64.Build.0 = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Debug|x64.ActiveCfg = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Debug|x64.Build.0 = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Deploy|x64.ActiveCfg = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Deploy|x64.Build.0 = Debug|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Release|Any CPU.ActiveCfg = Release|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Release|Any CPU.Build.0 = Release|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Release|x64.ActiveCfg = Release|Any CPU + {23A6C1AD-296B-4A10-A27A-ADFF30132902}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj index 0eabd16..ef01044 100644 --- a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj +++ b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj @@ -400,8 +400,12 @@ {b4218bc9-9736-42b9-bc99-7903fdbeba28} LBIndustrialCtrls - - {2541686b-1673-43bf-af89-3163945db009} + + {23a6c1ad-296b-4a10-a27a-adff30132902} + ZedGraph.WinForms + + + {db003528-61d8-4fa6-b0b5-f4f09f1f9135} ZedGraph diff --git a/SDK/ZedGraphs/Properties/AssemblyInfo.cs b/SDK/ZedGraphs/Properties/AssemblyInfo.cs deleted file mode 100644 index ce7aa91..0000000 --- a/SDK/ZedGraphs/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; -using System.Resources; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ZedGraph-MSS")] -[assembly: AssemblyDescription("ZedGraph Library (modified for use with MSS)")] -[assembly: AssemblyConfiguration( "" )] -[assembly: AssemblyCompany( "" )] -[assembly: AssemblyProduct( "ZedGraph Library" )] -[assembly: AssemblyCopyright( "Copyright © 2003-2007 John Champion" )] -[assembly: AssemblyTrademark( "" )] -[assembly: AssemblyCulture( "" )] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible( false )] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid( "a552bf32-72a3-4d27-968c-72e7a90243f2" )] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("5.1.6.*")] -//[assembly: AssemblyFileVersion( "4.9.7.0" )] -//[assembly: AllowPartiallyTrustedCallers ] -[assembly: NeutralResourcesLanguageAttribute( "" )] diff --git a/SDK/ZedGraphs/ZedGraph.csproj b/SDK/ZedGraphs/ZedGraph.csproj deleted file mode 100644 index 6dbe0e4..0000000 --- a/SDK/ZedGraphs/ZedGraph.csproj +++ /dev/null @@ -1,266 +0,0 @@ - - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {2541686B-1673-43BF-AF89-3163945DB009} - Library - Properties - ZedGraph - ZedGraph - true - zedgraphmsskey.snk - v4.5.2 - - - - - 2.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - AllRules.ruleset - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - bin\Release\ZedGraph.XML - AllRules.ruleset - false - - - - - - - - - - - - - - - - - - - - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UserControl - - - UserControl - - - - UserControl - - - UserControl - - - UserControl - - - UserControl - - - - - - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.5 SP1 - false - - - - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph.sln b/SDK/ZedGraphs/ZedGraph.sln deleted file mode 100644 index 200eeb3..0000000 --- a/SDK/ZedGraphs/ZedGraph.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZedGraph", "ZedGraph.csproj", "{2541686B-1673-43BF-AF89-3163945DB009}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2541686B-1673-43BF-AF89-3163945DB009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2541686B-1673-43BF-AF89-3163945DB009}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/SDK/ZedGraphs/ZedGraph/ArrowObj.cs b/SDK/ZedGraphs/ZedGraph/ArrowObj.cs deleted file mode 100644 index fc98e7b..0000000 --- a/SDK/ZedGraphs/ZedGraph/ArrowObj.cs +++ /dev/null @@ -1,323 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - ///

- /// A class that represents a graphic arrow or line object on the graph. A list of - /// ArrowObj objects is maintained by the collection class. - /// - /// - /// John Champion - /// $Revision: 3.4 $ $Date: 2007-01-25 07:56:08 $ - [Serializable] - public class ArrowObj : LineObj, ICloneable, ISerializable - { - #region Fields - /// - /// Private field that stores the arrowhead size, measured in points. - /// Use the public property to access this value. - /// - private float _size; - /// - /// Private boolean field that stores the arrowhead state. - /// Use the public property to access this value. - /// - /// true if an arrowhead is to be drawn, false otherwise - private bool _isArrowHead; - - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - new public struct Default - { - /// - /// The default size for the item arrowhead - /// ( property). Units are in points (1/72 inch). - /// - public static float Size = 12.0F; - /// - /// The default display mode for the item arrowhead - /// ( property). true to show the - /// arrowhead, false to hide it. - /// - public static bool IsArrowHead = true; - } - #endregion - - #region Properties - /// - /// The size of the arrowhead. - /// - /// The display of the arrowhead can be - /// enabled or disabled with the property. - /// - /// The size is defined in points (1/72 inch) - /// - public float Size - { - get { return _size; } - set { _size = value; } - } - /// - /// Determines whether or not to draw an arrowhead - /// - /// true to show the arrowhead, false to show the line segment - /// only - /// - public bool IsArrowHead - { - get { return _isArrowHead; } - set { _isArrowHead = value; } - } - #endregion - - #region Constructors - /// Constructors for the object - /// - /// A constructor that allows the position, color, and size of the - /// to be pre-specified. - /// - /// An arbitrary specification - /// for the arrow - /// The size of the arrowhead, measured in points. - /// The x position of the starting point that defines the - /// arrow. The units of this position are specified by the - /// property. - /// The y position of the starting point that defines the - /// arrow. The units of this position are specified by the - /// property. - /// The x position of the ending point that defines the - /// arrow. The units of this position are specified by the - /// property. - /// The y position of the ending point that defines the - /// arrow. The units of this position are specified by the - /// property. - public ArrowObj( Color color, float size, double x1, double y1, - double x2, double y2 ) - : base( color, x1, y1, x2, y2 ) - { - _isArrowHead = Default.IsArrowHead; - _size = size; - } - - /// - /// A constructor that allows only the position of the - /// arrow to be pre-specified. All other properties are set to - /// default values - /// - /// The x position of the starting point that defines the - /// . The units of this position are specified by the - /// property. - /// The y position of the starting point that defines the - /// . The units of this position are specified by the - /// property. - /// The x position of the ending point that defines the - /// . The units of this position are specified by the - /// property. - /// The y position of the ending point that defines the - /// . The units of this position are specified by the - /// property. - public ArrowObj( double x1, double y1, double x2, double y2 ) - : this( LineBase.Default.Color, Default.Size, x1, y1, x2, y2 ) - { - } - - /// - /// Default constructor -- places the at location - /// (0,0) to (1,1). All other values are defaulted. - /// - public ArrowObj() - : - this( LineBase.Default.Color, Default.Size, 0, 0, 1, 1 ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ArrowObj( ArrowObj rhs ) - : base( rhs ) - { - _size = rhs.Size; - _isArrowHead = rhs.IsArrowHead; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new ArrowObj Clone() - { - return new ArrowObj( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected ArrowObj( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema3" ); - - _size = info.GetSingle( "size" ); - _isArrowHead = info.GetBoolean( "isArrowHead" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema3", schema2 ); - info.AddValue( "size", _size ); - info.AddValue( "isArrowHead", _isArrowHead ); - } - #endregion - - #region Rendering Methods - /// - /// Render this object to the specified device. - /// - /// - /// This method is normally only called by the Draw method - /// of the parent collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) - { - // Convert the arrow coordinates from the user coordinate system - // to the screen coordinate system - PointF pix1 = this.Location.TransformTopLeft( pane ); - PointF pix2 = this.Location.TransformBottomRight( pane ); - - if ( pix1.X > -10000 && pix1.X < 100000 && pix1.Y > -100000 && pix1.Y < 100000 && - pix2.X > -10000 && pix2.X < 100000 && pix2.Y > -100000 && pix2.Y < 100000 ) - { - // get a scaled size for the arrowhead - float scaledSize = (float)( _size * scaleFactor ); - - // calculate the length and the angle of the arrow "vector" - double dy = pix2.Y - pix1.Y; - double dx = pix2.X - pix1.X; - float angle = (float)Math.Atan2( dy, dx ) * 180.0F / (float)Math.PI; - float length = (float)Math.Sqrt( dx * dx + dy * dy ); - - // Save the old transform matrix - Matrix transform = g.Transform; - // Move the coordinate system so it is located at the starting point - // of this arrow - g.TranslateTransform( pix1.X, pix1.Y ); - // Rotate the coordinate system according to the angle of this arrow - // about the starting point - g.RotateTransform( angle ); - - // get a pen according to this arrow properties - using ( Pen pen = _line.GetPen( pane, scaleFactor ) ) - //new Pen( _color, pane.ScaledPenWidth( _penWidth, scaleFactor ) ) ) - { - //pen.DashStyle = _style; - - // Only show the arrowhead if required - if ( _isArrowHead ) - { - // Draw the line segment for this arrow - g.DrawLine( pen, 0, 0, length - scaledSize + 1, 0 ); - - // Create a polygon representing the arrowhead based on the scaled - // size - PointF[] polyPt = new PointF[4]; - float hsize = scaledSize / 3.0F; - polyPt[0].X = length; - polyPt[0].Y = 0; - polyPt[1].X = length - scaledSize; - polyPt[1].Y = hsize; - polyPt[2].X = length - scaledSize; - polyPt[2].Y = -hsize; - polyPt[3] = polyPt[0]; - - using ( SolidBrush brush = new SolidBrush( _line._color ) ) - // render the arrowhead - g.FillPolygon( brush, polyPt ); - } - else - g.DrawLine( pen, 0, 0, length, 0 ); - } - - // Restore the transform matrix back to its original state - g.Transform = transform; - } - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Axis.cs b/SDK/ZedGraphs/ZedGraph/Axis.cs deleted file mode 100644 index 8075d9c..0000000 --- a/SDK/ZedGraphs/ZedGraph/Axis.cs +++ /dev/null @@ -1,1445 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The Axis class is an abstract base class that encompasses all properties - /// and methods required to define a graph Axis. - /// - /// This class is inherited by the - /// , , and classes - /// to define specific characteristics for those types. - /// - /// - /// John Champion modified by Jerry Vos - /// $Revision: 3.76 $ $Date: 2008-02-16 23:21:48 $ - [Serializable] - abstract public class Axis : ISerializable, ICloneable - { - - #region Class Fields - - /// - /// private field that stores the class, which implements all the - /// calculations and methods associated with the numeric scale for this - /// . See the public property to access this class. - /// - internal Scale _scale; - - /// - /// Private field that stores the class, which handles all - /// the minor tic information. See the public property to access this class. - /// - internal MinorTic _minorTic; - /// - /// Private field that stores the class, which handles all - /// the major tic information. See the public property to access this class. - /// - internal MajorTic _majorTic; - - /// - /// Private field that stores the class, which handles all - /// the major grid information. See the public property to access this class. - /// - internal MajorGrid _majorGrid; - /// - /// Private field that stores the class, which handles all - /// the minor grid information. See the public property to access this class. - /// - internal MinorGrid _minorGrid; - - /// Private fields for the scale rendering properties. - /// Use the public properties and - /// for access to these values. - /// - internal double _cross; - - /// Private field for the automatic cross position mode. - /// Use the public property for access to this value. - /// - internal bool _crossAuto; - - /// Private fields for the attributes. - /// Use the public properties , - /// for access to these values. - /// - protected bool _isVisible, - _isAxisSegmentVisible; - - /// Private field for the title string. - /// Use the public property for access to this value. - /// - protected AxisLabel _title; - - /// - /// A tag object for use by the user. This can be used to store additional - /// information associated with the . ZedGraph does - /// not use this value for any purpose. - /// - /// - /// Note that, if you are going to Serialize ZedGraph data, then any type - /// that you store in must be a serializable type (or - /// it will cause an exception). - /// - public object Tag; - - /// Private field for the drawing dimensions. - /// Use the public property - /// for access to these values. - private float _axisGap; - - /// - /// Private field for the minimum allowable space allocation. - /// Use the public property to access this value. - /// - /// - private float _minSpace; - - /// Private fields for the colors. - /// Use the public property for access to this values. - /// - private Color _color; - - /// - /// Temporary values for axis space calculations (see ). - /// - internal float _tmpSpace; - - #endregion - - #region Events - - /// - /// A delegate that allows full custom formatting of the Axis labels - /// - /// The for which the label is to be - /// formatted - /// The of interest. - /// The value to be formatted - /// The zero-based index of the label to be formatted - /// - /// A string value representing the label, or null if the ZedGraph should go ahead - /// and generate the label according to the current settings - /// - public delegate string ScaleFormatHandler( GraphPane pane, Axis axis, double val, int index ); - - /// - /// Subscribe to this event to handle custom formatting of the scale labels. - /// - public event ScaleFormatHandler ScaleFormatEvent; - - // Revision: JCarpenter 10/06 - /// - /// Allow customization of title based on user preferences. - /// - /// The of interest. - /// - /// A string value representing the label, or null if the ZedGraph should go ahead - /// and generate the label according to the current settings. To make the title - /// blank, return "". - /// - public delegate string ScaleTitleEventHandler( Axis axis ); - - //Revision: JCarpenter 10/06 - /// - /// Allow customization of the title when the scale is very large - /// Subscribe to this event to handle custom formatting of the scale axis label. - /// - public event ScaleTitleEventHandler ScaleTitleEvent; - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default size for the gap between multiple axes - /// ( property). Units are in points (1/72 inch). - /// - public static float AxisGap = 5; - - /// - /// The default setting for the gap between the scale labels and the axis title. - /// - public static float TitleGap = 0.0f; - - /// - /// The default font family for the text - /// font specification - /// ( property). - /// - public static string TitleFontFamily = "Arial"; - /// - /// The default font size for the text - /// font specification - /// ( property). Units are - /// in points (1/72 inch). - /// - public static float TitleFontSize = 14; - /// - /// The default font color for the text - /// font specification - /// ( property). - /// - public static Color TitleFontColor = Color.Black; - /// - /// The default font bold mode for the text - /// font specification - /// ( property). true - /// for a bold typeface, false otherwise. - /// - public static bool TitleFontBold = true; - /// - /// The default font italic mode for the text - /// font specification - /// ( property). true - /// for an italic typeface, false otherwise. - /// - public static bool TitleFontItalic = false; - /// - /// The default font underline mode for the text - /// font specification - /// ( property). true - /// for an underlined typeface, false otherwise. - /// - public static bool TitleFontUnderline = false; - /// - /// The default color for filling in the text background - /// (see property). - /// - public static Color TitleFillColor = Color.White; - /// - /// The default custom brush for filling in the text background - /// (see property). - /// - public static Brush TitleFillBrush = null; - /// - /// The default fill mode for filling in the text background - /// (see property). - /// - public static FillType TitleFillType = FillType.None; - - /// - /// The default color for the itself - /// ( property). This color only affects the - /// the axis border. - /// - public static Color BorderColor = Color.Black; - /// - /// The default value for , which determines - /// whether or not the scale segment itself is visible - /// - public static bool IsAxisSegmentVisible = true; - - /// - /// The default setting for the scale axis type - /// ( property). This value is set as per - /// the enumeration - /// - public static AxisType Type = AxisType.Linear; - - /// - /// The default color for the axis segment. - /// - public static Color Color = Color.Black; - - /// - /// The default setting for the axis space allocation. This term, expressed in - /// points (1/72 inch) and scaled according to for the - /// , determines the minimum amount of space an axis must - /// have between the and the - /// . This minimum space - /// applies whether is true or false. - /// - public static float MinSpace = 0f; - } - - #endregion - - #region Constructors - - /// - /// Default constructor for that sets all axis properties - /// to default values as defined in the class. - /// - public Axis() - { - _scale = new LinearScale( this ); - - _cross = 0.0; - - _crossAuto = true; - - _majorTic = new MajorTic(); - _minorTic = new MinorTic(); - - _majorGrid = new MajorGrid(); - _minorGrid = new MinorGrid(); - - _axisGap = Default.AxisGap; - - _minSpace = Default.MinSpace; - _isVisible = true; - - _isAxisSegmentVisible = Default.IsAxisSegmentVisible; - - _title = new AxisLabel( "", Default.TitleFontFamily, Default.TitleFontSize, - Default.TitleFontColor, Default.TitleFontBold, - Default.TitleFontUnderline, Default.TitleFontItalic ); - _title.FontSpec.Fill = new Fill( Default.TitleFillColor, Default.TitleFillBrush, - Default.TitleFillType ); - - _title.FontSpec.Border.IsVisible = false; - - - _color = Default.Color; - - } - - /// - /// Constructor for that sets all axis properties - /// to default values as defined in the class, - /// except for the . - /// - /// A string containing the axis title - public Axis( string title ) - : this() - { - _title._text = title; - } - - /// - /// The Copy Constructor. - /// - /// The Axis object from which to copy - public Axis( Axis rhs ) - { - _scale = rhs._scale.Clone( this ); - - _cross = rhs._cross; - - _crossAuto = rhs._crossAuto; - - _majorTic = rhs.MajorTic.Clone(); - _minorTic = rhs.MinorTic.Clone(); - - _majorGrid = rhs._majorGrid.Clone(); - _minorGrid = rhs._minorGrid.Clone(); - - _isVisible = rhs.IsVisible; - - _isAxisSegmentVisible = rhs._isAxisSegmentVisible; - - _title = (AxisLabel) rhs.Title.Clone(); - - _axisGap = rhs._axisGap; - - _minSpace = rhs.MinSpace; - - _color = rhs.Color; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of Clone. - /// - /// - /// Note that this method must be called with an explicit cast to ICloneable, and - /// that it is inherently virtual. For example: - /// - /// ParentClass foo = new ChildClass(); - /// ChildClass bar = (ChildClass) ((ICloneable)foo).Clone(); - /// - /// Assume that ChildClass is inherited from ParentClass. Even though foo is declared with - /// ParentClass, it is actually an instance of ChildClass. Calling the ICloneable implementation - /// of Clone() on foo actually calls ChildClass.Clone() as if it were a virtual function. - /// - /// A deep copy of this object - object ICloneable.Clone() - { - throw new NotImplementedException( "Can't clone an abstract base type -- child types must implement ICloneable" ); - //return new PaneBase( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Axis( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _cross = info.GetDouble( "cross" ); - _crossAuto = info.GetBoolean( "crossAuto" ); - - _majorTic = (MajorTic)info.GetValue( "MajorTic", typeof( MajorTic ) ); - _minorTic = (MinorTic)info.GetValue( "MinorTic", typeof( MinorTic ) ); - _majorGrid = (MajorGrid)info.GetValue( "majorGrid", typeof( MajorGrid ) ); - _minorGrid = (MinorGrid)info.GetValue( "minorGrid", typeof( MinorGrid ) ); - - _isVisible = info.GetBoolean( "isVisible" ); - - _title = (AxisLabel) info.GetValue( "title", typeof( AxisLabel ) ); - - _minSpace = info.GetSingle( "minSpace" ); - - _color = (Color)info.GetValue( "color", typeof( Color ) ); - - _isAxisSegmentVisible = info.GetBoolean( "isAxisSegmentVisible" ); - - - _axisGap = info.GetSingle( "axisGap" ); - - _scale = (Scale)info.GetValue( "scale", typeof( Scale ) ); - _scale._ownerAxis = this; - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - - info.AddValue( "cross", _cross ); - info.AddValue( "crossAuto", _crossAuto ); - - info.AddValue( "MajorTic", MajorTic ); - info.AddValue( "MinorTic", MinorTic ); - info.AddValue( "majorGrid", _majorGrid ); - info.AddValue( "minorGrid", _minorGrid ); - - info.AddValue( "isVisible", _isVisible ); - - info.AddValue( "title", _title ); - - info.AddValue( "minSpace", _minSpace ); - - info.AddValue( "color", _color ); - - info.AddValue( "isAxisSegmentVisible", _isAxisSegmentVisible ); - - info.AddValue( "axisGap", _axisGap ); - - info.AddValue( "scale", _scale ); - - } - - #endregion - - #region Scale Properties - - /// - /// Gets the instance associated with this . - /// - public Scale Scale - { - get { return _scale; } - } - /// - /// Gets or sets the scale value at which this axis should cross the "other" axis. - /// - /// This property allows the axis to be shifted away from its default location. - /// For example, for a graph with an X range from -100 to +100, the Y Axis can be located - /// at the X=0 value rather than the left edge of the ChartRect. This value can be set - /// automatically based on the state of . If - /// this value is set manually, then will - /// also be set to false. The "other" axis is the axis the handles the second dimension - /// for the graph. For the XAxis, the "other" axis is the YAxis. For the YAxis or - /// Y2Axis, the "other" axis is the XAxis. - /// - /// The value is defined in user scale units - /// - /// - /// - /// - public double Cross - { - get { return _cross; } - set { _cross = value; _crossAuto = false; } - } - /// - /// Gets or sets a value that determines whether or not the value - /// is set automatically. - /// - /// Set to true to have ZedGraph put the axis in the default location, or false - /// to specify the axis location manually with a value. - /// - /// - /// - /// - public bool CrossAuto - { - get { return _crossAuto; } - set { _crossAuto = value; } - } - - /// - /// Gets or sets the minimum axis space allocation. - /// - /// - /// This term, expressed in - /// points (1/72 inch) and scaled according to - /// for the , determines the minimum amount of space - /// an axis must have between the Chart.Rect and the - /// GraphPane.Rect. This minimum space - /// applies whether is true or false. - /// - public float MinSpace - { - get { return _minSpace; } - set { _minSpace = value; } - } - - #endregion - - #region Tic Properties - - /// - /// The color to use for drawing this . - /// - /// - /// This affects only the axis segment (see ), - /// since the , - /// , , , - /// , and - /// all have their own color specification. - /// - /// The color is defined using the - /// class - /// . - /// - public Color Color - { - get { return _color; } - set { _color = value; } - } - - /// - /// Gets a reference to the class instance - /// for this . This class stores all the major tic settings. - /// - public MajorTic MajorTic - { - get { return _majorTic; } - } - /// - /// Gets a reference to the class instance - /// for this . This class stores all the minor tic settings. - /// - public MinorTic MinorTic - { - get { return _minorTic; } - } - - #endregion - - #region Grid Properties - - /// - /// Gets a reference to the class that contains the properties - /// of the major grid. - /// - public MajorGrid MajorGrid - { - get { return _majorGrid; } - } - - /// - /// Gets a reference to the class that contains the properties - /// of the minor grid. - /// - public MinorGrid MinorGrid - { - get { return _minorGrid; } - } - - - #endregion - - #region Type Properties - - /// - /// This property determines whether or not the is shown. - /// - /// - /// Note that even if - /// the axis is not visible, it can still be actively used to draw curves on a - /// graph, it will just be invisible to the user - /// - /// true to show the axis, false to disable all drawing of this axis - /// . - /// . - /// . - /// . - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - - /// - /// Gets or sets a property that determines whether or not the axis segment (the line that - /// represents the axis itself) is drawn. - /// - /// - /// Under normal circumstances, this value won't affect the appearance of the display because - /// the Axis segment is overlain by the Axis border (see ). - /// However, when the border is not visible, or when is set to - /// false, this value will make a difference. - /// - public bool IsAxisSegmentVisible - { - get { return _isAxisSegmentVisible; } - set { _isAxisSegmentVisible = value; } - } - - /// - /// Gets or sets the for this . - /// - /// - /// The type can be either , - /// , , - /// or . - /// - /// - /// - /// - /// - /// - public AxisType Type - { - get { return _scale.Type; } - set { _scale = Scale.MakeNewScale( _scale, value ); } - } - - #endregion - - #region Label Properties - - /// - /// Gets or sets the class that contains the title of this - /// . - /// - /// The title normally shows the basis and dimensions of - /// the scale range, such as "Time (Years)". The title is only shown if the - /// property is set to true. If the Title text is empty, - /// then no title is shown, and no space is "reserved" for the title on the graph. - /// - /// the title is a string value - /// - public AxisLabel Title - { - get { return _title; } - set { _title = value; } - } - - /// - /// The size of the gap between multiple axes (see and - /// ). - /// - /// - /// This size will be scaled - /// according to the for the - /// - /// - /// The axis gap is measured in points (1/72 inch) - /// . - public float AxisGap - { - get { return _axisGap; } - set { _axisGap = value; } - } - - #endregion - - #region Rendering Methods - - /// - /// Restore the scale ranging to automatic mode, and recalculate the - /// scale ranges - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// - /// - /// - /// - public void ResetAutoScale( GraphPane pane, Graphics g ) - { - _scale._minAuto = true; - _scale._maxAuto = true; - _scale._majorStepAuto = true; - _scale._minorStepAuto = true; - _crossAuto = true; - _scale._magAuto = true; - //this.numDecAuto = true; - _scale._formatAuto = true; - pane.AxisChange( g ); - } - - /// - /// Do all rendering associated with this to the specified - /// device. - /// - /// - /// This method is normally only - /// called by the Draw method of the parent object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// The number of pixels to shift to account for non-primary axis position (e.g., - /// the second, third, fourth, etc. or . - /// - public void Draw( Graphics g, GraphPane pane, float scaleFactor, float shiftPos ) - { - Matrix saveMatrix = g.Transform; - - _scale.SetupScaleData( pane, this ); - - if ( _isVisible ) - { - SetTransformMatrix( g, pane, scaleFactor ); - - shiftPos = CalcTotalShift( pane, scaleFactor, shiftPos ); - - _scale.Draw( g, pane, scaleFactor, shiftPos ); - - //DrawTitle( g, pane, scaleFactor ); - - g.Transform = saveMatrix; - } - } - - internal void DrawGrid( Graphics g, GraphPane pane, float scaleFactor, float shiftPos ) - { - if ( _isVisible ) - { - Matrix saveMatrix = g.Transform; - SetTransformMatrix( g, pane, scaleFactor ); - - double baseVal = _scale.CalcBaseTic(); - float topPix, rightPix; - _scale.GetTopRightPix( pane, out topPix, out rightPix ); - - shiftPos = CalcTotalShift( pane, scaleFactor, shiftPos ); - - _scale.DrawGrid( g, pane, baseVal, topPix, scaleFactor ); - - DrawMinorTics( g, pane, baseVal, shiftPos, scaleFactor, topPix ); - - g.Transform = saveMatrix; - } - } - - /// - /// This method will set the property for this - /// using the currently required space multiplied by a fraction (bufferFraction). - /// - /// - /// The currently required space is calculated using , and is - /// based on current data ranges, font sizes, etc. The "space" is actually the amount of space - /// required to fit the tic marks, scale labels, and axis title. - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// A reference to the object that is the parent or - /// owner of this object. - /// The amount of space to allocate for the axis, expressed - /// as a fraction of the currently required space. For example, a value of 1.2 would - /// allow for 20% extra above the currently required space. - /// If true, then this method will only modify the - /// property if the calculated result is more than the current value. - public void SetMinSpaceBuffer( Graphics g, GraphPane pane, float bufferFraction, - bool isGrowOnly ) - { - // save the original value of minSpace - float oldSpace = this.MinSpace; - // set minspace to zero, since we don't want it to affect the CalcSpace() result - this.MinSpace = 0; - // Calculate the space required for the current graph assuming scalefactor = 1.0 - // and apply the bufferFraction - float fixedSpace; - float space = this.CalcSpace( g, pane, 1.0F, out fixedSpace ) * bufferFraction; - // isGrowOnly indicates the minSpace can grow but not shrink - if ( isGrowOnly ) - space = Math.Max( oldSpace, space ); - // Set the minSpace - this.MinSpace = space; - } - - /// - /// Setup the Transform Matrix to handle drawing of this - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - abstract public void SetTransformMatrix( Graphics g, GraphPane pane, float scaleFactor ); - - - /// - /// Calculate the "shift" size, in pixels, in order to shift the axis from its default - /// location to the value specified by . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The shift amount measured in pixels - abstract internal float CalcCrossShift( GraphPane pane ); - - /// - /// Gets the "Cross" axis that corresponds to this axis. - /// - /// - /// The cross axis is the axis which determines the of this Axis when the - /// Axis.Cross property is used. The - /// cross axis for any or - /// is always the primary , and - /// the cross axis for any or is - /// always the primary . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - abstract public Axis GetCrossAxis( GraphPane pane ); - -// abstract internal float GetMinPix( GraphPane pane ); - - //abstract internal float CalcCrossFraction( GraphPane pane ); - - /// - /// Returns the linearized actual cross position for this axis, reflecting the settings of - /// , , and . - /// - /// - /// If the value of lies outside the axis range, it is - /// limited to the axis range. - /// - internal double EffectiveCrossValue( GraphPane pane ) - { - Axis crossAxis = GetCrossAxis( pane ); - - // Use Linearize here instead of _minLinTemp because this method is called - // as part of CalcRect() before scale is fully setup - double min = crossAxis._scale.Linearize( crossAxis._scale._min ); - double max = crossAxis._scale.Linearize( crossAxis._scale._max ); - - if ( _crossAuto ) - { - if ( crossAxis._scale.IsReverse == ( this is Y2Axis || this is X2Axis ) ) - return max; - else - return min; - } - else if ( _cross < min ) - return min; - else if ( _cross > max ) - return max; - else - return _scale.Linearize( _cross ); - } - - /// - /// Returns true if the axis is shifted at all due to the setting of - /// . This function will always return false if - /// is true. - /// - internal bool IsCrossShifted( GraphPane pane ) - { - if ( _crossAuto ) - return false; - else - { - Axis crossAxis = GetCrossAxis( pane ); - if ( ( ( this is XAxis || this is YAxis ) && !crossAxis._scale.IsReverse ) || - ( ( this is X2Axis || this is Y2Axis ) && crossAxis._scale.IsReverse ) ) - { - if ( _cross <= crossAxis._scale._min ) - return false; - } - else - { - if ( _cross >= crossAxis._scale._max ) - return false; - } - } - - return true; - } - - /// - /// Calculates the proportional fraction of the total cross axis width at which - /// this axis is located. - /// - /// - /// - internal float CalcCrossFraction( GraphPane pane ) - { - // if this axis is not shifted due to the Cross value - if ( !this.IsCrossShifted( pane ) ) - { - // if it's the primary axis and the scale labels are on the inside, then we - // don't need to save any room for the axis labels (they will be inside the chart rect) - if ( IsPrimary( pane ) && _scale._isLabelsInside ) - return 1.0f; - // otherwise, it's a secondary (outboard) axis and we always save room for the axis and labels. - else - return 0.0f; - } - - double effCross = EffectiveCrossValue( pane ); - Axis crossAxis = GetCrossAxis( pane ); - - // Use Linearize here instead of _minLinTemp because this method is called - // as part of CalcRect() before scale is fully setup - // double max = crossAxis._scale._maxLinTemp; - // double min = crossAxis._scale._minLinTemp; - double max = crossAxis._scale.Linearize( crossAxis._scale._min ); - double min = crossAxis._scale.Linearize( crossAxis._scale._max ); - float frac; - - if ( ( ( this is XAxis || this is YAxis ) && _scale._isLabelsInside == crossAxis._scale.IsReverse ) || - ( ( this is X2Axis || this is Y2Axis ) && _scale._isLabelsInside != crossAxis._scale.IsReverse ) ) - frac = (float)( ( effCross - min ) / ( max - min ) ); - else - frac = (float)( ( max - effCross ) / ( max - min ) ); - - if ( frac < 0.0f ) - frac = 0.0f; - if ( frac > 1.0f ) - frac = 1.0f; - - return frac; - } - - private float CalcTotalShift( GraphPane pane, float scaleFactor, float shiftPos ) - { - if ( !IsPrimary( pane ) ) - { - // if ( CalcCrossFraction( pane ) != 0.0 ) - if ( IsCrossShifted( pane ) ) - { - shiftPos = 0; - } - else - { - // Scaled size (pixels) of a tic - float ticSize = _majorTic.ScaledTic( scaleFactor ); - - // if the scalelabels are on the inside, shift everything so the axis is drawn, - // for example, to the left side of the available space for a YAxis type - if ( _scale._isLabelsInside ) - { - shiftPos += _tmpSpace; - - // shift the axis to leave room for the outside tics - if ( _majorTic.IsOutside || _majorTic._isCrossOutside || - _minorTic.IsOutside || _minorTic._isCrossOutside ) - shiftPos -= ticSize; - } - else - { - // if it's not the primary axis, add a tic space for the spacing between axes - shiftPos += _axisGap * scaleFactor; - - // if it has inside tics, leave another tic space - if ( _majorTic.IsInside || _majorTic._isCrossInside || - _minorTic.IsInside || _minorTic._isCrossInside ) - shiftPos += ticSize; - } - } - } - - // shift is the position of the actual axis line itself - // everything else is based on that position. - float crossShift = CalcCrossShift( pane ); - shiftPos += crossShift; - - return shiftPos; - } - - /// - /// Calculate the space required (pixels) for this object. - /// - /// - /// This is the total space (vertical space for the X axis, horizontal space for - /// the Y axes) required to contain the axis. If is zero, then - /// this space will be the space required between the and - /// the . This method sets the internal values of - /// for use by the - /// method. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The amount of space (pixels) at the edge of the ChartRect - /// that is always required for this axis, even if the axis is shifted by the - /// value. - /// Returns the space, in pixels, required for this axis (between the - /// rect and ChartRect) - public float CalcSpace( Graphics g, GraphPane pane, float scaleFactor, out float fixedSpace ) - { - //fixedSpace = 0; - - //Typical character height for the scale font - float charHeight = _scale._fontSpec.GetHeight( scaleFactor ); - // Scaled size (pixels) of a tic - float ticSize = _majorTic.ScaledTic( scaleFactor ); - // Scaled size (pixels) of the axis gap - float axisGap = _axisGap * scaleFactor; - float scaledLabelGap = _scale._labelGap * charHeight; - float scaledTitleGap = _title.GetScaledGap( scaleFactor ); - - // The minimum amount of space to reserve for the NORMAL position of the axis. This would - // be the left side of the chart rect for the Y axis, the right side for the Y2 axis, etc. - // This amount of space is based on the need to reserve space for tics, etc., even if the - // Axis.Cross property causes the axis to be in a different location. - fixedSpace = 0; - - // The actual space needed for this axis (ignoring the setting of Axis.Cross) - _tmpSpace = 0; - - // Account for the Axis - if ( _isVisible ) - { - bool hasTic = this.MajorTic.IsOutside || this.MajorTic._isCrossOutside || - this.MinorTic.IsOutside || this.MinorTic._isCrossOutside; - - // account for the tic space. Leave the tic space for any type of outside tic (Outside Tic Space) - if ( hasTic ) - _tmpSpace += ticSize; - - // if this is not the primary axis - if ( !IsPrimary( pane ) ) - { - // always leave an extra tic space for the space between the multi-axes (Axis Gap) - _tmpSpace += axisGap; - - // if it has inside tics, leave another tic space (Inside Tic Space) - if ( this.MajorTic._isInside || this.MajorTic._isCrossInside || - this.MinorTic._isInside || this.MinorTic._isCrossInside ) - _tmpSpace += ticSize; - } - - // tic takes up 1x tic - // space between tic and scale label is 0.5 tic - // scale label is GetScaleMaxSpace() - // space between scale label and axis label is 0.5 tic - - // account for the tic labels + 'LabelGap' tic gap between the tic and the label - _tmpSpace += _scale.GetScaleMaxSpace( g, pane, scaleFactor, true ).Height + - scaledLabelGap; - - string str = MakeTitle(); - - // Only add space for the title if there is one - // Axis Title gets actual height - // if ( str.Length > 0 && _title._isVisible ) - if ( !string.IsNullOrEmpty( str ) && _title._isVisible ) - { - //tmpSpace += this.TitleFontSpec.BoundingBox( g, str, scaleFactor ).Height; - fixedSpace = this.Title.FontSpec.BoundingBox( g, str, scaleFactor ).Height + - scaledTitleGap; - _tmpSpace += fixedSpace; - - fixedSpace += scaledTitleGap; - } - - if ( hasTic ) - fixedSpace += ticSize; - } - - // for the Y axes, make sure that enough space is left to fit the first - // and last X axis scale label - if ( this.IsPrimary( pane ) && ( ( - ( this is YAxis && ( - ( !pane.XAxis._scale._isSkipFirstLabel && !pane.XAxis._scale._isReverse ) || - ( !pane.XAxis._scale._isSkipLastLabel && pane.XAxis._scale._isReverse ) ) ) || - ( this is Y2Axis && ( - ( !pane.XAxis._scale._isSkipFirstLabel && pane.XAxis._scale._isReverse ) || - ( !pane.XAxis._scale._isSkipLastLabel && !pane.XAxis._scale._isReverse ) ) ) ) && - pane.XAxis.IsVisible && pane.XAxis._scale._isVisible ) ) - { - // half the width of the widest item, plus a gap of 1/2 the charheight - float tmp = pane.XAxis._scale.GetScaleMaxSpace( g, pane, scaleFactor, true ).Width / 2.0F; - //+ charHeight / 2.0F; - //if ( tmp > tmpSpace ) - // tmpSpace = tmp; - - fixedSpace = Math.Max( tmp, fixedSpace ); - } - - // Verify that the minSpace property was satisfied - _tmpSpace = Math.Max( _tmpSpace, _minSpace * (float)scaleFactor ); - - fixedSpace = Math.Max( fixedSpace, _minSpace * (float)scaleFactor ); - - return _tmpSpace; - } - - /// - /// Determines if this object is a "primary" one. - /// - /// - /// The primary axes are the (always), the first - /// in the - /// ( = 0), and the first - /// in the - /// ( = 0). Note that - /// and - /// always reference the primary axes. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// true for a primary (for the , - /// this is always true), false otherwise - abstract internal bool IsPrimary( GraphPane pane ); - - internal void FixZeroLine( Graphics g, GraphPane pane, float scaleFactor, - float left, float right ) - { - // restore the zero line if needed (since the fill tends to cover it up) - if ( _isVisible && _majorGrid._isZeroLine && - _scale._min < 0.0 && _scale._max > 0.0 ) - { - float zeroPix = _scale.Transform( 0.0 ); - - using ( Pen zeroPen = new Pen( _color, - pane.ScaledPenWidth( _majorGrid._penWidth, scaleFactor ) ) ) - { - g.DrawLine( zeroPen, left, zeroPix, right, zeroPix ); - //zeroPen.Dispose(); - } - } - } - - /// - /// Draw the minor tic marks as required for this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scale value for the first major tic position. This is the reference point - /// for all other tic marks. - /// - /// The number of pixels to shift this axis, based on the - /// value of . A positive value is into the ChartRect relative to - /// the default axis position. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// The pixel location of the far side of the ChartRect from this axis. - /// This value is the ChartRect.Height for the XAxis, or the ChartRect.Width - /// for the YAxis and Y2Axis. - /// - public void DrawMinorTics( Graphics g, GraphPane pane, double baseVal, float shift, - float scaleFactor, float topPix ) - { - if ( ( this.MinorTic.IsOutside || this.MinorTic.IsOpposite || this.MinorTic.IsInside || - this.MinorTic._isCrossOutside || this.MinorTic._isCrossInside || _minorGrid._isVisible ) - && _isVisible ) - { - double tMajor = _scale._majorStep * _scale.MajorUnitMultiplier, - tMinor = _scale._minorStep * _scale.MinorUnitMultiplier; - - if ( _scale.IsLog || tMinor < tMajor ) - { - float minorScaledTic = this.MinorTic.ScaledTic( scaleFactor ); - - // Minor tics start at the minimum value and step all the way thru - // the full scale. This means that if the minor step size is not - // an even division of the major step size, the minor tics won't - // line up with all of the scale labels and major tics. - double first = _scale._minLinTemp, - last = _scale._maxLinTemp; - - double dVal = first; - float pixVal; - - int iTic = _scale.CalcMinorStart( baseVal ); - int MajorTic = 0; - double majorVal = _scale.CalcMajorTicValue( baseVal, MajorTic ); - - using ( Pen pen = new Pen( _minorTic._color, - pane.ScaledPenWidth( MinorTic._penWidth, scaleFactor ) ) ) - using ( Pen minorGridPen = _minorGrid.GetPen( pane, scaleFactor ) ) - { - - // Draw the minor tic marks - while ( dVal < last && iTic < 5000 ) - { - // Calculate the scale value for the current tic - dVal = _scale.CalcMinorTicValue( baseVal, iTic ); - // Maintain a value for the current major tic - if ( dVal > majorVal ) - majorVal = _scale.CalcMajorTicValue( baseVal, ++MajorTic ); - - // Make sure that the current value does not match up with a major tic - if ( ( ( Math.Abs( dVal ) < 1e-20 && Math.Abs( dVal - majorVal ) > 1e-20 ) || - ( Math.Abs( dVal ) > 1e-20 && Math.Abs( ( dVal - majorVal ) / dVal ) > 1e-10 ) ) && - ( dVal >= first && dVal <= last ) ) - { - pixVal = _scale.LocalTransform( dVal ); - - _minorGrid.Draw( g, minorGridPen, pixVal, topPix ); - - _minorTic.Draw( g, pane, pen, pixVal, topPix, shift, minorScaledTic ); - } - - iTic++; - } - } - } - } - } - - /// - /// Draw the title for this . - /// - /// On entry, it is assumed that the - /// graphics transform has been configured so that the origin is at the left side - /// of this axis, and the axis is aligned along the X coordinate direction. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The number of pixels to shift this axis, based on the - /// value of . A positive value is into the ChartRect relative to - /// the default axis position. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void DrawTitle( Graphics g, GraphPane pane, float shiftPos, float scaleFactor ) - { - string str = MakeTitle(); - - // If the Axis is visible, draw the title - //if ( _isVisible && _title._isVisible && str.Length > 0 ) - if ( _isVisible && _title._isVisible && !string.IsNullOrEmpty( str ) ) - { - bool hasTic = ( _scale._isLabelsInside ? - ( this.MajorTic.IsInside || this.MajorTic._isCrossInside || - this.MinorTic.IsInside || this.MinorTic._isCrossInside ) : - ( this.MajorTic.IsOutside || this.MajorTic._isCrossOutside || this.MinorTic.IsOutside || this.MinorTic._isCrossOutside ) ); - - // Calculate the title position in screen coordinates - float x = ( _scale._maxPix - _scale._minPix ) / 2; - - float scaledTic = MajorTic.ScaledTic( scaleFactor ); - float scaledLabelGap = _scale._fontSpec.GetHeight( scaleFactor ) * _scale._labelGap; - float scaledTitleGap = _title.GetScaledGap( scaleFactor ); - - // The space for the scale labels is only reserved if the axis is not shifted due to the - // cross value. Note that this could be a problem if the axis is only shifted slightly, - // since the scale value labels may overlap the axis title. However, it's not possible to - // calculate that actual shift amount at this point, because the ChartRect rect has not yet been - // calculated, and the cross value is determined using a transform of scale values (which - // rely on ChartRect). - - float gap = scaledTic * ( hasTic ? 1.0f : 0.0f ) + - this.Title.FontSpec.BoundingBox( g, str, scaleFactor ).Height / 2.0F; - float y = ( _scale._isVisible ? _scale.GetScaleMaxSpace( g, pane, scaleFactor, true ).Height - + scaledLabelGap : 0 ); - - if ( _scale._isLabelsInside ) - y = shiftPos - y - gap; - else - y = shiftPos + y + gap; - - if ( !_crossAuto && !_title._isTitleAtCross ) - y = Math.Max( y, gap ); - - AlignV alignV = AlignV.Center; - - // Add in the TitleGap space - y += scaledTitleGap; - - // Draw the title - this.Title.FontSpec.Draw( g, pane, str, x, y, - AlignH.Center, alignV, scaleFactor ); - } - } - - private string MakeTitle() - { - if ( _title._text == null ) - _title._text = ""; - - // Revision: JCarpenter 10/06 - // Allow customization of the modified title when the scale is very large - // The event handler can edit the full label. If the handler returns - // null, then the title will be the default. - if ( ScaleTitleEvent != null ) - { - string label = ScaleTitleEvent( this ); - if ( label != null ) - return label; - } - - // If the Mag is non-zero and IsOmitMag == false, and IsLog == false, - // then add the mag indicator to the title. - if ( _scale._mag != 0 && !_title._isOmitMag && !_scale.IsLog ) - return _title._text + String.Format( " (10^{0})", _scale._mag ); - else - return _title._text; - - } - - /// - /// Make a value label for the axis at the specified ordinal position. - /// - /// - /// This method properly accounts for , - /// , - /// and other axis format settings. It also implements the ScaleFormatEvent such that - /// custom labels can be created. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log - /// () - /// and text () type axes. - /// - /// The resulting value label as a - internal string MakeLabelEventWorks( GraphPane pane, int index, double dVal ) - { - // if there is a valid ScaleFormatEvent, then try to use it to create the label - // the label will be non-null if it's to be used - if ( this.ScaleFormatEvent != null ) - { - string label; - - label = this.ScaleFormatEvent( pane, this, dVal, index ); - if ( label != null ) - return label; - } - - // second try. If there's no custom ScaleFormatEvent, then just call - // _scale.MakeLabel according to the type of scale - if ( this.Scale != null ) - return _scale.MakeLabel( pane, index, dVal ); - else - return "?"; - } - - #endregion - - } -} - diff --git a/SDK/ZedGraphs/ZedGraph/AxisLabel.cs b/SDK/ZedGraphs/ZedGraph/AxisLabel.cs deleted file mode 100644 index e2026d0..0000000 --- a/SDK/ZedGraphs/ZedGraph/AxisLabel.cs +++ /dev/null @@ -1,180 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that handles the data associated with text title and its associated font - /// properties. Inherits from , and adds - /// and properties, which are specifically associated with - /// the . - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class AxisLabel : GapLabel, ICloneable, ISerializable - { - internal bool _isOmitMag, - _isTitleAtCross; - - #region Constructors - - /// - /// Constructor to build an from the text and the - /// associated font properties. - /// - /// The representing the text to be - /// displayed - /// The font family name - /// The size of the font in points and scaled according - /// to the logic. - /// The instance representing the color - /// of the font - /// true for a bold font face - /// true for an italic font face - /// true for an underline font face - public AxisLabel( string text, string fontFamily, float fontSize, Color color, bool isBold, - bool isItalic, bool isUnderline ) : - base( text, fontFamily, fontSize, color, isBold, isItalic, isUnderline ) - { - _isOmitMag = false; - _isTitleAtCross = true; - } - - /// - /// Copy constructor - /// - /// the instance to be copied. - public AxisLabel( AxisLabel rhs ) - : base( rhs ) - { - _isOmitMag = rhs._isOmitMag; - _isTitleAtCross = rhs._isTitleAtCross; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new AxisLabel Clone() - { - return new AxisLabel( this ); - } - - #endregion - - #region Properties - - /// - /// Gets or sets the property that controls whether or not the magnitude factor (power of 10) for - /// this scale will be included in the label. - /// - /// - /// For large scale values, a "magnitude" value (power of 10) is automatically - /// used for scaling the graph. This magnitude value is automatically appended - /// to the end of the Axis (e.g., "(10^4)") to indicate - /// that a magnitude is in use. This property controls whether or not the - /// magnitude is included in the title. Note that it only affects the axis - /// title; a magnitude value may still be used even if it is not shown in the title. - /// - /// true to show the magnitude value, false to hide it - /// - /// - /// - public bool IsOmitMag - { - get { return _isOmitMag; } - set { _isOmitMag = value; } - } - - /// - /// Gets or sets a value that determines whether the Axis title is located at the - /// - /// value or at the normal position (outside the ). - /// - /// - /// This value only applies if is false. - /// - public bool IsTitleAtCross - { - get { return _isTitleAtCross; } - set { _isTitleAtCross = value; } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected AxisLabel( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch2 = info.GetInt32( "schema3" ); - - _isOmitMag = info.GetBoolean( "isOmitMag" ); - _isTitleAtCross = info.GetBoolean( "isTitleAtCross" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema3", schema2 ); - info.AddValue( "isOmitMag", _isVisible ); - info.AddValue( "isTitleAtCross", _isTitleAtCross ); - } - #endregion - - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Bar.cs b/SDK/ZedGraphs/ZedGraph/Bar.cs deleted file mode 100644 index e9746e7..0000000 --- a/SDK/ZedGraphs/ZedGraph/Bar.cs +++ /dev/null @@ -1,523 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class representing all the characteristics of the bar - /// segments that make up a curve on the graph. - /// - /// - /// John Champion - /// $Revision: 3.30 $ $Date: 2007-11-03 04:41:28 $ - [Serializable] - public class Bar : ICloneable, ISerializable - { - #region Fields - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Fill _fill; - /// - /// Private field that stores the class that defines the - /// properties of the border around this . Use the public - /// property to access this value. - /// - private Border _border; - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - // Default Bar properties - /// - /// The default pen width to be used for drawing the border around the bars - /// ( property). Units are points. - /// - public static float BorderWidth = 1.0F; - /// - /// The default fill mode for bars ( property). - /// - public static FillType FillType = FillType.Brush; - /// - /// The default border mode for bars ( property). - /// true to display frames around bars, false otherwise - /// - public static bool IsBorderVisible = true; - /// - /// The default color for drawing frames around bars - /// ( property). - /// - public static Color BorderColor = Color.Black; - /// - /// The default color for filling in the bars - /// ( property). - /// - public static Color FillColor = Color.Red; - /// - /// The default custom brush for filling in the bars - /// ( property). - /// - public static Brush FillBrush = null; //new LinearGradientBrush( new Rectangle(0,0,100,100), - // Color.White, Color.Red, 0F ); - } - #endregion - - #region Constructors - /// - /// Default constructor that sets all properties to default - /// values as defined in the class. - /// - public Bar() : this( Color.Empty ) - { - } - - /// - /// Default constructor that sets the - /// as specified, and the remaining - /// properties to default - /// values as defined in the class. - /// The specified color is only applied to the - /// , and the - /// will be defaulted. - /// - /// A value indicating - /// the - /// of the Bar. - /// - public Bar( Color color ) - { - _border = new Border( Default.IsBorderVisible, Default.BorderColor, Default.BorderWidth ); - _fill = new Fill( color.IsEmpty ? Default.FillColor : color, - Default.FillBrush, Default.FillType ); - } - - /// - /// The Copy Constructor - /// - /// The Bar object from which to copy - public Bar( Bar rhs ) - { - _border = (Border) rhs.Border.Clone(); - _fill = (Fill) rhs.Fill.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Bar Clone() - { - return new Bar( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Bar( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _fill = (Fill) info.GetValue( "fill", typeof(Fill) ); - _border = (Border) info.GetValue( "border", typeof(Border) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - } - #endregion - - #region Properties - /// - /// The object used to draw the border around the . - /// - /// - /// - /// - public Border Border - { - get { return _border; } - set { _border = value; } - } - /// - /// Gets or sets the data for this - /// . - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - #endregion - - #region Rendering Methods - - /// - /// Draw the to the specified device - /// at the specified location. This routine draws a single bar. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The x position of the left side of the bar in - /// pixel units - /// The x position of the right side of the bar in - /// pixel units - /// The y position of the top of the bar in - /// pixel units - /// The y position of the bottom of the bar in - /// pixel units - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - /// true to draw the bottom portion of the border around the - /// bar (this is for legend entries) - /// The data value to be used for a value-based - /// color gradient. This is only applicable for , - /// or . - /// Indicates that the should be drawn - /// with attributes from the class. - /// - public void Draw( Graphics g, GraphPane pane, float left, float right, float top, - float bottom, float scaleFactor, bool fullFrame, bool isSelected, - PointPair dataValue ) - { - // Do a sanity check to make sure the top < bottom. If not, reverse them - if ( top > bottom ) - { - float junk = top; - top = bottom; - bottom = junk; - } - - // Do a sanity check to make sure the left < right. If not, reverse them - if ( left > right ) - { - float junk = right; - right = left; - left = junk; - } - - if ( top < -10000 ) - top = -10000; - else if ( top > 10000 ) - top = 10000; - if ( left < -10000 ) - left = -10000; - else if ( left > 10000 ) - left = 10000; - if ( right < -10000 ) - right = -10000; - else if ( right > 10000 ) - right = 10000; - if ( bottom < -10000 ) - bottom = -10000; - else if ( bottom > 10000 ) - bottom = 10000; - - // Make a rectangle for the bar and draw it - RectangleF rect = new RectangleF( left, top, right - left, bottom - top ); - - Draw( g, pane, rect, scaleFactor, fullFrame, isSelected, dataValue ); - } - - /// - /// Draw the to the specified device - /// at the specified location. This routine draws a single bar. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The rectangle (pixels) to contain the bar - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - /// true to draw the bottom portion of the border around the - /// bar (this is for legend entries) - /// The data value to be used for a value-based - /// color gradient. This is only applicable for , - /// or . - /// Indicates that the should be drawn - /// with attributes from the class. - /// - public void Draw( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor, - bool fullFrame, bool isSelected, PointPair dataValue ) - { - if ( isSelected ) - { - Selection.Fill.Draw( g, rect, dataValue ); - Selection.Border.Draw( g, pane, scaleFactor, rect ); - } - else - { - _fill.Draw( g, rect, dataValue ); - _border.Draw( g, pane, scaleFactor, rect ); - } - } - - /// - /// Draw the this to the specified - /// device as a bar at each defined point. This method - /// is normally only called by the method of the - /// object - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A object representing the - /// 's to be drawn. - /// The class instance that defines the base (independent) - /// axis for the - /// The class instance that defines the value (dependent) - /// axis for the - /// - /// The width of each bar, in pixels. - /// - /// - /// The ordinal position of the this bar series (0=first bar, 1=second bar, etc.) - /// in the cluster of bars. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void DrawBars( Graphics g, GraphPane pane, CurveItem curve, - Axis baseAxis, Axis valueAxis, - float barWidth, int pos, float scaleFactor ) - { - // For non-cluster bar types, the position is always zero since the bars are on top - // of eachother - BarType barType = pane._barSettings.Type; - if ( barType == BarType.Overlay || barType == BarType.Stack || barType == BarType.PercentStack || - barType == BarType.SortedOverlay ) - pos = 0; - - // Loop over each defined point and draw the corresponding bar - for ( int i=0; i - /// Draw the specified single bar (an individual "point") of this series to the specified - /// device. This method is not as efficient as - /// , which draws the bars for all points. It is intended to be used - /// only for , which requires special handling of each bar. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A object representing the - /// 's to be drawn. - /// The class instance that defines the base (independent) - /// axis for the - /// The class instance that defines the value (dependent) - /// axis for the - /// - /// The ordinal position of the this bar series (0=first bar, 1=second bar, etc.) - /// in the cluster of bars. - /// - /// - /// The zero-based index number for the single bar to be drawn. - /// - /// - /// The width of each bar, in pixels. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void DrawSingleBar( Graphics g, GraphPane pane, CurveItem curve, - Axis baseAxis, Axis valueAxis, - int pos, int index, float barWidth, float scaleFactor ) - { - // Make sure that a bar value exists for the current curve and current ordinal position - if ( index >= curve.Points.Count ) - return; - - // For Overlay and Stack bars, the position is always zero since the bars are on top - // of eachother - if ( pane._barSettings.Type == BarType.Overlay || pane._barSettings.Type == BarType.Stack || - pane._barSettings.Type == BarType.PercentStack ) - pos = 0; - - // Draw the specified bar - DrawSingleBar( g, pane, curve, index, pos, baseAxis, valueAxis, barWidth, scaleFactor ); - } - - /// - /// Protected internal routine that draws the specified single bar (an individual "point") - /// of this series to the specified device. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A object representing the - /// 's to be drawn. - /// - /// The zero-based index number for the single bar to be drawn. - /// - /// - /// The ordinal position of the this bar series (0=first bar, 1=second bar, etc.) - /// in the cluster of bars. - /// - /// The class instance that defines the base (independent) - /// axis for the - /// The class instance that defines the value (dependent) - /// axis for the - /// - /// The width of each bar, in pixels. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - virtual protected void DrawSingleBar( Graphics g, GraphPane pane, - CurveItem curve, - int index, int pos, Axis baseAxis, Axis valueAxis, - float barWidth, float scaleFactor ) - { - // pixBase = pixel value for the bar center on the base axis - // pixHiVal = pixel value for the bar top on the value axis - // pixLowVal = pixel value for the bar bottom on the value axis - float pixBase, pixHiVal, pixLowVal; - - float clusterWidth = pane.BarSettings.GetClusterWidth(); - //float barWidth = curve.GetBarWidth( pane ); - float clusterGap = pane._barSettings.MinClusterGap * barWidth; - float barGap = barWidth * pane._barSettings.MinBarGap; - - // curBase = the scale value on the base axis of the current bar - // curHiVal = the scale value on the value axis of the current bar - // curLowVal = the scale value of the bottom of the bar - double curBase, curLowVal, curHiVal; - ValueHandler valueHandler = new ValueHandler( pane, false ); - valueHandler.GetValues( curve, index, out curBase, out curLowVal, out curHiVal ); - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - - if ( !curve.Points[index].IsInvalid ) - { - // calculate a pixel value for the top of the bar on value axis - pixLowVal = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, index, curLowVal ); - pixHiVal = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, index, curHiVal ); - // calculate a pixel value for the center of the bar on the base axis - pixBase = baseAxis.Scale.Transform( curve.IsOverrideOrdinal, index, curBase ); - - // Calculate the pixel location for the side of the bar (on the base axis) - float pixSide = pixBase - clusterWidth / 2.0F + clusterGap / 2.0F + - pos * ( barWidth + barGap ); - - // Draw the bar - if ( pane._barSettings.Base == BarBase.X ) - this.Draw( g, pane, pixSide, pixSide + barWidth, pixLowVal, - pixHiVal, scaleFactor, true, curve.IsSelected, - curve.Points[index] ); - else - this.Draw( g, pane, pixLowVal, pixHiVal, pixSide, pixSide + barWidth, - scaleFactor, true, curve.IsSelected, - curve.Points[index] ); - } - } - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/BarItem.cs b/SDK/ZedGraphs/ZedGraph/BarItem.cs deleted file mode 100644 index 7f7dd2f..0000000 --- a/SDK/ZedGraphs/ZedGraph/BarItem.cs +++ /dev/null @@ -1,457 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Encapsulates a bar type that displays vertical or horizontal bars - /// - /// - /// The orientation of the bars depends on the state of - /// , and the bars can be stacked or - /// clustered, depending on the state of - /// - /// John Champion - /// $Revision: 3.27 $ $Date: 2007-11-03 04:41:28 $ - [Serializable] - public class BarItem : CurveItem, ICloneable, ISerializable - { - #region Fields - /// - /// Private field that stores a reference to the - /// class defined for this . Use the public - /// property to access this value. - /// - protected Bar _bar; - #endregion - - #region Properties - /// - /// Gets a reference to the class defined - /// for this . - /// - public Bar Bar - { - get { return _bar; } - } - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return this is HiLowBarItem; - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return pane._barSettings.Base == BarBase.X || pane._barSettings.Base == BarBase.X2; - } - - #endregion - - #region Constructors - /// - /// Create a new , specifying only the legend label for the bar. - /// - /// The label that will appear in the legend. - public BarItem( string label ) : base( label ) - { - _bar = new Bar(); - } - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// An array of double precision values that define - /// the independent (X axis) values for this curve - /// An array of double precision values that define - /// the dependent (Y axis) values for this curve - /// A value that will be applied to - /// the and properties. - /// - public BarItem( string label, double[] x, double[] y, Color color ) - : this( label, new PointPairList( x, y ), color ) - { - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// A value that will be applied to - /// the and properties. - /// - public BarItem( string label, IPointList points, Color color ) - : base( label, points ) - { - _bar = new Bar( color ); - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public BarItem( BarItem rhs ) : base( rhs ) - { - //bar = new Bar( rhs.Bar ); - _bar = rhs._bar.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public BarItem Clone() - { - return new BarItem( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected BarItem( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _bar = (Bar) info.GetValue( "bar", typeof(Bar) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "bar", _bar ); - } - #endregion - - #region Methods - /// - /// Do all rendering associated with this to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The ordinal position of the current - /// curve. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, GraphPane pane, int pos, - float scaleFactor ) - { - // Pass the drawing onto the bar class - if ( _isVisible ) - _bar.DrawBars( g, pane, this, BaseAxis( pane ), ValueAxis( pane ), - this.GetBarWidth( pane ), pos, scaleFactor ); - } - - /// - /// Draw a legend key entry for this at the specified location - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The struct that specifies the - /// location for the legend key - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor ) - { - _bar.Draw( g, pane, rect, scaleFactor, true, false, null ); - } - - /// - /// Create a for each bar in the . - /// - /// - /// This method will go through the bars, create a label that corresponds to the bar value, - /// and place it on the graph depending on user preferences. This works for horizontal or - /// vertical bars in clusters or stacks, but only for types. This method - /// does not apply to or objects. - /// Call this method only after calling . - /// - /// The GraphPane in which to place the text labels. - /// true to center the labels inside the bars, false to - /// place the labels just above the top of the bar. - /// The double.ToString string format to use for creating - /// the labels. - /// - public static void CreateBarLabels( GraphPane pane, bool isBarCenter, string valueFormat ) - { - CreateBarLabels( pane, isBarCenter, valueFormat, TextObj.Default.FontFamily, - TextObj.Default.FontSize, TextObj.Default.FontColor, TextObj.Default.FontBold, - TextObj.Default.FontItalic, TextObj.Default.FontUnderline ); - } - - /// - /// Create a for each bar in the . - /// - /// - /// This method will go through the bars, create a label that corresponds to the bar value, - /// and place it on the graph depending on user preferences. This works for horizontal or - /// vertical bars in clusters or stacks, but only for types. This method - /// does not apply to or objects. - /// Call this method only after calling . - /// - /// The GraphPane in which to place the text labels. - /// true to center the labels inside the bars, false to - /// place the labels just above the top of the bar. - /// The double.ToString string format to use for creating - /// the labels. - /// - /// The color in which to draw the labels - /// The string name of the font family to use for the labels - /// The floating point size of the font, in scaled points - /// true for a bold font type, false otherwise - /// true for an italic font type, false otherwise - /// true for an underline font type, false otherwise - public static void CreateBarLabels( GraphPane pane, bool isBarCenter, string valueFormat, - string fontFamily, float fontSize, Color fontColor, bool isBold, bool isItalic, - bool isUnderline ) - { - bool isVertical = pane.BarSettings.Base == BarBase.X; - - // keep a count of the number of BarItems - int curveIndex = 0; - - // Get a valuehandler to do some calculations for us - ValueHandler valueHandler = new ValueHandler( pane, true ); - - // Loop through each curve in the list - foreach ( CurveItem curve in pane.CurveList ) - { - // work with BarItems only - BarItem bar = curve as BarItem; - if ( bar != null ) - { - IPointList points = curve.Points; - - // ADD JKB 9/21/07 - // The labelOffset should depend on whether the curve is YAxis or Y2Axis. - // JHC - Generalize to any value axis - // Make the gap between the bars and the labels = 1.5% of the axis range - float labelOffset; - - Scale scale = curve.ValueAxis( pane ).Scale; - labelOffset = (float)( scale._max - scale._min ) * 0.015f; - - // Loop through each point in the BarItem - for ( int i = 0; i < points.Count; i++ ) - { - // Get the high, low and base values for the current bar - // note that this method will automatically calculate the "effective" - // values if the bar is stacked - double baseVal, lowVal, hiVal; - valueHandler.GetValues( curve, i, out baseVal, out lowVal, out hiVal ); - - // Get the value that corresponds to the center of the bar base - // This method figures out how the bars are positioned within a cluster - float centerVal = (float)valueHandler.BarCenterValue( bar, - bar.GetBarWidth( pane ), i, baseVal, curveIndex ); - - // Create a text label -- note that we have to go back to the original point - // data for this, since hiVal and lowVal could be "effective" values from a bar stack - string barLabelText = ( isVertical ? points[i].Y : points[i].X ).ToString( valueFormat ); - - // Calculate the position of the label -- this is either the X or the Y coordinate - // depending on whether they are horizontal or vertical bars, respectively - float position; - if ( isBarCenter ) - position = (float)( hiVal + lowVal ) / 2.0f; - else if ( hiVal >= 0 ) - position = (float)hiVal + labelOffset; - else - position = (float)hiVal - labelOffset; - - // Create the new TextObj - TextObj label; - if ( isVertical ) - label = new TextObj( barLabelText, centerVal, position ); - else - label = new TextObj( barLabelText, position, centerVal ); - - label.FontSpec.Family = fontFamily; - - // Configure the TextObj - - // CHANGE JKB 9/21/07 - // CoordinateFrame should depend on whether curve is YAxis or Y2Axis. - label.Location.CoordinateFrame = - (isVertical && curve.IsY2Axis) ? CoordType.AxisXY2Scale : CoordType.AxisXYScale; - - label.FontSpec.Size = fontSize; - label.FontSpec.FontColor = fontColor; - label.FontSpec.IsItalic = isItalic; - label.FontSpec.IsBold = isBold; - label.FontSpec.IsUnderline = isUnderline; - - label.FontSpec.Angle = isVertical ? 90 : 0; - label.Location.AlignH = isBarCenter ? AlignH.Center : - ( hiVal >= 0 ? AlignH.Left : AlignH.Right ); - label.Location.AlignV = AlignV.Center; - label.FontSpec.Border.IsVisible = false; - label.FontSpec.Fill.IsVisible = false; - - // Add the TextObj to the GraphPane - pane.GraphObjList.Add( label ); - } - curveIndex++; - } - } - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - override public bool GetCoords( GraphPane pane, int i, out string coords ) - { - coords = string.Empty; - - if ( i < 0 || i >= _points.Count ) - return false; - - Axis valueAxis = ValueAxis( pane ); - Axis baseAxis = BaseAxis( pane ); - - // pixBase = pixel value for the bar center on the base axis - // pixHiVal = pixel value for the bar top on the value axis - // pixLowVal = pixel value for the bar bottom on the value axis - float pixBase, pixHiVal, pixLowVal; - - float clusterWidth = pane.BarSettings.GetClusterWidth(); - float barWidth = GetBarWidth( pane ); - float clusterGap = pane._barSettings.MinClusterGap * barWidth; - float barGap = barWidth * pane._barSettings.MinBarGap; - - // curBase = the scale value on the base axis of the current bar - // curHiVal = the scale value on the value axis of the current bar - // curLowVal = the scale value of the bottom of the bar - double curBase, curLowVal, curHiVal; - ValueHandler valueHandler = new ValueHandler( pane, false ); - valueHandler.GetValues( this, i, out curBase, out curLowVal, out curHiVal ); - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - - if ( !_points[i].IsInvalid3D ) - { - // calculate a pixel value for the top of the bar on value axis - pixLowVal = valueAxis.Scale.Transform( _isOverrideOrdinal, i, curLowVal ); - pixHiVal = valueAxis.Scale.Transform( _isOverrideOrdinal, i, curHiVal ); - // calculate a pixel value for the center of the bar on the base axis - pixBase = baseAxis.Scale.Transform( _isOverrideOrdinal, i, curBase ); - - // Calculate the pixel location for the side of the bar (on the base axis) - float pixSide = pixBase - clusterWidth / 2.0F + clusterGap / 2.0F + - pane.CurveList.GetBarItemPos( pane, this ) * ( barWidth + barGap ); - - // Draw the bar - if ( baseAxis is XAxis || baseAxis is X2Axis ) - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixSide, pixLowVal, - pixSide + barWidth, pixHiVal ); - else - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixLowVal, pixSide, - pixHiVal, pixSide + barWidth ); - - return true; - } - - return false; - } - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/BarSettings.cs b/SDK/ZedGraphs/ZedGraph/BarSettings.cs deleted file mode 100644 index c93d5ba..0000000 --- a/SDK/ZedGraphs/ZedGraph/BarSettings.cs +++ /dev/null @@ -1,485 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that handles the global settings for bar charts - /// - /// - /// John Champion - /// $Revision: 3.6 $ $Date: 2007-12-30 23:27:39 $ - [Serializable] - public class BarSettings : ISerializable - { - #region Fields - - /// Private field that determines the size of the gap between bar clusters - /// for bar charts. This gap is expressed as a fraction of the bar size (1.0 means - /// leave a 1-barwidth gap between clusters). - /// Use the public property to access this value. - private float _minClusterGap; - /// Private field that determines the size of the gap between individual bars - /// within a bar cluster for bar charts. This gap is expressed as a fraction of the - /// bar size (1.0 means leave a 1-barwidth gap between each bar). - /// Use the public property to access this value. - private float _minBarGap; - /// Private field that determines the base axis from which - /// graphs will be displayed. The base axis is the axis from which the bars grow with - /// increasing value. The value is of the enumeration type . - /// To access this value, use the public property . - /// - /// - private BarBase _base; - /// Private field that determines how the - /// graphs will be displayed. See the enum - /// for the individual types available. - /// To access this value, use the public property . - /// - /// - private BarType _type; - /// Private field that determines the width of a bar cluster (for bar charts) - /// in user scale units. Normally, this value is 1.0 because bar charts are typically - /// or , and the bars are - /// defined at ordinal values (1.0 scale units apart). For - /// or other scale types, you can use this value to scale the bars to an arbitrary - /// user scale. Use the public property to access this - /// value. - internal double _clusterScaleWidth; - - /// - /// Private field that determines if the will be - /// calculated automatically. Use the public property - /// to access this value. - /// - internal bool _clusterScaleWidthAuto; - - /// - /// private field that stores the owner GraphPane that contains this BarSettings instance. - /// - internal GraphPane _ownerPane; - - #endregion - - #region Constructors - - /// - /// Constructor to build a instance from the defaults. - /// - public BarSettings( GraphPane parentPane ) - { - _minClusterGap = Default.MinClusterGap; - _minBarGap = Default.MinBarGap; - _clusterScaleWidth = Default.ClusterScaleWidth; - _clusterScaleWidthAuto = Default.ClusterScaleWidthAuto; - _base = Default.Base; - _type = Default.Type; - - _ownerPane = parentPane; - } - - /// - /// Copy constructor - /// - /// the instance to be copied. - /// The that will be the - /// parent of this new BarSettings object. - public BarSettings( BarSettings rhs, GraphPane parentPane ) - { - _minClusterGap = rhs._minClusterGap; - _minBarGap = rhs._minBarGap; - _clusterScaleWidth = rhs._clusterScaleWidth; - _clusterScaleWidthAuto = rhs._clusterScaleWidthAuto; - _base = rhs._base; - _type = rhs._type; - - _ownerPane = parentPane; - } - - #endregion - - #region Bar Properties - - /// - /// The minimum space between clusters, expressed as a - /// fraction of the bar size. - /// - /// - /// - /// - public float MinClusterGap - { - get { return _minClusterGap; } - set { _minClusterGap = value; } - } - /// - /// The minimum space between individual Bars - /// within a cluster, expressed as a - /// fraction of the bar size. - /// - /// - /// - /// - public float MinBarGap - { - get { return _minBarGap; } - set { _minBarGap = value; } - } - /// Determines the base axis from which - /// graphs will be displayed. - /// - /// The base axis is the axis from which the bars grow with - /// increasing value. The value is of the enumeration type . - /// - /// - public BarBase Base - { - get { return _base; } - set { _base = value; } - } - /// Determines how the - /// graphs will be displayed. See the enum - /// for the individual types available. - /// - /// - public BarType Type - { - get { return _type; } - set { _type = value; } - } - /// - /// The width of an individual bar cluster on a graph. - /// This value only applies to bar graphs plotted on non-ordinal X axis - /// types (, , and - /// . - /// - /// - /// This value can be calculated automatically if - /// is set to true. In this case, ClusterScaleWidth will be calculated if - /// refers to an of a non-ordinal type - /// ( is false). The ClusterScaleWidth is calculated - /// from the minimum difference found between any two points on the - /// for any in the - /// . The ClusterScaleWidth is set automatically - /// each time is called. Calculations are - /// done by the method. - /// - /// - /// - /// - /// - public double ClusterScaleWidth - { - get { return _clusterScaleWidth; } - set { _clusterScaleWidth = value; _clusterScaleWidthAuto = false; } - } - - /// - /// Gets or sets a property that determines if the will be - /// calculated automatically. - /// - /// true for the to be calculated - /// automatically based on the available data, false otherwise. This value will - /// be set to false automatically if the value - /// is changed by the user. - /// - /// - /// - public bool ClusterScaleWidthAuto - { - get { return _clusterScaleWidthAuto; } - set { _clusterScaleWidthAuto = value; } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// - /// You MUST set the _ownerPane property after deserializing a BarSettings object. - /// - /// A instance that defines the - /// serialized data - /// - /// A instance that contains - /// the serialized data - /// - internal BarSettings( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _minClusterGap = info.GetSingle( "minClusterGap" ); - _minBarGap = info.GetSingle( "minBarGap" ); - _clusterScaleWidth = info.GetDouble( "clusterScaleWidth" ); - _clusterScaleWidthAuto = info.GetBoolean( "clusterScaleWidthAuto" ); - _base = (BarBase)info.GetValue( "base", typeof( BarBase ) ); - _type = (BarType)info.GetValue( "type", typeof( BarType ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - - info.AddValue( "minClusterGap", _minClusterGap ); - info.AddValue( "minBarGap", _minBarGap ); - info.AddValue( "clusterScaleWidth", _clusterScaleWidth ); - info.AddValue( "clusterScaleWidthAuto", _clusterScaleWidthAuto ); - info.AddValue( "base", _base ); - info.AddValue( "type", _type ); - } - - #endregion - - #region Methods - - /// - /// Calculate the width of an individual bar cluster on a graph. - /// This value only applies to bar graphs plotted on non-ordinal X axis - /// types ( is false). - /// - /// - /// This value can be calculated automatically if - /// is set to true. In this case, ClusterScaleWidth will be calculated if - /// refers to an of a non-ordinal type - /// ( is false). The ClusterScaleWidth is calculated - /// from the minimum difference found between any two points on the - /// for any in the - /// . The ClusterScaleWidth is set automatically - /// each time is called. - /// - /// - /// - /// - /// - public void CalcClusterScaleWidth() - { - Axis baseAxis = BarBaseAxis(); - - // First, calculate the clusterScaleWidth for BarItem objects - if ( _clusterScaleWidthAuto && !baseAxis.Scale.IsAnyOrdinal ) - { - double minStep = Double.MaxValue; - - foreach ( CurveItem curve in _ownerPane.CurveList ) - { - IPointList list = curve.Points; - - if ( curve is BarItem ) - { - double step = GetMinStepSize( curve.Points, baseAxis ); - minStep = step < minStep ? step : minStep; - } - } - - if ( minStep == Double.MaxValue ) - minStep = 1.0; - - _clusterScaleWidth = minStep; - } - - // Second, calculate the sizes of any HiLowBarItem and JapaneseCandleStickItem objects - foreach ( CurveItem curve in _ownerPane.CurveList ) - { - IPointList list = curve.Points; - -// if ( curve is HiLowBarItem && -// (curve as HiLowBarItem).Bar.IsAutoSize ) -// { -// ( curve as HiLowBarItem ).Bar._userScaleSize = -// GetMinStepSize( list, baseAxis ); -// } -// else if ( curve is JapaneseCandleStickItem && - if ( curve is JapaneseCandleStickItem && - (curve as JapaneseCandleStickItem).Stick.IsAutoSize ) - { - ( curve as JapaneseCandleStickItem ).Stick._userScaleSize = - GetMinStepSize( list, baseAxis ); - } - } - - } - - /// - /// Determine the minimum increment between individual points to be used for - /// calculating a bar size that fits without overlapping - /// - /// The list of points for the bar - /// of interest - /// The base axis for the bar - /// The minimum increment between bars along the base axis - internal static double GetMinStepSize( IPointList list, Axis baseAxis ) - { - double minStep = Double.MaxValue; - - if ( list.Count <= 0 || baseAxis._scale.IsAnyOrdinal ) - return 1.0; - - PointPair lastPt = list[0]; - for ( int i = 1; i < list.Count; i++ ) - { - PointPair pt = list[i]; - if ( !pt.IsInvalid || !lastPt.IsInvalid ) - { - double step; - if ( baseAxis is XAxis || baseAxis is X2Axis ) - step = pt.X - lastPt.X; - else - step = pt.Y - lastPt.Y; - - if ( step > 0 && step < minStep ) - minStep = step; - } - - lastPt = pt; - } - - double range = baseAxis.Scale._maxLinearized - baseAxis.Scale._minLinearized; - if ( range <= 0 ) - minStep = 1.0; -// else if ( minStep <= 0 || minStep < 0.001 * range || minStep > range ) - else if ( minStep <= 0 || minStep > range ) - minStep = 0.1 * range; - - return minStep; - } - - /// - /// Determine the width, in screen pixel units, of each bar cluster including - /// the cluster gaps and bar gaps. - /// - /// This method calls the - /// method for the base for graphs - /// (the base is assigned by the - /// property). - /// - /// - /// - /// - /// - /// The width of each bar cluster, in pixel units - public float GetClusterWidth() - { - return BarBaseAxis()._scale.GetClusterWidth( _ownerPane ); - } - - /// - /// Determine the from which the charts are based. - /// - /// - /// - /// - /// - /// The class for the axis from which the bars are based - public Axis BarBaseAxis() - { - Axis barAxis; - if ( _base == BarBase.Y ) - barAxis = _ownerPane.YAxis; - else if ( _base == BarBase.Y2 ) - barAxis = _ownerPane.Y2Axis; - else if ( _base == BarBase.X2 ) - barAxis = _ownerPane.X2Axis; - else - barAxis = _ownerPane.XAxis; - - return barAxis; - } - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default dimension gap between clusters of bars on a - /// graph. - /// This dimension is expressed in terms of the normal bar width. - /// - /// - /// - public static float MinClusterGap = 1.0F; - /// - /// The default dimension gap between each individual bar within a bar cluster - /// on a graph. - /// This dimension is expressed in terms of the normal bar width. - /// - /// - /// - public static float MinBarGap = 0.2F; - /// The default value for the , which determines the base - /// from which the graphs will be displayed. - /// - /// - public static BarBase Base = BarBase.X; - /// The default value for the property, which - /// determines if the bars are drawn overlapping eachother in a "stacked" format, - /// or side-by-side in a "cluster" format. See the - /// for more information. - /// - /// - public static BarType Type = BarType.Cluster; - - /// - /// The default width of a bar cluster - /// on a graph. This value only applies to - /// graphs, and only when the - /// is , - /// or . - /// This dimension is expressed in terms of X scale user units. - /// - /// - /// - public static double ClusterScaleWidth = 1.0; - - /// - /// The default value for . - /// - public static bool ClusterScaleWidthAuto = true; - } - #endregion - - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/BasicArrayPointList.cs b/SDK/ZedGraphs/ZedGraph/BasicArrayPointList.cs deleted file mode 100644 index c3adf4a..0000000 --- a/SDK/ZedGraphs/ZedGraph/BasicArrayPointList.cs +++ /dev/null @@ -1,147 +0,0 @@ -//============================================================================ -//BasicArrayPointList Class -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; - -namespace ZedGraph -{ - /// - /// A data collection class for ZedGraph, provided as an alternative to . - /// - /// - /// The data storage class for ZedGraph can be any type, so long as it uses the - /// interface. This class, albeit simple, is a demonstration of implementing the - /// interface to provide a simple data collection using only two arrays. The - /// interface can also be used as a layer between ZedGraph and a database, for example. - /// - /// - /// - /// - /// John Champion - /// $Revision: 3.4 $ $Date: 2007-02-18 05:51:53 $ - [Serializable] - public class BasicArrayPointList : IPointList - { - #region Fields - - /// - /// Instance of an array of x values - /// - public double[] x; - /// - /// Instance of an array of x values - /// - public double[] y; - - #endregion - - #region Properties - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// - /// Returns for any value of - /// that is outside of its corresponding array bounds. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public PointPair this[ int index ] - { - get - { - double xVal, yVal; - if ( index >= 0 && index < x.Length ) - xVal = x[index]; - else - xVal = PointPair.Missing; - - if ( index >= 0 && index < y.Length ) - yVal = y[index]; - else - yVal = PointPair.Missing; - return new PointPair( xVal, yVal, PointPair.Missing, null ); - } - set - { - if ( index >= 0 && index < x.Length ) - x[index] = value.X; - if ( index >= 0 && index < y.Length ) - y[index] = value.Y; - } - } - - /// - /// Returns the number of points available in the arrays. Count will be the greater - /// of the lengths of the X and Y arrays. - /// - public int Count - { - get { return x.Length > y.Length ? x.Length : y.Length; } - } - - #endregion - - #region Constructors - - /// - /// Constructor to initialize the PointPairList from two arrays of - /// type double. - /// - public BasicArrayPointList( double[] x, double[] y ) - { - this.x = x; - this.y = y; - } - - /// - /// The Copy Constructor - /// - /// The PointPairList from which to copy - public BasicArrayPointList( BasicArrayPointList rhs ) - { - x = (double[]) rhs.x.Clone(); - y = (double[]) rhs.y.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public BasicArrayPointList Clone() - { - return new BasicArrayPointList( this ); - } - - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Border.cs b/SDK/ZedGraphs/ZedGraph/Border.cs deleted file mode 100644 index 497035a..0000000 --- a/SDK/ZedGraphs/ZedGraph/Border.cs +++ /dev/null @@ -1,250 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that encapsulates Border (frame) properties for an object. The class - /// is used in a variety of ZedGraph objects to handle the drawing of the Border around the object. - /// - /// - /// John Champion - /// $Revision: 3.18 $ $Date: 2007-03-17 18:43:44 $ - [Serializable] - public class Border : LineBase, ISerializable, ICloneable - { - #region Fields - - /// - /// Private field that stores the amount of inflation to be done on the rectangle - /// before rendering. This allows the border to be inset or outset relative to - /// the actual rectangle area. Use the public property - /// to access this value. - /// - private float _inflateFactor; - - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - new public struct Default - { - /// - /// The default value for , in units of points (1/72 inch). - /// - /// - public static float InflateFactor = 0.0F; - } - #endregion - - #region Constructors - /// - /// The default constructor. Initialized to default values. - /// - public Border() : base() - { - _inflateFactor = Default.InflateFactor; - } - - /// - /// Constructor that specifies the visibility, color and penWidth of the Border. - /// - /// Determines whether or not the Border will be drawn. - /// The color of the Border - /// The width, in points (1/72 inch), for the Border. - public Border( bool isVisible, Color color, float width ) : - base( color ) - { - _width = width; - _isVisible = isVisible; - } - - /// - /// Constructor that specifies the color and penWidth of the Border. - /// - /// The color of the Border - /// The width, in points (1/72 inch), for the Border. - public Border( Color color, float width ) : - this( !color.IsEmpty, color, width ) - { - } - - /// - /// The Copy Constructor - /// - /// The Border object from which to copy - public Border( Border rhs ) : base( rhs ) - { - _inflateFactor = rhs._inflateFactor; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Border Clone() - { - return new Border( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Border( SerializationInfo info, StreamingContext context ) : - base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _inflateFactor = info.GetSingle( "inflateFactor" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema", schema ); - info.AddValue( "inflateFactor", _inflateFactor ); - } - #endregion - - #region Properties - /// - /// Gets or sets the amount of inflation to be done on the rectangle - /// before rendering. - /// - /// This allows the border to be inset or outset relative to - /// the actual rectangle area. - /// - public float InflateFactor - { - get { return _inflateFactor; } - set { _inflateFactor = value; } - } - #endregion - - #region Methods - /* - /// - /// Create a new object from the properties of this - /// object. - /// - /// - /// Set to true to have the pen width scaled with the - /// scaleFactor. - /// - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - /// A object with the proper color and pen width. - public Pen MakePen( bool isPenWidthScaled, float scaleFactor ) - { - float scaledPenWidth = _width; - if ( isPenWidthScaled ) - scaledPenWidth = (float)(_width * scaleFactor); - - return new Pen( _color, scaledPenWidth ); - } - */ - - /// - /// Draw the specified Border () using the properties of - /// this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - /// A struct to be drawn. - public void Draw( Graphics g, PaneBase pane, float scaleFactor, RectangleF rect ) - { - // Need to use the RectangleF props since rounding it can cause the axisFrame to - // not line up properly with the last tic mark - if ( _isVisible ) - { - RectangleF tRect = rect; - - float scaledInflate = (float) ( _inflateFactor * scaleFactor ); - tRect.Inflate( scaledInflate, scaledInflate ); - - using ( Pen pen = GetPen( pane, scaleFactor) ) - g.DrawRectangle( pen, tRect.X, tRect.Y, tRect.Width, tRect.Height ); - } - } - - #endregion - } -} - - - - - - - - diff --git a/SDK/ZedGraphs/ZedGraph/BoxObj.cs b/SDK/ZedGraphs/ZedGraph/BoxObj.cs deleted file mode 100644 index d23cb02..0000000 --- a/SDK/ZedGraphs/ZedGraph/BoxObj.cs +++ /dev/null @@ -1,348 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that represents a bordered and/or filled box (rectangle) object on - /// the graph. A list of - /// BoxObj objects is maintained by the collection class. - /// - /// - /// John Champion - /// $Revision: 3.3 $ $Date: 2007-01-25 07:56:08 $ - [Serializable] - public class BoxObj : GraphObj, ICloneable, ISerializable - { - #region Fields - - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - protected Fill _fill; - /// - /// Private field that determines the properties of the border around this - /// - /// Use the public property to access this value. - /// - protected Border _border; - - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - new public struct Default - { - /// - /// The default pen width used for the border - /// ( property). Units are points (1/72 inch). - /// - public static float PenWidth = 1.0F; - /// - /// The default color used for the border - /// ( property). - /// - public static Color BorderColor = Color.Black; - /// - /// The default color used for the fill - /// ( property). - /// - public static Color FillColor = Color.White; - } - #endregion - - #region Properties - /// - /// Gets or sets the data for this - /// . - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - /// - /// Gets or sets the object, which - /// determines the properties of the border around this - /// - /// - public Border Border - { - get { return _border; } - set { _border = value; } - } - #endregion - - #region Constructors - /// Constructors for the object - /// - /// A constructor that allows the position, border color, and solid fill color - /// of the to be pre-specified. - /// - /// An arbitrary specification - /// for the box border - /// An arbitrary specification - /// for the box fill (will be a solid color fill) - /// The x location for this . This will be in units determined by - /// . - /// The y location for this . This will be in units determined by - /// . - /// The width of this . This will be in units determined by - /// . - /// The height of this . This will be in units determined by - /// . - public BoxObj( double x, double y, double width, double height, Color borderColor, Color fillColor ) - : base( x, y, width, height ) - { - this.Border = new Border( borderColor, Default.PenWidth ); - this.Fill = new Fill( fillColor ); - } - - /// - /// A constructor that allows the position - /// of the to be pre-specified. Other properties are defaulted. - /// - /// The x location for this . This will be in units determined by - /// . - /// The y location for this . This will be in units determined by - /// . - /// The width of this . This will be in units determined by - /// . - /// The height of this . This will be in units determined by - /// . - public BoxObj( double x, double y, double width, double height ) - : - base( x, y, width, height ) - { - this.Border = new Border( Default.BorderColor, Default.PenWidth ); - this.Fill = new Fill( Default.FillColor ); - } - - /// - /// A default constructor that creates a using a location of (0,0), - /// and a width,height of (1,1). Other properties are defaulted. - /// - public BoxObj() : this( 0, 0, 1, 1 ) - { - } - - /// - /// A constructor that allows the position, border color, and two-color - /// gradient fill colors - /// of the to be pre-specified. - /// - /// An arbitrary specification - /// for the box border - /// An arbitrary specification - /// for the start of the box gradient fill - /// An arbitrary specification - /// for the end of the box gradient fill - /// The x location for this . This will be in units determined by - /// . - /// The y location for this . This will be in units determined by - /// . - /// The width of this . This will be in units determined by - /// . - /// The height of this . This will be in units determined by - /// . - public BoxObj( double x, double y, double width, double height, Color borderColor, - Color fillColor1, Color fillColor2 ) : - base( x, y, width, height ) - { - this.Border = new Border( borderColor, Default.PenWidth ); - this.Fill = new Fill( fillColor1, fillColor2 ); - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public BoxObj( BoxObj rhs ) : base( rhs ) - { - this.Border = rhs.Border.Clone(); - this.Fill = rhs.Fill.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public BoxObj Clone() - { - return new BoxObj( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected BoxObj( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _fill = (Fill) info.GetValue( "fill", typeof(Fill) ); - _border = (Border) info.GetValue( "border", typeof(Border) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - } - #endregion - - #region Rendering Methods - /// - /// Render this object to the specified device. - /// - /// - /// This method is normally only called by the Draw method - /// of the parent collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) - { - // Convert the arrow coordinates from the user coordinate system - // to the screen coordinate system - RectangleF pixRect = this.Location.TransformRect( pane ); - - // Clip the rect to just outside the PaneRect so we don't end up with wild coordinates. - RectangleF tmpRect = pane.Rect; - tmpRect.Inflate( 20, 20 ); - pixRect.Intersect( tmpRect ); - - if ( Math.Abs( pixRect.Left ) < 100000 && - Math.Abs( pixRect.Top ) < 100000 && - Math.Abs( pixRect.Right ) < 100000 && - Math.Abs( pixRect.Bottom ) < 100000 ) - { - // If the box is to be filled, fill it - _fill.Draw( g, pixRect ); - - // Draw the border around the box if required - _border.Draw( g, pane, scaleFactor, pixRect ); - } - } - - /// - /// Determine if the specified screen point lies inside the bounding box of this - /// . - /// - /// The screen point, in pixels - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// true if the point lies in the bounding box, false otherwise - override public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) - { - if ( ! base.PointInBox(pt, pane, g, scaleFactor ) ) - return false; - - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - RectangleF pixRect = _location.TransformRect( pane ); - - return pixRect.Contains( pt ); - } - - /// - /// Determines the shape type and Coords values for this GraphObj - /// - override public void GetCoords( PaneBase pane, Graphics g, float scaleFactor, - out string shape, out string coords ) - { - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - RectangleF pixRect = _location.TransformRect( pane ); - - shape = "rect"; - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixRect.Left, pixRect.Top, pixRect.Right, pixRect.Bottom ); - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Chart.cs b/SDK/ZedGraphs/ZedGraph/Chart.cs deleted file mode 100644 index f0de37d..0000000 --- a/SDK/ZedGraphs/ZedGraph/Chart.cs +++ /dev/null @@ -1,256 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that handles the properties of the charting area (where the curves are - /// actually drawn), which is bounded by the , , - /// and . - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class Chart : ICloneable, ISerializable - { - /// - /// The rectangle that contains the area bounded by the axes, in pixel units - /// - internal RectangleF _rect; - - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - internal Fill _fill; - - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - internal Border _border; - - /// Private field that determines if the will be - /// sized automatically. Use the public property to access - /// this value. - internal bool _isRectAuto; - - #region Constructors - - /// - /// Default constructor. - /// - public Chart() - { - _isRectAuto = true; - _border = new Border( Default.IsBorderVisible, Default.BorderColor, Default.BorderPenWidth ); - _fill = new Fill( Default.FillColor, Default.FillBrush, Default.FillType ); - } - - /// - /// Copy constructor - /// - /// The source to be copied. - public Chart( Chart rhs ) - { - _border = rhs._border.Clone(); - _fill = rhs._fill.Clone(); - _rect = rhs._rect; - _isRectAuto = rhs._isRectAuto; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Chart Clone() - { - return new Chart( this ); - } - - #endregion - - #region Properties - - /// - /// Gets or sets the rectangle that contains the area bounded by the axes - /// (, , and ). - /// If you set this value manually, then the - /// value will automatically be set to false. - /// - /// The rectangle units are in screen pixels - public RectangleF Rect - { - get { return _rect; } - set { _rect = value; _isRectAuto = false; } - } - - /// - /// Gets or sets the data for this - /// . - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - - /// - /// Gets or sets the class for drawing the border - /// border around the - /// - /// - /// - public Border Border - { - get { return _border; } - set { _border = value; } - } - - /// - /// Gets or sets a boolean value that determines whether or not the - /// will be calculated automatically (almost always true). - /// - /// - /// If you have a need to set the ChartRect manually, such as you have multiple graphs - /// on a page and you want to line up the edges perfectly, you can set this value - /// to false. If you set this value to false, you must also manually set - /// the property. - /// You can easily determine the ChartRect that ZedGraph would have - /// calculated by calling the method, which returns - /// a chart rect sized for the current data range, scale sizes, etc. - /// - /// true to have ZedGraph calculate the ChartRect, false to do it yourself - public bool IsRectAuto - { - get { return _isRectAuto; } - set { _isRectAuto = value; } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Chart( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _rect = (RectangleF)info.GetValue( "rect", typeof( RectangleF ) ); - _fill = (Fill)info.GetValue( "fill", typeof( Fill ) ); - _border = (Border)info.GetValue( "border", typeof( Border ) ); - _isRectAuto = info.GetBoolean( "isRectAuto" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "rect", _rect ); - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - info.AddValue( "isRectAuto", _isRectAuto ); - } - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default color for the border. - /// ( property). - /// - public static Color BorderColor = Color.Black; - /// - /// The default color for the background. - /// ( property). - /// - public static Color FillColor = Color.White; - /// - /// The default brush for the background. - /// ( property of ). - /// - public static Brush FillBrush = null; - /// - /// The default for the background. - /// ( property of ). - /// - public static FillType FillType = FillType.Brush; - /// - /// The default pen width for drawing the - /// border - /// ( property). - /// Units are in points (1/72 inch). - /// - public static float BorderPenWidth = 1F; - /// - /// The default display mode for the border - /// ( property). true - /// to show the border border, false to omit the border - /// - public static bool IsBorderVisible = true; - - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/CollectionPlus.cs b/SDK/ZedGraphs/ZedGraph/CollectionPlus.cs deleted file mode 100644 index 8c7423a..0000000 --- a/SDK/ZedGraphs/ZedGraph/CollectionPlus.cs +++ /dev/null @@ -1,162 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright (C) 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Collections; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// A collection base class containing basic extra functionality to be inherited - /// by , , - /// . - /// - /// The methods in this collection operate on basic - /// types. Therefore, in order to make sure that - /// the derived classes remain strongly-typed, there are no Add() or - /// Insert() methods here, and no methods that return an object. - /// Only Remove(), Move(), IndexOf(), etc. methods are included. - /// - /// John Champion - /// $Revision: 3.8 $ $Date: 2006-06-24 20:26:43 $ - [Serializable] - public class CollectionPlus : CollectionBase - { - /// - /// Default Constructor - /// - public CollectionPlus() : base() - { - } - - /// - /// Return the zero-based position index of the specified object - /// in the collection. - /// - /// A reference to the object that is to be found. - /// - /// The zero-based index of the specified object, or -1 if the - /// object is not in the list - /// - public int IndexOf( object item ) - { - return List.IndexOf( item ); - } - - /// - /// Remove an object from the collection at the specified ordinal location. - /// - /// - /// An ordinal position in the list at which the object to be removed - /// is located. - /// - /// - public void Remove( int index ) - { - if ( index >= 0 && index < List.Count ) - List.RemoveAt( index ); - } - - /// - /// Remove an object from the collection based on an object reference. - /// - /// A reference to the object that is to be - /// removed. - /// - public void Remove( object item ) - { - List.Remove( item ); - } - - /// - /// Move the position of the object at the specified index - /// to the new relative position in the list. - /// For Graphic type objects, this method controls the - /// Z-Order of the items. Objects at the beginning of the list - /// appear in front of objects at the end of the list. - /// The zero-based index of the object - /// to be moved. - /// The relative number of positions to move - /// the object. A value of -1 will move the - /// object one position earlier in the list, a value - /// of 1 will move it one position later. To move an item to the - /// beginning of the list, use a large negative value (such as -999). - /// To move it to the end of the list, use a large positive value. - /// - /// The new position for the object, or -1 if the object - /// was not found. - public int Move( int index, int relativePos ) - { - if ( index < 0 || index >= List.Count ) - return -1; - object obj = List[index]; - List.RemoveAt( index ); - index += relativePos; - if ( index < 0 ) - index = 0; - if ( index > List.Count ) - index = List.Count; - List.Insert( index, obj ); - return index; - } - - /* - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 1; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected CollectionPlus( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema", schema ); - } - #endregion -*/ - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ColorSymbolRotator.cs b/SDK/ZedGraphs/ZedGraph/ColorSymbolRotator.cs deleted file mode 100644 index fbabb6b..0000000 --- a/SDK/ZedGraphs/ZedGraph/ColorSymbolRotator.cs +++ /dev/null @@ -1,188 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using Color = System.Drawing.Color; - -namespace ZedGraph -{ - /// - /// Class used to get the next color/symbol for GraphPane.AddCurve methods. - /// - /// - /// Jerry Vos modified by John Champion - /// $Revision: 3.4 $ $Date: 2006-06-24 20:26:43 $ - public class ColorSymbolRotator - { - #region Static fields - /// - /// The s - /// rotates through. - /// - public static readonly Color[] COLORS = new Color[] - { - Color.Red, - Color.Blue, - Color.Green, - Color.Purple, - Color.Cyan, - Color.Pink, - Color.LightBlue, - Color.PaleVioletRed, - Color.SeaGreen, - Color.Yellow - }; - - /// - /// The s - /// rotates through. - /// - public static readonly SymbolType[] SYMBOLS = new SymbolType[] - { - SymbolType.Circle, - SymbolType.Diamond, - SymbolType.Plus, - SymbolType.Square, - SymbolType.Star, - SymbolType.Triangle, - SymbolType.TriangleDown, - SymbolType.XCross, - SymbolType.HDash, - SymbolType.VDash - }; - - private static ColorSymbolRotator _staticInstance; - #endregion - - #region Fields - /// - /// The index of the next color to be used. Note: may be - /// > COLORS.Length, it is reset to 0 on the next call if it is. - /// - protected int colorIndex = 0; - - /// - /// The index of the next symbol to be used. Note: may be - /// > SYMBOLS.Length, it is reset to 0 on the next call if it is. - /// - protected int symbolIndex = 0; - #endregion - - #region Properties - /// - /// Retrieves the next color in the rotation Calling this - /// method has the side effect of incrementing the color index. - /// - /// - /// - public Color NextColor - { - get { return COLORS[NextColorIndex]; } - } - - /// - /// Retrieves the index of the next color to be used. Calling this - /// method has the side effect of incrementing the color index. - /// - public int NextColorIndex - { - get - { - if (colorIndex >= COLORS.Length) - colorIndex = 0; - - return colorIndex++; - } - set - { - colorIndex = value; - } - } - - /// - /// Retrieves the next color in the rotation. Calling this - /// method has the side effect of incrementing the symbol index. - /// - /// - /// - public SymbolType NextSymbol - { - get { return SYMBOLS[NextSymbolIndex]; } - } - - /// - /// Retrieves the index of the next symbol to be used. Calling this - /// method has the side effect of incrementing the symbol index. - /// - public int NextSymbolIndex - { - get - { - if (symbolIndex >= SYMBOLS.Length) - symbolIndex = 0; - - return symbolIndex++; - } - set - { - symbolIndex = value; - } - } - - /// - /// Retrieves the instance used by the - /// static methods. - /// - /// - /// - public static ColorSymbolRotator StaticInstance - { - get - { - if (_staticInstance == null) - _staticInstance = new ColorSymbolRotator(); - - return _staticInstance; - } - } - - /// - /// Retrieves the next color from this class's static - /// instance - /// - /// - /// - public static Color StaticNextColor - { - get { return StaticInstance.NextColor; } - } - - /// - /// Retrieves the next symbol type from this class's static - /// instance - /// - /// - /// - public static SymbolType StaticNextSymbol - { - get { return StaticInstance.NextSymbol; } - } - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/CurveItem.cs b/SDK/ZedGraphs/ZedGraph/CurveItem.cs deleted file mode 100644 index 2782a79..0000000 --- a/SDK/ZedGraphs/ZedGraph/CurveItem.cs +++ /dev/null @@ -1,1229 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#if ( !DOTNET1 ) // Is this a .Net 2 compilation? -using System.Collections.Generic; -#endif - -namespace ZedGraph -{ - - /// - /// This class contains the data and methods for an individual curve within - /// a graph pane. It carries the settings for the curve including the - /// key and item names, colors, symbols and sizes, linetypes, etc. - /// - /// - /// John Champion - /// modified by Jerry Vos - /// $Revision: 3.43 $ $Date: 2007-11-03 04:41:28 $ - [Serializable] - abstract public class CurveItem : ISerializable, ICloneable - { - - #region Fields - - /// - /// protected field that stores a instance for this - /// , which is used for the - /// label. Use the public - /// property to access this value. - /// - internal Label _label; - - /// - /// protected field that stores the boolean value that determines whether this - /// is on the bottom X axis or the top X axis (X2). - /// Use the public property to access this value. - /// - protected bool _isX2Axis; - /// - /// protected field that stores the boolean value that determines whether this - /// is on the left Y axis or the right Y axis (Y2). - /// Use the public property to access this value. - /// - protected bool _isY2Axis; - - /// - /// protected field that stores the index number of the Y Axis to which this - /// belongs. Use the public property - /// to access this value. - /// - protected int _yAxisIndex; - - /// - /// protected field that stores the boolean value that determines whether this - /// is visible on the graph. - /// Use the public property to access this value. - /// Note that this value turns the curve display on or off, but it does not - /// affect the display of the legend entry. To hide the legend entry, you - /// have to set to false. - /// - protected bool _isVisible; - - // Revision: JCarpenter 10/06 - /// - /// Protected field that stores the boolean value that determines whether this - /// is selected on the graph. - /// Use the public property to access this value. - /// Note that this value changes the curve display color, but it does not - /// affect the display of the legend entry. To hide the legend entry, you - /// have to set to false. - /// - protected bool _isSelected; - - // Revision: JCarpenter 10/06 - /// - /// Protected field that stores the boolean value that determines whether this - /// can be selected in the graph. - /// - protected bool _isSelectable; - - /// - /// protected field that stores a boolean value which allows you to override the normal - /// ordinal axis behavior. Use the public property to - /// access this value. - /// - protected bool _isOverrideOrdinal; - - /// - /// The of value sets that - /// represent this . - /// The size of this list determines the number of points that are - /// plotted. Note that values defined as - /// System.Double.MaxValue are considered "missing" values - /// (see ), - /// and are not plotted. The curve will have a break at these points - /// to indicate the values are missing. - /// - protected IPointList _points; - - /// - /// A tag object for use by the user. This can be used to store additional - /// information associated with the . ZedGraph does - /// not use this value for any purpose. - /// - /// - /// Note that, if you are going to Serialize ZedGraph data, then any type - /// that you store in must be a serializable type (or - /// it will cause an exception). - /// - public object Tag; - - /// - /// Protected field that stores the hyperlink information for this object. - /// - internal Link _link; - - #endregion - - #region Constructors - /// - /// constructor the pre-specifies the curve label, the - /// x and y data values as a , the curve - /// type (Bar or Line/Symbol), the , and the - /// . Other properties of the curve are - /// defaulted to the values in the class. - /// - /// A string label (legend entry) for this curve - /// An array of double precision values that define - /// the independent (X axis) values for this curve - /// An array of double precision values that define - /// the dependent (Y axis) values for this curve - public CurveItem( string label, double[] x, double[] y ) : - this( label, new PointPairList( x, y ) ) - { - } -/* - public CurveItem( string _label, int y ) : this( _label, new IPointList( ) ) - { - } -*/ - /// - /// constructor the pre-specifies the curve label, the - /// x and y data values as a , the curve - /// type (Bar or Line/Symbol), the , and the - /// . Other properties of the curve are - /// defaulted to the values in the class. - /// - /// A string label (legend entry) for this curve - /// A of double precision value pairs that define - /// the X and Y values for this curve - public CurveItem( string label, IPointList points ) - { - Init( label ); - - if ( points == null ) - _points = new PointPairList(); - else - //this.points = (IPointList) _points.Clone(); - _points = points; - } - - /// - /// Internal initialization routine thats sets some initial values to defaults. - /// - /// A string label (legend entry) for this curve - private void Init( string label ) - { - _label = new Label( label, null ); - _isY2Axis = false; - _isX2Axis = false; - _isVisible = true; - _isOverrideOrdinal = false; - this.Tag = null; - _yAxisIndex = 0; - _link = new Link(); - } - - /// - /// constructor that specifies the label of the CurveItem. - /// This is the same as CurveItem(label, null, null). - /// - /// - /// A string label (legend entry) for this curve - public CurveItem( string label ): this( label, null ) - { - } - /// - /// - /// - public CurveItem( ) - { - Init( null ); - } - /// - /// The Copy Constructor - /// - /// The CurveItem object from which to copy - public CurveItem( CurveItem rhs ) - { - _label = rhs._label.Clone(); - _isY2Axis = rhs.IsY2Axis; - _isX2Axis = rhs.IsX2Axis; - _isVisible = rhs.IsVisible; - _isOverrideOrdinal = rhs._isOverrideOrdinal; - _yAxisIndex = rhs._yAxisIndex; - - if ( rhs.Tag is ICloneable ) - this.Tag = ((ICloneable) rhs.Tag).Clone(); - else - this.Tag = rhs.Tag; - - _points = (IPointList) rhs.Points.Clone(); - - _link = rhs._link.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of Clone. - /// - /// - /// Note that this method must be called with an explicit cast to ICloneable, and - /// that it is inherently virtual. For example: - /// - /// ParentClass foo = new ChildClass(); - /// ChildClass bar = (ChildClass) ((ICloneable)foo).Clone(); - /// - /// Assume that ChildClass is inherited from ParentClass. Even though foo is declared with - /// ParentClass, it is actually an instance of ChildClass. Calling the ICloneable implementation - /// of Clone() on foo actually calls ChildClass.Clone() as if it were a virtual function. - /// - /// A deep copy of this object - object ICloneable.Clone() - { - throw new NotImplementedException( "Can't clone an abstract base type -- child types must implement ICloneable" ); - //return new PaneBase( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected CurveItem( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _label = (Label) info.GetValue( "label", typeof(Label) ); - _isY2Axis = info.GetBoolean( "isY2Axis" ); - if ( sch >= 11 ) - _isX2Axis = info.GetBoolean( "isX2Axis" ); - else - _isX2Axis = false; - - _isVisible = info.GetBoolean( "isVisible" ); - - _isOverrideOrdinal = info.GetBoolean( "isOverrideOrdinal" ); - - // Data Points are always stored as a PointPairList, regardless of the - // actual original type (which could be anything that supports IPointList). - _points = (PointPairList) info.GetValue( "points", typeof(PointPairList) ); - - Tag = info.GetValue( "Tag", typeof(object) ); - - _yAxisIndex = info.GetInt32( "yAxisIndex" ); - - _link = (Link) info.GetValue( "link", typeof(Link) ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "label", _label ); - info.AddValue( "isY2Axis", _isY2Axis ); - info.AddValue( "isX2Axis", _isX2Axis ); - info.AddValue( "isVisible", _isVisible ); - info.AddValue( "isOverrideOrdinal", _isOverrideOrdinal ); - - // if points is already a PointPairList, use it - // otherwise, create a new PointPairList so it can be serialized - PointPairList list; - if ( _points is PointPairList ) - list = _points as PointPairList; - else - list = new PointPairList( _points ); - - info.AddValue( "points", list ); - info.AddValue( "Tag", Tag ); - info.AddValue( "yAxisIndex", _yAxisIndex ); - - info.AddValue( "link", _link ); - } - #endregion - - #region Properties - /// - /// A instance that represents the - /// entry for the this object - /// - public Label Label - { - get { return _label; } - set { _label = value;} - } - - /// - /// The // - /// color (FillColor for the Bar). This is a common access to - /// Line.Color, - /// Border.Color, and - /// Fill.Color properties for this curve. - /// - public Color Color - { - get - { - if ( this is BarItem ) - return ((BarItem) this).Bar.Fill.Color; - else if ( this is LineItem && ((LineItem) this).Line.IsVisible ) - return ((LineItem) this).Line.Color; - else if ( this is LineItem ) - return ((LineItem) this).Symbol.Border.Color; - else if ( this is ErrorBarItem ) - return ((ErrorBarItem) this).Bar.Color; - else if ( this is HiLowBarItem ) - return ((HiLowBarItem) this).Bar.Fill.Color; - else - return Color.Empty; - } - set - { - if ( this is BarItem ) - { - ((BarItem) this).Bar.Fill.Color = value; - } - else if ( this is LineItem ) - { - ((LineItem) this).Line.Color = value; - ((LineItem) this).Symbol.Border.Color = value; - ((LineItem) this).Symbol.Fill.Color = value; - } - else if ( this is ErrorBarItem ) - ((ErrorBarItem) this).Bar.Color = value; - else if ( this is HiLowBarItem ) - ((HiLowBarItem) this).Bar.Fill.Color = value; - } - } - - /// - /// Determines whether this is visible on the graph. - /// Note that this value turns the curve display on or off, but it does not - /// affect the display of the legend entry. To hide the legend entry, you - /// have to set to false. - /// - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - - // Revision: JCarpenter 10/06 - /// - /// Determines whether this is selected on the graph. - /// Note that this value changes the curve displayed color, but it does not - /// affect the display of the legend entry. To hide the legend entry, you - /// have to set to false. - /// - public bool IsSelected - { - get { return _isSelected; } - set - { - _isSelected = value; - - /* - if ( this is BarItem ) - { - ( (BarItem)this ).Bar.Fill.UseInactiveColor = !value; - } - else if ( this is LineItem ) - { - ( (LineItem)this ).Line.Fill.UseInactiveColor = !value; - ( (LineItem)this ).Symbol.Fill.UseInactiveColor = !value; - ( (LineItem)this ).Symbol.Fill.UseInactiveColor = !value; - } - else if ( this is HiLowBarItem ) - ( (HiLowBarItem)this ).Bar.Fill.UseInactiveColor = !value; - else if ( this is PieItem ) - ( (PieItem)this ).Fill.UseInactiveColor = !value; - */ - } - } - - // Revision: JCarpenter 10/06 - /// - /// Determines whether this can be selected in the graph. - /// - public bool IsSelectable - { - get { return _isSelectable; } - set { _isSelectable = value; } - } - - /// - /// Gets or sets a value which allows you to override the normal - /// ordinal axis behavior. - /// - /// - /// Normally for an ordinal axis type, the actual data values corresponding to the ordinal - /// axis will be ignored (essentially they are replaced by ordinal values, e.g., 1, 2, 3, etc). - /// If IsOverrideOrdinal is true, then the user data values will be used (even if they don't - /// make sense). Fractional values are allowed, such that a value of 1.5 is between the first and - /// second ordinal position, etc. - /// - /// - /// - public bool IsOverrideOrdinal - { - get { return _isOverrideOrdinal; } - set { _isOverrideOrdinal = value; } - } - - /// - /// Gets or sets a value that determines which X axis this - /// is assigned to. - /// - /// - /// The - /// is on the bottom side of the graph and the - /// is on the top side. Assignment to an axis - /// determines the scale that is used to draw the curve on the graph. - /// - /// true to assign the curve to the , - /// false to assign the curve to the - public bool IsX2Axis - { - get { return _isX2Axis; } - set { _isX2Axis = value; } - } - - /// - /// Gets or sets a value that determines which Y axis this - /// is assigned to. - /// - /// - /// The - /// is on the left side of the graph and the - /// is on the right side. Assignment to an axis - /// determines the scale that is used to draw the curve on the graph. Note that - /// this value is used in combination with the to determine - /// which of the Y Axes (if there are multiples) this curve belongs to. - /// - /// true to assign the curve to the , - /// false to assign the curve to the - public bool IsY2Axis - { - get { return _isY2Axis; } - set { _isY2Axis = value; } - } - - /// - /// Gets or sets the index number of the Y Axis to which this - /// belongs. - /// - /// - /// This value is essentially an index number into the - /// or , depending on the setting of - /// . - /// - public int YAxisIndex - { - get { return _yAxisIndex; } - set { _yAxisIndex = value; } - } - - /// - /// Determines whether this - /// is a . - /// - /// true for a bar chart, or false for a line or pie graph - public bool IsBar - { - get { return this is BarItem || this is HiLowBarItem || this is ErrorBarItem; } - } - - /// - /// Determines whether this - /// is a . - /// - /// true for a pie chart, or false for a line or bar graph - public bool IsPie - { - get { return this is PieItem; } - } - - /// - /// Determines whether this - /// is a . - /// - /// true for a line chart, or false for a bar type - public bool IsLine - { - get { return this is LineItem; } - } - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - abstract internal bool IsZIncluded( GraphPane pane ); - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - abstract internal bool IsXIndependent( GraphPane pane ); - - /// - /// Readonly property that gives the number of points that define this - /// object, which is the number of points in the - /// data collection. - /// - public int NPts - { - get - { - if ( _points == null ) - return 0; - else - return _points.Count; - } - } - - /// - /// The of X,Y point sets that represent this - /// . - /// - public IPointList Points - { - get { return _points; } - set { _points = value; } - } - - /// - /// An accessor for the datum for this . - /// Index is the ordinal reference (zero based) of the point. - /// - public PointPair this[int index] - { - get - { - if ( _points == null ) - return new PointPair( PointPair.Missing, PointPair.Missing ); - else - return ( _points )[index]; - } - } - - /// - /// Gets or sets the hyperlink information for this . - /// - // /// - public Link Link - { - get { return _link; } - set { _link = value; } - } - - #endregion - - #region Rendering Methods - /// - /// Do all rendering associated with this to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The ordinal position of the current - /// curve. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - abstract public void Draw( Graphics g, GraphPane pane, int pos, float scaleFactor ); - - /// - /// Draw a legend key entry for this at the specified location. - /// This abstract base method passes through to or - /// to do the rendering. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The struct that specifies the - /// location for the legend key - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - abstract public void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor ); - - #endregion - - #region Utility Methods - - /// - /// Add a single x,y coordinate point to the end of the points collection for this curve. - /// - /// The X coordinate value - /// The Y coordinate value - public void AddPoint( double x, double y ) - { - this.AddPoint( new PointPair( x, y ) ); - } - - /// - /// Add a object to the end of the points collection for this curve. - /// - /// - /// This method will only work if the instance reference - /// at supports the interface. - /// Otherwise, it does nothing. - /// - /// A reference to the object to - /// be added - public void AddPoint( PointPair point ) - { - if ( _points == null ) - this.Points = new PointPairList(); - - if ( _points is IPointListEdit ) - ( _points as IPointListEdit ).Add( point ); - else - throw new NotImplementedException(); - } - - /// - /// Clears the points from this . This is the same - /// as CurveItem.Points.Clear(). - /// - /// - /// This method will only work if the instance reference - /// at supports the interface. - /// Otherwise, it does nothing. - /// - public void Clear() - { - if ( _points is IPointListEdit ) - (_points as IPointListEdit).Clear(); - else - throw new NotImplementedException(); - } - - /// - /// Removes a single point from this . - /// - /// - /// This method will only work if the instance reference - /// at supports the interface. - /// Otherwise, it does nothing. - /// - /// The ordinal position of the point to be removed. - public void RemovePoint( int index ) - { - if ( _points is IPointListEdit ) - (_points as IPointListEdit).RemoveAt( index ); - else - throw new NotImplementedException(); - } - - /// - /// Get the X Axis instance (either or ) to - /// which this belongs. - /// - /// The object to which this curve belongs. - /// Either a or to which this - /// belongs. - /// - public Axis GetXAxis( GraphPane pane ) - { - if ( _isX2Axis ) - return pane.X2Axis; - else - return pane.XAxis; - } - - /// - /// Get the Y Axis instance (either or ) to - /// which this belongs. - /// - /// - /// This method safely retrieves a Y Axis instance from either the - /// or the using the values of and - /// . If the value of is out of bounds, the - /// default or is used. - /// - /// The object to which this curve belongs. - /// Either a or to which this - /// belongs. - /// - public Axis GetYAxis( GraphPane pane ) - { - if ( _isY2Axis ) - { - if ( _yAxisIndex < pane.Y2AxisList.Count ) - return pane.Y2AxisList[_yAxisIndex]; - else - return pane.Y2AxisList[0]; - } - else - { - if ( _yAxisIndex < pane.YAxisList.Count ) - return pane.YAxisList[_yAxisIndex]; - else - return pane.YAxisList[0]; - } - } - - /// - /// Get the index of the Y Axis in the or list to - /// which this belongs. - /// - /// - /// This method safely retrieves a Y Axis index into either the - /// or the using the values of and - /// . If the value of is out of bounds, the - /// default or is used, which is index zero. - /// - /// The object to which this curve belongs. - /// An integer value indicating which index position in the list applies to this - /// - /// - public int GetYAxisIndex( GraphPane pane ) - { - if ( _yAxisIndex >= 0 && - _yAxisIndex < ( _isY2Axis ? pane.Y2AxisList.Count : pane.YAxisList.Count ) ) - return _yAxisIndex; - else - return 0; - } - - /// - /// Loads some pseudo unique colors/symbols into this CurveItem. This - /// is the same as MakeUnique(ColorSymbolRotator.StaticInstance). - /// - /// - /// - /// - public void MakeUnique() - { - this.MakeUnique( ColorSymbolRotator.StaticInstance ); - } - - /// - /// Loads some pseudo unique colors/symbols into this CurveItem. This - /// is mainly useful for differentiating a set of new CurveItems without - /// having to pick your own colors/symbols. - /// - /// - /// - /// The that is used to pick the color - /// and symbol for this method call. - /// - virtual public void MakeUnique( ColorSymbolRotator rotator ) - { - this.Color = rotator.NextColor; - } - - /// - /// Go through the list of data values for this - /// and determine the minimum and maximum values in the data. - /// - /// The minimum X value in the range of data - /// The maximum X value in the range of data - /// The minimum Y value in the range of data - /// The maximum Y value in the range of data - /// ignoreInitial is a boolean value that - /// affects the data range that is considered for the automatic scale - /// ranging (see ). If true, then initial - /// data points where the Y value is zero are not included when - /// automatically determining the scale , - /// , and size. All data after - /// the first non-zero Y value are included. - /// - /// - /// Determines if the auto-scaled axis ranges will subset the - /// data points based on any manually set scale range values. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - virtual public void GetRange( out double xMin, out double xMax, - out double yMin, out double yMax, - bool ignoreInitial, - bool isBoundedRanges, - GraphPane pane ) - { - // The lower and upper bounds of allowable data for the X values. These - // values allow you to subset the data values. If the X range is bounded, then - // the resulting range for Y will reflect the Y values for the points within the X - // bounds. - double xLBound = double.MinValue; - double xUBound = double.MaxValue; - double yLBound = double.MinValue; - double yUBound = double.MaxValue; - - // initialize the values to outrageous ones to start - xMin = yMin = Double.MaxValue; - xMax = yMax = Double.MinValue; - - Axis yAxis = this.GetYAxis( pane ); - Axis xAxis = this.GetXAxis( pane ); - if ( yAxis == null || xAxis == null ) - return; - - if ( isBoundedRanges ) - { - xLBound = xAxis._scale._lBound; - xUBound = xAxis._scale._uBound; - yLBound = yAxis._scale._lBound; - yUBound = yAxis._scale._uBound; - } - - - bool isZIncluded = this.IsZIncluded( pane ); - bool isXIndependent = this.IsXIndependent( pane ); - bool isXLog = xAxis.Scale.IsLog; - bool isYLog = yAxis.Scale.IsLog; - bool isXOrdinal = xAxis.Scale.IsAnyOrdinal; - bool isYOrdinal = yAxis.Scale.IsAnyOrdinal; - bool isZOrdinal = ( isXIndependent ? yAxis : xAxis ).Scale.IsAnyOrdinal; - - // Loop over each point in the arrays - //foreach ( PointPair point in this.Points ) - for ( int i=0; i xUBound || - curY < yLBound || curY > yUBound || - ( isZIncluded && isXIndependent && ( curZ < yLBound || curZ > yUBound ) ) || - ( isZIncluded && !isXIndependent && ( curZ < xLBound || curZ > xUBound ) ) || - ( curX <= 0 && isXLog ) || ( curY <= 0 && isYLog ); - - // ignoreInitial becomes false at the first non-zero - // Y value - if ( ignoreInitial && curY != 0 && - curY != PointPair.Missing ) - ignoreInitial = false; - - if ( !ignoreInitial && - !outOfBounds && - curX != PointPair.Missing && - curY != PointPair.Missing ) - { - if ( curX < xMin ) - xMin = curX; - if ( curX > xMax ) - xMax = curX; - if ( curY < yMin ) - yMin = curY; - if ( curY > yMax ) - yMax = curY; - - if ( isZIncluded && isXIndependent && curZ != PointPair.Missing ) - { - if ( curZ < yMin ) - yMin = curZ; - if ( curZ > yMax ) - yMax = curZ; - } - else if ( isZIncluded && curZ != PointPair.Missing ) - { - if ( curZ < xMin ) - xMin = curZ; - if ( curZ > xMax ) - xMax = curZ; - } - } - } - } - - /// Returns a reference to the object that is the "base" - /// (independent axis) from which the values are drawn. - /// - /// This property is determined by the value of for - /// , , and - /// types. It is always the X axis for regular types. - /// Note that the setting can override the - /// and settings for bar types - /// (this is because all the bars that are clustered together must share the - /// same base axis). - /// - /// - /// - public virtual Axis BaseAxis( GraphPane pane ) - { - BarBase barBase; - - if ( this is BarItem || this is ErrorBarItem || this is HiLowBarItem ) - barBase = pane._barSettings.Base; - else - barBase = _isX2Axis ? BarBase.X2 : BarBase.X; - - if ( barBase == BarBase.X ) - return pane.XAxis; - else if ( barBase == BarBase.X2 ) - return pane.X2Axis; - else if ( barBase == BarBase.Y ) - return pane.YAxis; - else - return pane.Y2Axis; - - } - /// Returns a reference to the object that is the "value" - /// (dependent axis) from which the points are drawn. - /// - /// This property is determined by the value of for - /// , , and - /// types. It is always the Y axis for regular types. - /// - /// - /// - public virtual Axis ValueAxis( GraphPane pane ) - { - BarBase barBase; - - if ( this is BarItem || this is ErrorBarItem || this is HiLowBarItem ) - barBase = pane._barSettings.Base; - else - barBase = BarBase.X; - - if ( barBase == BarBase.X || barBase == BarBase.X2 ) - { - return GetYAxis( pane ); - } - else - return GetXAxis( pane ); - } - - /// - /// Calculate the width of each bar, depending on the actual bar type - /// - /// The width for an individual bar, in pixel units - public float GetBarWidth( GraphPane pane ) - { - // Total axis width = - // npts * ( nbars * ( bar + bargap ) - bargap + clustgap ) - // cg * bar = cluster gap - // npts = max number of points in any curve - // nbars = total number of curves that are of type IsBar - // bar = bar width - // bg * bar = bar gap - // therefore: - // totwidth = npts * ( nbars * (bar + bg*bar) - bg*bar + cg*bar ) - // totwidth = bar * ( npts * ( nbars * ( 1 + bg ) - bg + cg ) ) - // solve for bar - - float barWidth; - - if ( this is ErrorBarItem ) - barWidth = (float) ( ((ErrorBarItem)this).Bar.Symbol.Size * - pane.CalcScaleFactor() ); -// else if ( this is HiLowBarItem && pane._barSettings.Type != BarType.ClusterHiLow ) -// barWidth = (float) ( ((HiLowBarItem)this).Bar.GetBarWidth( pane, -// ((HiLowBarItem)this).BaseAxis(pane), pane.CalcScaleFactor() ) ); -// barWidth = (float) ( ((HiLowBarItem)this).Bar.Size * -// pane.CalcScaleFactor() ); - else // BarItem or LineItem - { - // For stacked bar types, the bar width will be based on a single bar - float numBars = 1.0F; - if ( pane._barSettings.Type == BarType.Cluster ) - numBars = pane.CurveList.NumClusterableBars; - - float denom = numBars * ( 1.0F + pane._barSettings.MinBarGap ) - - pane._barSettings.MinBarGap + pane._barSettings.MinClusterGap; - if ( denom <= 0 ) - denom = 1; - barWidth = pane.BarSettings.GetClusterWidth() / denom; - } - - if ( barWidth <= 0 ) - return 1; - - return barWidth; - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - abstract public bool GetCoords( GraphPane pane, int i, out string coords ); - - #endregion - - #region Inner classes - - #if ( DOTNET1 ) // Is this a .Net 1.1 compilation? - - /// - /// Compares 's based on the point value at the specified - /// index and for the specified axis. - /// - /// - public class Comparer : IComparer - { - private int index; - private SortType sortType; - - /// - /// Constructor for Comparer. - /// - /// The axis type on which to sort. - /// The index number of the point on which to sort - public Comparer( SortType type, int index ) - { - this.sortType = type; - this.index = index; - } - - /// - /// Compares two s using the previously specified index value - /// and axis. Sorts in descending order. - /// - /// Curve to the left. - /// Curve to the right. - /// -1, 0, or 1 depending on l.X's relation to r.X - public int Compare( object l, object r ) - { - CurveItem cl = (CurveItem) l; - CurveItem cr = (CurveItem) r; - - if (cl == null && cr == null ) - return 0; - else if (cl == null && cr != null ) - return -1; - else if (cl != null && cr == null) - return 1; - - if ( cr != null && cr.NPts <= index ) - cr = null; - if ( cl != null && cl.NPts <= index ) - cl = null; - - double lVal, rVal; - - if ( sortType == SortType.XValues ) - { - lVal = ( l != null ) ? System.Math.Abs( cl[index].X ) : PointPair.Missing; - rVal = ( r != null ) ? System.Math.Abs( cr[index].X ) : PointPair.Missing; - } - else - { - lVal = ( l != null ) ? System.Math.Abs( cl[index].Y ) : PointPair.Missing; - rVal = ( r != null ) ? System.Math.Abs( cr[index].Y ) : PointPair.Missing; - } - - if ( lVal == PointPair.Missing || Double.IsInfinity( lVal ) || Double.IsNaN( lVal ) ) - cl = null; - if ( rVal == PointPair.Missing || Double.IsInfinity( rVal ) || Double.IsNaN( rVal ) ) - cr = null; - - if ( ( cl == null && cr == null) || ( System.Math.Abs( lVal - rVal ) < 1e-10 ) ) - return 0; - else if ( cl == null && cr != null ) - return -1; - else if ( cl != null && r == null ) - return 1; - else - return rVal < lVal ? -1 : 1; - } - } - -#else // Otherwise, it's .Net 2.0 so use generics - - /// - /// Compares 's based on the point value at the specified - /// index and for the specified axis. - /// - /// - public class Comparer : IComparer - { - private int index; - private SortType sortType; - - /// - /// Constructor for Comparer. - /// - /// The axis type on which to sort. - /// The index number of the point on which to sort - public Comparer( SortType type, int index ) - { - this.sortType = type; - this.index = index; - } - - /// - /// Compares two s using the previously specified index value - /// and axis. Sorts in descending order. - /// - /// Curve to the left. - /// Curve to the right. - /// -1, 0, or 1 depending on l.X's relation to r.X - public int Compare( CurveItem l, CurveItem r ) - { - if (l == null && r == null ) - return 0; - else if (l == null && r != null ) - return -1; - else if (l != null && r == null) - return 1; - - if ( r != null && r.NPts <= index ) - r = null; - if ( l != null && l.NPts <= index ) - l = null; - - double lVal, rVal; - - if ( sortType == SortType.XValues ) - { - lVal = ( l != null ) ? System.Math.Abs( l[index].X ) : PointPair.Missing; - rVal = ( r != null ) ? System.Math.Abs( r[index].X ) : PointPair.Missing; - } - else - { - lVal = ( l != null ) ? System.Math.Abs( l[index].Y ) : PointPair.Missing; - rVal = ( r != null ) ? System.Math.Abs( r[index].Y ) : PointPair.Missing; - } - - if ( lVal == PointPair.Missing || Double.IsInfinity( lVal ) || Double.IsNaN( lVal ) ) - l = null; - if ( rVal == PointPair.Missing || Double.IsInfinity( rVal ) || Double.IsNaN( rVal ) ) - r = null; - - if ( (l == null && r == null) || ( System.Math.Abs( lVal - rVal ) < 1e-10 ) ) - return 0; - else if (l == null && r != null ) - return -1; - else if (l != null && r == null) - return 1; - else - return rVal < lVal ? -1 : 1; - } - } - - #endif - - #endregion - - } -} - - - diff --git a/SDK/ZedGraphs/ZedGraph/CurveList.cs b/SDK/ZedGraphs/ZedGraph/CurveList.cs deleted file mode 100644 index 4182822..0000000 --- a/SDK/ZedGraphs/ZedGraph/CurveList.cs +++ /dev/null @@ -1,745 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections.Generic; - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects - /// that define the set of curves to be displayed on the graph. - /// - /// - /// John Champion - /// modified by Jerry Vos - /// $Revision: 3.43 $ $Date: 2007-11-03 04:41:28 $ - [Serializable] - public class CurveList : List, ICloneable - { - - #region Properties - // internal temporary value that keeps - // the max number of points for any curve - // associated with this curveList - private int maxPts; - - /// - /// Read only value for the maximum number of points in any of the curves - /// in the list. - /// - public int MaxPts - { - get { return maxPts; } - } - - /// - /// Read only property that returns the number of curves in the list that are of - /// type . This does not include or - /// types. - /// - public int NumBars - { - get - { - int count = 0; - foreach ( CurveItem curve in this ) - { - if ( curve.IsBar ) - count++; - } - - return count; - } - } - - /// - /// Read only property that returns the number of curves in the list that are - /// potentially "clusterable", which includes and - /// types. This does not include , - /// , , etc. types. - /// - /// Note that this property is only the number of bars that COULD BE clustered. The - /// actual cluster settings are not considered. - public int NumClusterableBars - { - get - { - int count = 0; - foreach ( CurveItem curve in this ) - { - if ( curve.IsBar || curve is HiLowBarItem ) - count++; - } - - return count; - } - } - - - - /// - /// Read only property that returns the number of pie slices in the list (class type is - /// ). - /// - public int NumPies - { - get - { - int count = 0; - foreach ( CurveItem curve in this ) - { - if ( curve.IsPie ) - count++; - } - - return count; - } - } - - /// - /// Read only property that determines if all items in the are - /// Pies. - /// - public bool IsPieOnly - { - get - { - bool hasPie = false; - foreach ( CurveItem curve in this ) - { - if ( !curve.IsPie ) - return false; - else - hasPie = true; - } - return hasPie; - } - } - - /// - /// Determine if there is any data in any of the - /// objects for this graph. This method does not verify valid data, it - /// only checks to see if > 0. - /// - /// true if there is any data, false otherwise - public bool HasData() - { - foreach( CurveItem curve in this ) - { - if ( curve.Points.Count > 0 ) - return true; - } - return false; - } - #endregion - - #region Constructors - - /// - /// Default constructor for the collection class - /// - public CurveList() - { - maxPts = 1; - } - - /// - /// The Copy Constructor - /// - /// The XAxis object from which to copy - public CurveList( CurveList rhs ) - { - this.maxPts = rhs.maxPts; - - foreach ( CurveItem item in rhs ) - { - this.Add( (CurveItem) ((ICloneable)item).Clone() ); - } - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public CurveList Clone() - { - return new CurveList( this ); - } - - - #endregion - - #region IEnumerable Methods - - //CJBL - /// - /// Iterate backwards through the items. - /// - public IEnumerable Backward - { - get - { - for ( int i = this.Count - 1; i >= 0; i-- ) - yield return this[i]; - } - } - /// - /// Iterate forward through the items. - /// - public IEnumerable Forward - { - get - { - for ( int i = 0; i < this.Count; i++ ) - yield return this[i]; - } - } - - #endregion - - #region List Methods -/* - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public CurveItem this[ int index ] - { - get { return( (CurveItem) List[index] ); } - set { List[index] = value; } - } -*/ - /// - /// Indexer to access the specified object by - /// its string. - /// - /// The string label of the - /// object to be accessed. - /// A object reference. - public CurveItem this[ string label ] - { - get - { - int index = IndexOf( label ); - if ( index >= 0 ) - return( this[index] ); - else - return null; - } - } -/* - /// - /// Add a object to the collection at the end of the list. - /// - /// A reference to the object to - /// be added - /// - public void Add( CurveItem curve ) - { - List.Add( curve ); - } -*/ -/* - /// - /// Remove a object from the collection based on an object reference. - /// - /// A reference to the object that is to be - /// removed. - /// - public void Remove( CurveItem curve ) - { - List.Remove( curve ); - } -*/ -/* - /// - /// Insert a object into the collection at the specified - /// zero-based index location. - /// - /// The zero-based index location for insertion. - /// A reference to the object that is to be - /// inserted. - /// - public void Insert( int index, CurveItem curve ) - { - List.Insert( index, curve ); - } -*/ - - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// The label that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the is not in the list - /// - public int IndexOf( string label ) - { - int index = 0; - foreach ( CurveItem p in this ) - { - if ( String.Compare( p._label._text, label, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// In order for this method to work, the - /// property must be of type . - /// The tag that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the is not in the list - public int IndexOfTag( string tag ) - { - int index = 0; - foreach ( CurveItem p in this ) - { - if ( p.Tag is string && - String.Compare( (string) p.Tag, tag, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - /// - /// Sorts the list according to the point values at the specified index and - /// for the specified axis. - /// - public void Sort( SortType type, int index ) - { - this.Sort( new CurveItem.Comparer( type, index ) ); - } - - /// - /// Move the position of the object at the specified index - /// to the new relative position in the list. - /// For Graphic type objects, this method controls the - /// Z-Order of the items. Objects at the beginning of the list - /// appear in front of objects at the end of the list. - /// The zero-based index of the object - /// to be moved. - /// The relative number of positions to move - /// the object. A value of -1 will move the - /// object one position earlier in the list, a value - /// of 1 will move it one position later. To move an item to the - /// beginning of the list, use a large negative value (such as -999). - /// To move it to the end of the list, use a large positive value. - /// - /// The new position for the object, or -1 if the object - /// was not found. - public int Move( int index, int relativePos ) - { - if ( index < 0 || index >= Count ) - return -1; - - CurveItem curve = this[index]; - this.RemoveAt( index ); - - index += relativePos; - if ( index < 0 ) - index = 0; - if ( index > Count ) - index = Count; - - Insert( index, curve ); - return index; - } - - - - #endregion - - #region Rendering Methods - - /// - /// Go through each object in the collection, - /// calling the member to - /// determine the minimum and maximum values in the - /// list of data value pairs. If the curves include - /// a stack bar, handle within the current GetRange method. In the event that no - /// data are available, a default range of min=0.0 and max=1.0 are returned. - /// If the Y axis has a valid data range and the Y2 axis not, then the Y2 - /// range will be a duplicate of the Y range. Vice-versa for the Y2 axis - /// having valid data when the Y axis does not. - /// If any in the list has a missing - /// , a new empty one will be generated. - /// - /// ignoreInitial is a boolean value that - /// affects the data range that is considered for the automatic scale - /// ranging (see ). If true, then initial - /// data points where the Y value is zero are not included when - /// automatically determining the scale , - /// , and size. All data after - /// the first non-zero Y value are included. - /// - /// - /// Determines if the auto-scaled axis ranges will subset the - /// data points based on any manually set scale range values. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - public void GetRange( bool bIgnoreInitial, bool isBoundedRanges, GraphPane pane ) - { - double tXMinVal, - tXMaxVal, - tYMinVal, - tYMaxVal; - - InitScale( pane.XAxis.Scale, isBoundedRanges ); - InitScale( pane.X2Axis.Scale, isBoundedRanges ); - - foreach ( YAxis axis in pane.YAxisList ) - InitScale( axis.Scale, isBoundedRanges ); - - foreach ( Y2Axis axis in pane.Y2AxisList ) - InitScale( axis.Scale, isBoundedRanges ); - - maxPts = 1; - - // Loop over each curve in the collection and examine the data ranges - foreach ( CurveItem curve in this ) - { - if ( curve.IsVisible ) - { - // For stacked types, use the GetStackRange() method which accounts for accumulated values - // rather than simple curve values. - if ( ( ( curve is BarItem ) && ( pane._barSettings.Type == BarType.Stack || - pane._barSettings.Type == BarType.PercentStack ) ) || - ( ( curve is LineItem ) && pane.LineType == LineType.Stack ) ) - { - GetStackRange( pane, curve, out tXMinVal, out tYMinVal, - out tXMaxVal, out tYMaxVal ); - } - else - { - // Call the GetRange() member function for the current - // curve to get the min and max values - curve.GetRange( out tXMinVal, out tXMaxVal, - out tYMinVal, out tYMaxVal, bIgnoreInitial, true, pane ); - } - - // isYOrd is true if the Y axis is an ordinal type - Scale yScale = curve.GetYAxis( pane ).Scale; - - Scale xScale = curve.GetXAxis( pane ).Scale; - bool isYOrd = yScale.IsAnyOrdinal; - // isXOrd is true if the X axis is an ordinal type - bool isXOrd = xScale.IsAnyOrdinal; - - // For ordinal Axes, the data range is just 1 to Npts - if ( isYOrd && !curve.IsOverrideOrdinal ) - { - tYMinVal = 1.0; - tYMaxVal = curve.NPts; - } - if ( isXOrd && !curve.IsOverrideOrdinal ) - { - tXMinVal = 1.0; - tXMaxVal = curve.NPts; - } - - // Bar types always include the Y=0 value - if ( curve.IsBar ) - { - if ( pane._barSettings.Base == BarBase.X || - pane._barSettings.Base == BarBase.X2 ) - { - // Only force z=0 for BarItems, not HiLowBarItems - if ( ! (curve is HiLowBarItem) ) - { - if ( tYMinVal > 0 ) - tYMinVal = 0; - else if ( tYMaxVal < 0 ) - tYMaxVal = 0; - } - - // for non-ordinal axes, expand the data range slightly for bar charts to - // account for the fact that the bar clusters have a width - if ( !isXOrd ) - { - tXMinVal -= pane._barSettings._clusterScaleWidth / 2.0; - tXMaxVal += pane._barSettings._clusterScaleWidth / 2.0; - } - } - else - { - // Only force z=0 for BarItems, not HiLowBarItems - if ( !( curve is HiLowBarItem ) ) - { - if ( tXMinVal > 0 ) - tXMinVal = 0; - else if ( tXMaxVal < 0 ) - tXMaxVal = 0; - } - - // for non-ordinal axes, expand the data range slightly for bar charts to - // account for the fact that the bar clusters have a width - if ( !isYOrd ) - { - tYMinVal -= pane._barSettings._clusterScaleWidth / 2.0; - tYMaxVal += pane._barSettings._clusterScaleWidth / 2.0; - } - } - } - - // determine which curve has the maximum number of points - if ( curve.NPts > maxPts ) - maxPts = curve.NPts; - - // If the min and/or max values from the current curve - // are the absolute min and/or max, then save the values - // Also, differentiate between Y and Y2 values - - if ( tYMinVal < yScale._rangeMin ) - yScale._rangeMin = tYMinVal; - if ( tYMaxVal > yScale._rangeMax ) - yScale._rangeMax = tYMaxVal; - - - if ( tXMinVal < xScale._rangeMin ) - xScale._rangeMin = tXMinVal; - if ( tXMaxVal > xScale._rangeMax ) - xScale._rangeMax = tXMaxVal; - } - } - - pane.XAxis.Scale.SetRange( pane, pane.XAxis ); - pane.X2Axis.Scale.SetRange( pane, pane.X2Axis ); - - foreach ( YAxis axis in pane.YAxisList ) - axis.Scale.SetRange( pane, axis ); - foreach ( Y2Axis axis in pane.Y2AxisList ) - axis.Scale.SetRange( pane, axis ); - } - - private void InitScale( Scale scale, bool isBoundedRanges ) - { - scale._rangeMin = double.MaxValue; - scale._rangeMax = double.MinValue; - scale._lBound = ( isBoundedRanges && !scale._minAuto ) ? - scale._min : double.MinValue; - scale._uBound = ( isBoundedRanges && !scale._maxAuto ) ? - scale._max : double.MaxValue; - } - - /// - /// Calculate the range for stacked bars and lines. - /// - /// This method is required for the stacked - /// types because (for bars), the negative values are a separate stack than the positive - /// values. If you just sum up the bars, you will get the sum of the positive plus negative, - /// which is less than the maximum positive value and greater than the maximum negative value. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The for which to calculate the range - /// The minimum X value so far - /// The minimum Y value so far - /// The maximum X value so far - /// The maximum Y value so far - /// - private void GetStackRange( GraphPane pane, CurveItem curve, out double tXMinVal, - out double tYMinVal, out double tXMaxVal, out double tYMaxVal ) - { - // initialize the values to outrageous ones to start - tXMinVal = tYMinVal = Double.MaxValue; - tXMaxVal = tYMaxVal = Double.MinValue; - - ValueHandler valueHandler = new ValueHandler( pane, false ); - Axis baseAxis = curve.BaseAxis( pane ); - bool isXBase = baseAxis is XAxis || baseAxis is X2Axis; - - double lowVal, baseVal, hiVal; - - for ( int i=0; i tXMaxVal ) - tXMaxVal = x; - if ( y < tYMinVal ) - tYMinVal = y; - if ( y > tYMaxVal ) - tYMaxVal = y; - - if ( !isXBase ) - { - if ( lowVal < tXMinVal ) - tXMinVal = lowVal; - if ( lowVal > tXMaxVal ) - tXMaxVal = lowVal; - } - else - { - if ( lowVal < tYMinVal ) - tYMinVal = lowVal; - if ( lowVal > tYMaxVal ) - tYMaxVal = lowVal; - } - } - } - } - - /// - /// Render all the objects in the list to the - /// specified - /// device by calling the member function of - /// each object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void Draw( Graphics g, GraphPane pane, float scaleFactor ) - { - // Configure the accumulator for stacked bars - //Bar.ResetBarStack(); - - // Count the number of BarItems in the curvelist - int pos = this.NumBars; - - // sorted overlay bars are a special case, since they are sorted independently at each - // ordinal position. - if ( pane._barSettings.Type == BarType.SortedOverlay ) - { - // First, create a new curveList with references (not clones) of the curves - CurveList tempList = new CurveList(); - foreach ( CurveItem curve in this ) - if ( curve.IsBar ) - tempList.Add( (CurveItem) curve ); - - // Loop through the bars, graphing each ordinal position separately - for ( int i=0; i= 0; i-- ) - { - CurveItem curve = this[i]; - - if ( curve.IsBar) - pos--; - - // Render the curve - - // if it's a sorted overlay bar type, it's already been done above - if ( !( curve.IsBar && pane._barSettings.Type == BarType.SortedOverlay ) ) - { - curve.Draw( g, pane, pos, scaleFactor ); - } - } - } - - - /// - /// Find the ordinal position of the specified within - /// the . This position only counts - /// types, ignoring all other types. - /// - /// The of interest - /// The for which to search. - /// The ordinal position of the specified bar, or -1 if the bar - /// was not found. - public int GetBarItemPos( GraphPane pane, BarItem barItem ) - { - if ( pane._barSettings.Type == BarType.Overlay || - pane._barSettings.Type == BarType.Stack || - pane._barSettings.Type == BarType.PercentStack) - return 0; - - int i = 0; - foreach ( CurveItem curve in this ) - { - if ( curve == barItem ) - return i; - else if ( curve is BarItem ) - i++; - } - - return -1; - } - - #endregion - - } -} - - diff --git a/SDK/ZedGraphs/ZedGraph/DataSourcePointList.cs b/SDK/ZedGraphs/ZedGraph/DataSourcePointList.cs deleted file mode 100644 index 1e32847..0000000 --- a/SDK/ZedGraphs/ZedGraph/DataSourcePointList.cs +++ /dev/null @@ -1,304 +0,0 @@ -//============================================================================ -//DataSourcePointList Class -//Copyright 2006 John Champion, Jerry Vos -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections; -using System.ComponentModel; -using System.Reflection; -using System.Windows.Forms; -using System.Data; - -namespace ZedGraph -{ - /// - /// - /// - /// - /// - /// - /// John Champion - /// $Revision: 3.7 $ $Date: 2007-11-05 04:33:26 $ - [Serializable] - public class DataSourcePointList : IPointList - { - private BindingSource _bindingSource; - - //private object _dataSource = null; - private string _xDataMember = null; - private string _yDataMember = null; - private string _zDataMember = null; - private string _tagDataMember = null; - - #region Properties - - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public PointPair this[int index] - { - get - { - if ( index < 0 || index >= _bindingSource.Count ) - throw new System.ArgumentOutOfRangeException( "Error: Index out of range" ); - - object row = _bindingSource[index]; - - double x = GetDouble( row, _xDataMember, index ); - double y = GetDouble( row, _yDataMember, index ); - double z = GetDouble( row, _zDataMember, index ); - object tag = GetObject( row, _tagDataMember ); - - PointPair pt = new PointPair( x, y, z ); - pt.Tag = tag; - return pt; - } - } - - /// - /// gets the number of points available in the list - /// - public int Count - { - get - { - if ( _bindingSource != null ) - return _bindingSource.Count; - else - return 0; - } - } - - /// - /// The object from which to get the bound data - /// - /// - /// Typically, you set the - /// property to a reference to your database, table or list object. The - /// property would be set - /// to the name of the datatable within the - /// , - /// if applicable. - public BindingSource BindingSource - { - get { return _bindingSource; } - } - - /// - /// The table or list object from which to extract the data values. - /// - /// - /// This property is just an alias for - /// . - /// - public object DataSource - { - get { return _bindingSource.DataSource; } - set { _bindingSource.DataSource = value; } - } - - /// - /// The name of the property or column from which to obtain the - /// X data values for the chart. - /// - /// Set this to null leave the X data values set to - /// - public string XDataMember - { - get { return _xDataMember; } - set { _xDataMember = value; } - } - - /// - /// The name of the property or column from which to obtain the - /// Y data values for the chart. - /// - /// Set this to null leave the Y data values set to - /// - public string YDataMember - { - get { return _yDataMember; } - set { _yDataMember = value; } - } - - /// - /// The name of the property or column from which to obtain the - /// Z data values for the chart. - /// - /// Set this to null leave the Z data values set to - /// - public string ZDataMember - { - get { return _zDataMember; } - set { _zDataMember = value; } - } - - /// - /// The name of the property or column from which to obtain the - /// tag values for the chart. - /// - /// Set this to null leave the tag values set to null. If this references string - /// data, then the tags may be used as tooltips using the - /// option. - /// - public string TagDataMember - { - get { return _tagDataMember; } - set { _tagDataMember = value; } - } - - #endregion - - #region Constructors - - /// - /// Default Constructor - /// - public DataSourcePointList() - { - _bindingSource = new BindingSource(); - _xDataMember = string.Empty; - _yDataMember = string.Empty; - _zDataMember = string.Empty; - _tagDataMember = string.Empty; - } - - /// - /// Constructor to initialize the DataSourcePointList from an - /// existing - /// - public DataSourcePointList( DataSourcePointList rhs ) - : this() - { - _bindingSource.DataSource = rhs._bindingSource.DataSource; - if ( rhs._xDataMember != null ) - _xDataMember = (string)rhs._xDataMember.Clone(); - if ( rhs._yDataMember != null ) - _yDataMember = (string)rhs._yDataMember.Clone(); - if ( rhs._zDataMember != null ) - _zDataMember = (string)rhs._zDataMember.Clone(); - if ( rhs._tagDataMember != null ) - _tagDataMember = (string)rhs._tagDataMember.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public DataSourcePointList Clone() - { - return new DataSourcePointList( this ); - } - - - #endregion - - #region Methods - - /// - /// Extract a double value from the specified table row or data object with the - /// specified column name. - /// - /// The data object from which to extract the value - /// The property name or column name of the value - /// to be extracted - /// The zero-based index of the point to be extracted. - /// - private double GetDouble( object row, string dataMember, int index ) - { - if ( dataMember == null || dataMember == string.Empty ) - return index + 1; - - //Type myType = row.GetType(); - DataRowView drv = row as DataRowView; - PropertyInfo pInfo = null; - if ( drv == null ) - pInfo = row.GetType().GetProperty( dataMember ); - - object val = null; - - if ( pInfo != null ) - val = pInfo.GetValue( row, null ); - else if ( drv != null ) - val = drv[dataMember]; - else if ( pInfo == null ) - throw new System.Exception( "Can't find DataMember '" + dataMember + "' in DataSource" ); - - // if ( val == null ) - // throw new System.Exception( "Can't find DataMember '" + dataMember + "' in DataSource" ); - - double x; - if ( val == null || val == DBNull.Value ) - x = PointPair.Missing; - else if ( val.GetType() == typeof( DateTime ) ) - x = ( (DateTime)val ).ToOADate(); - else if ( val.GetType() == typeof( string ) ) - x = index + 1; - else - x = Convert.ToDouble( val ); - - return x; - } - - /// - /// Extract an object from the specified table row or data object with the - /// specified column name. - /// - /// The data object from which to extract the object - /// The property name or column name of the object - /// to be extracted - private object GetObject( object row, string dataMember ) - { - if ( dataMember == null || dataMember == string.Empty ) - return null; - - PropertyInfo pInfo = row.GetType().GetProperty( dataMember ); - DataRowView drv = row as DataRowView; - - object val = null; - - if ( pInfo != null ) - val = pInfo.GetValue( row, null ); - else if ( drv != null ) - val = drv[dataMember]; - - if ( val == null ) - throw new System.Exception( "Can't find DataMember '" + dataMember + "' in DataSource" ); - - return val; - } - - - #endregion - } -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/DateAsOrdinalScale.cs b/SDK/ZedGraphs/ZedGraph/DateAsOrdinalScale.cs deleted file mode 100644 index c76da8a..0000000 --- a/SDK/ZedGraphs/ZedGraph/DateAsOrdinalScale.cs +++ /dev/null @@ -1,339 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The DateAsOrdinalScale class inherits from the class, and implements - /// the features specific to . - /// - /// DateAsOrdinalScale is an ordinal axis that will have labels formatted with dates from the - /// actual data values of the first in the . - /// Although the tics are labeled with real data values, the actual points will be - /// evenly-spaced in spite of the data values. For example, if the X values of the first curve - /// are 1, 5, and 100, then the tic labels will show 1, 5, and 100, but they will be equal - /// distance from each other. - /// - /// - /// John Champion - /// $Revision: 1.13 $ $Date: 2007-11-28 02:38:22 $ - [Serializable] - class DateAsOrdinalScale : Scale, ISerializable //, ICloneable - { - - #region constructors - - /// - /// Default constructor that defines the owner - /// (containing object) for this new object. - /// - /// The owner, or containing object, of this instance - public DateAsOrdinalScale( Axis owner ) - : base( owner ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - /// The object that will own the - /// new instance of - public DateAsOrdinalScale( Scale rhs, Axis owner ) - : base( rhs, owner ) - { - } - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - public override Scale Clone( Axis owner ) - { - return new DateAsOrdinalScale( this, owner ); - } - - #endregion - - #region properties - - /// - /// Return the for this , which is - /// . - /// - public override AxisType Type - { - get { return AxisType.DateAsOrdinal; } - } - - /// - /// Gets or sets the minimum value for this scale. - /// - /// - /// The set property is specifically adapted for scales, - /// in that it automatically limits the value to the range of valid dates for the - /// struct. - /// - public override double Min - { - get { return _min; } - set { _min = XDate.MakeValidDate( value ); _minAuto = false; } - } - - /// - /// Gets or sets the maximum value for this scale. - /// - /// - /// The set property is specifically adapted for scales, - /// in that it automatically limits the value to the range of valid dates for the - /// struct. - /// - public override double Max - { - get { return _max; } - set { _max = XDate.MakeValidDate( value ); _maxAuto = false; } - } - - #endregion - - #region methods - - /// - /// Select a reasonable ordinal axis scale given a range of data values, with the expectation that - /// dates will be displayed. - /// - /// - /// This method only applies to type axes, and it - /// is called by the general method. For this type, - /// the first curve is the "master", which contains the dates to be applied. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to scale minor step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// - override public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - // call the base class first - base.PickScale( pane, g, scaleFactor ); - -/* // First, get the date ranges from the first curve in the list - double xMin; // = Double.MaxValue; - double xMax; // = Double.MinValue; - double yMin; // = Double.MaxValue; - double yMax; // = Double.MinValue; - double range = 1; - - foreach ( CurveItem curve in pane.CurveList ) - { - if ( ( _ownerAxis is Y2Axis && curve.IsY2Axis ) || - ( _ownerAxis is YAxis && !curve.IsY2Axis ) || - ( _ownerAxis is X2Axis && curve.IsX2Axis ) || - ( _ownerAxis is XAxis && !curve.IsX2Axis ) ) - { - curve.GetRange( out xMin, out xMax, out yMin, out yMax, false, pane.IsBoundedRanges, pane ); - if ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) - range = xMax - xMin; - else - range = yMax - yMin; - } - } -*/ - // Set the DateFormat by calling CalcDateStepSize - // DateScale.CalcDateStepSize( range, Default.TargetXSteps, this ); - SetDateFormat( pane ); - - // Now, set the axis range based on a ordinal scale - base.PickScale( pane, g, scaleFactor ); - OrdinalScale.PickScale( pane, g, scaleFactor, this ); - } - - internal void SetDateFormat( GraphPane pane ) - { - if ( _formatAuto ) - { - double range = 10; - - if ( pane.CurveList.Count > 0 && pane.CurveList[0].Points.Count > 1 ) - { - double val1, val2; - - PointPair pt1 = pane.CurveList[0].Points[0]; - PointPair pt2 = pane.CurveList[0].Points[pane.CurveList[0].Points.Count - 1]; - int p1 = 1; - int p2 = pane.CurveList[0].Points.Count; - if ( pane.IsBoundedRanges ) - { - p1 = (int) Math.Floor( _ownerAxis.Scale.Min ); - p2 = (int) Math.Ceiling( _ownerAxis.Scale.Max ); - p1 = Math.Min( Math.Max( p1, 1 ), pane.CurveList[0].Points.Count ); - p2 = Math.Min( Math.Max( p2, 1 ), pane.CurveList[0].Points.Count ); - if ( p2 > p1 ) - { - pt1 = pane.CurveList[0].Points[p1-1]; - pt2 = pane.CurveList[0].Points[p2-1]; - } - } - if ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) - { - val1 = pt1.X; - val2 = pt2.X; - } - else - { - val1 = pt1.Y; - val2 = pt2.Y; - } - - if ( val1 != PointPair.Missing && - val2 != PointPair.Missing && - !Double.IsNaN( val1 ) && - !Double.IsNaN( val2 ) && - !Double.IsInfinity( val1 ) && - !Double.IsInfinity( val2 ) && - Math.Abs( val2 - val1 ) > 1e-10 ) - range = Math.Abs( val2 - val1 ); - } - - if ( range > Default.RangeYearYear ) - _format = Default.FormatYearYear; - else if ( range > Default.RangeYearMonth ) - _format = Default.FormatYearMonth; - else if ( range > Default.RangeMonthMonth ) - _format = Default.FormatMonthMonth; - else if ( range > Default.RangeDayDay ) - _format = Default.FormatDayDay; - else if ( range > Default.RangeDayHour ) - _format = Default.FormatDayHour; - else if ( range > Default.RangeHourHour ) - _format = Default.FormatHourHour; - else if ( range > Default.RangeHourMinute ) - _format = Default.FormatHourMinute; - else if ( range > Default.RangeMinuteMinute ) - _format = Default.FormatMinuteMinute; - else if ( range > Default.RangeMinuteSecond ) - _format = Default.FormatMinuteSecond; - else if ( range > Default.RangeSecondSecond ) - _format = Default.FormatSecondSecond; - else // MilliSecond - _format = Default.FormatMillisecond; - } - } - - /// - /// Make a value label for an . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log - /// () - /// and text () type axes. - /// - /// The resulting value label as a - override internal string MakeLabel( GraphPane pane, int index, double dVal ) - { - if ( _format == null ) - _format = Scale.Default.Format; - - double val; - - int tmpIndex = (int) dVal - 1; - - if ( pane.CurveList.Count > 0 && pane.CurveList[0].Points.Count > tmpIndex ) - { - if ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) - val = pane.CurveList[0].Points[tmpIndex].X; - else - val = pane.CurveList[0].Points[tmpIndex].Y; - return XDate.ToString( val, _format ); - } - else - return string.Empty; - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected DateAsOrdinalScale( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/DateScale.cs b/SDK/ZedGraphs/ZedGraph/DateScale.cs deleted file mode 100644 index 661724f..0000000 --- a/SDK/ZedGraphs/ZedGraph/DateScale.cs +++ /dev/null @@ -1,947 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The DateScale class inherits from the class, and implements - /// the features specific to . - /// - /// - /// DateScale is a cartesian axis with calendar dates or times. The actual data values should - /// be created with the type, which is directly translatable to a - /// type for storage in the point value arrays. - /// - /// - /// John Champion - /// $Revision: 1.15 $ $Date: 2007-09-19 06:41:56 $ - [Serializable] - class DateScale : Scale, ISerializable //, ICloneable - { - - #region constructors - - /// - /// Default constructor that defines the owner - /// (containing object) for this new object. - /// - /// The owner, or containing object, of this instance - public DateScale( Axis owner ) - : base( owner ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - /// The object that will own the - /// new instance of - public DateScale( Scale rhs, Axis owner ) - : base( rhs, owner ) - { - } - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - public override Scale Clone( Axis owner ) - { - return new DateScale( this, owner ); - } - - #endregion - - #region properties - - /// - /// Return the for this , which is - /// . - /// - public override AxisType Type - { - get { return AxisType.Date; } - } - - /// - /// Gets or sets the minimum value for this scale. - /// - /// - /// The set property is specifically adapted for scales, - /// in that it automatically limits the value to the range of valid dates for the - /// struct. - /// - public override double Min - { - get { return _min; } - set { _min = XDate.MakeValidDate( value ); _minAuto = false; } - } - - /// - /// Gets or sets the maximum value for this scale. - /// - /// - /// The set property is specifically adapted for scales, - /// in that it automatically limits the value to the range of valid dates for the - /// struct. - /// - public override double Max - { - get { return _max; } - set { _max = XDate.MakeValidDate( value ); _maxAuto = false; } - } - #endregion - - #region methods - - /// - /// Determine the value for any major tic. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// The value of the first major tic (floating point double) - /// - /// - /// The major tic number (0 = first major tic). For log scales, this is the actual power of 10. - /// - /// - /// The specified major tic value (floating point double). - /// - override internal double CalcMajorTicValue( double baseVal, double tic ) - { - XDate xDate = new XDate( baseVal ); - - switch ( _majorUnit ) - { - case DateUnit.Year: - default: - xDate.AddYears( tic * _majorStep ); - break; - case DateUnit.Month: - xDate.AddMonths( tic * _majorStep ); - break; - case DateUnit.Day: - xDate.AddDays( tic * _majorStep ); - break; - case DateUnit.Hour: - xDate.AddHours( tic * _majorStep ); - break; - case DateUnit.Minute: - xDate.AddMinutes( tic * _majorStep ); - break; - case DateUnit.Second: - xDate.AddSeconds( tic * _majorStep ); - break; - case DateUnit.Millisecond: - xDate.AddMilliseconds( tic * _majorStep ); - break; - } - - return xDate.XLDate; - } - - /// - /// Determine the value for any minor tic. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// The value of the first major tic (floating point double). This tic value is the base - /// reference for all tics (including minor ones). - /// - /// - /// The major tic number (0 = first major tic). For log scales, this is the actual power of 10. - /// - /// - /// The specified minor tic value (floating point double). - /// - override internal double CalcMinorTicValue( double baseVal, int iTic ) - { - XDate xDate = new XDate( baseVal ); - - switch ( _minorUnit ) - { - case DateUnit.Year: - default: - xDate.AddYears( (double) iTic * _minorStep ); - break; - case DateUnit.Month: - xDate.AddMonths( (double) iTic * _minorStep ); - break; - case DateUnit.Day: - xDate.AddDays( (double) iTic * _minorStep ); - break; - case DateUnit.Hour: - xDate.AddHours( (double) iTic * _minorStep ); - break; - case DateUnit.Minute: - xDate.AddMinutes( (double) iTic * _minorStep ); - break; - case DateUnit.Second: - xDate.AddSeconds( (double) iTic * _minorStep ); - break; - } - - return xDate.XLDate; - } - - /// - /// Internal routine to determine the ordinals of the first minor tic mark - /// - /// - /// The value of the first major tic for the axis. - /// - /// - /// The ordinal position of the first minor tic, relative to the first major tic. - /// This value can be negative (e.g., -3 means the first minor tic is 3 minor step - /// increments before the first major tic. - /// - override internal int CalcMinorStart( double baseVal ) - { - switch ( _minorUnit ) - { - case DateUnit.Year: - default: - return (int) ( ( _min - baseVal ) / ( 365.0 * _minorStep ) ); - case DateUnit.Month: - return (int) ( ( _min - baseVal ) / ( 28.0 * _minorStep ) ); - case DateUnit.Day: - return (int) ( ( _min - baseVal ) / _minorStep ); - case DateUnit.Hour: - return (int) ( ( _min - baseVal ) * XDate.HoursPerDay / _minorStep ); - case DateUnit.Minute: - return (int) ( ( _min - baseVal ) * XDate.MinutesPerDay / _minorStep ); - case DateUnit.Second: - return (int) ( ( _min - baseVal ) * XDate.SecondsPerDay / _minorStep ); - } - } - - /// - /// Determine the value for the first major tic. - /// - /// - /// This is done by finding the first possible value that is an integral multiple of - /// the step size, taking into account the date/time units if appropriate. - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// First major tic value (floating point double). - /// - override internal double CalcBaseTic() - { - if ( _baseTic != PointPair.Missing ) - return _baseTic; - else - { - int year, month, day, hour, minute, second, millisecond; - XDate.XLDateToCalendarDate( _min, out year, out month, out day, out hour, out minute, - out second, out millisecond ); - switch ( _majorUnit ) - { - case DateUnit.Year: - default: - month = 1; day = 1; hour = 0; minute = 0; second = 0; millisecond = 0; - break; - case DateUnit.Month: - day = 1; hour = 0; minute = 0; second = 0; millisecond = 0; - break; - case DateUnit.Day: - hour = 0; minute = 0; second = 0; millisecond = 0; - break; - case DateUnit.Hour: - minute = 0; second = 0; millisecond = 0; - break; - case DateUnit.Minute: - second = 0; millisecond = 0; - break; - case DateUnit.Second: - millisecond = 0; - break; - case DateUnit.Millisecond: - break; - - } - - double xlDate = XDate.CalendarDateToXLDate( year, month, day, hour, minute, second, millisecond ); - if ( xlDate < _min ) - { - switch ( _majorUnit ) - { - case DateUnit.Year: - default: - year++; - break; - case DateUnit.Month: - month++; - break; - case DateUnit.Day: - day++; - break; - case DateUnit.Hour: - hour++; - break; - case DateUnit.Minute: - minute++; - break; - case DateUnit.Second: - second++; - break; - case DateUnit.Millisecond: - millisecond++; - break; - - } - - xlDate = XDate.CalendarDateToXLDate( year, month, day, hour, minute, second, millisecond ); - } - - return xlDate; - } - } - - /// - /// Internal routine to determine the ordinals of the first and last major axis label. - /// - /// - /// This is the total number of major tics for this axis. - /// - override internal int CalcNumTics() - { - int nTics = 1; - - int year1, year2, month1, month2, day1, day2, hour1, hour2, minute1, minute2; - int second1, second2, millisecond1, millisecond2; - - XDate.XLDateToCalendarDate( _min, out year1, out month1, out day1, - out hour1, out minute1, out second1, out millisecond1 ); - XDate.XLDateToCalendarDate( _max, out year2, out month2, out day2, - out hour2, out minute2, out second2, out millisecond2 ); - - switch ( _majorUnit ) - { - case DateUnit.Year: - default: - nTics = (int) ( ( year2 - year1 ) / _majorStep + 1.001 ); - break; - case DateUnit.Month: - nTics = (int) ( ( month2 - month1 + 12.0 * ( year2 - year1 ) ) / _majorStep + 1.001 ); - break; - case DateUnit.Day: - nTics = (int) ( ( _max - _min ) / _majorStep + 1.001 ); - break; - case DateUnit.Hour: - nTics = (int) ( ( _max - _min ) / ( _majorStep / XDate.HoursPerDay ) + 1.001 ); - break; - case DateUnit.Minute: - nTics = (int) ( ( _max - _min ) / ( _majorStep / XDate.MinutesPerDay ) + 1.001 ); - break; - case DateUnit.Second: - nTics = (int)( ( _max - _min ) / ( _majorStep / XDate.SecondsPerDay ) + 1.001 ); - break; - case DateUnit.Millisecond: - nTics = (int)( ( _max - _min ) / ( _majorStep / XDate.MillisecondsPerDay ) + 1.001 ); - break; - } - - if ( nTics < 1 ) - nTics = 1; - else if ( nTics > 1000 ) - nTics = 1000; - - return nTics; - } - - /// - /// Select a reasonable date-time axis scale given a range of data values. - /// - /// - /// This method only applies to type axes, and it - /// is called by the general method. The scale range is chosen - /// based on increments of 1, 2, or 5 (because they are even divisors of 10). - /// Note that the property setting can have multiple unit - /// types ( and ), - /// but the and - /// units are always days (). This - /// method honors the , , - /// and autorange settings. - /// In the event that any of the autorange settings are false, the - /// corresponding , , or - /// setting is explicitly honored, and the remaining autorange settings (if any) will - /// be calculated to accomodate the non-autoranged values. The basic default for - /// scale selection is defined with - /// and - /// from the default class. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to scale minor step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// - /// - /// - override public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - // call the base class first - base.PickScale( pane, g, scaleFactor ); - - // Test for trivial condition of range = 0 and pick a suitable default - if ( _max - _min < 1.0e-20 ) - { - if ( _maxAuto ) - _max = _max + 0.2 * ( _max == 0 ? 1.0 : Math.Abs( _max ) ); - if ( _minAuto ) - _min = _min - 0.2 * ( _min == 0 ? 1.0 : Math.Abs( _min ) ); - } - - double targetSteps = ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) ? - Default.TargetXSteps : Default.TargetYSteps; - - // Calculate the step size based on target steps - double tempStep = CalcDateStepSize( _max - _min, targetSteps ); - - // Calculate the new step size - if ( _majorStepAuto ) - { - _majorStep = tempStep; - - if ( _isPreventLabelOverlap ) - { - // Calculate the maximum number of labels - double maxLabels = (double) this.CalcMaxLabels( g, pane, scaleFactor ); - - if ( maxLabels < this.CalcNumTics() ) - _majorStep = CalcDateStepSize( _max - _min, maxLabels ); - } - } - - // Calculate the scale minimum - if ( _minAuto ) - _min = CalcEvenStepDate( _min, -1 ); - - // Calculate the scale maximum - if ( _maxAuto ) - _max = CalcEvenStepDate( _max, 1 ); - - _mag = 0; // Never use a magnitude shift for date scales - //this.numDec = 0; // The number of decimal places to display is not used - - } - - /// - /// Calculate a step size for a scale. - /// This method is used by . - /// - /// The range of data in units of days - /// The desired "typical" number of steps - /// to divide the range into - /// The calculated step size for the specified data range. Also - /// calculates and sets the values for , - /// , , and - /// - protected double CalcDateStepSize( double range, double targetSteps ) - { - return CalcDateStepSize( range, targetSteps, this ); - } - - /// - /// Calculate a step size for a scale. - /// This method is used by . - /// - /// The range of data in units of days - /// The desired "typical" number of steps - /// to divide the range into - /// - /// The object on which to calculate the Date step size. - /// The calculated step size for the specified data range. Also - /// calculates and sets the values for , - /// , , and - /// - internal static double CalcDateStepSize( double range, double targetSteps, Scale scale ) - { - // Calculate an initial guess at step size - double tempStep = range / targetSteps; - - if ( range > Default.RangeYearYear ) - { - scale._majorUnit = DateUnit.Year; - if ( scale._formatAuto ) - scale._format = Default.FormatYearYear; - - tempStep = Math.Ceiling( tempStep / 365.0 ); - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Year; - if ( tempStep == 1.0 ) - scale._minorStep = 0.25; - else - scale._minorStep = Scale.CalcStepSize( tempStep, targetSteps ); - } - } - else if ( range > Default.RangeYearMonth ) - { - scale._majorUnit = DateUnit.Year; - if ( scale._formatAuto ) - scale._format = Default.FormatYearMonth; - tempStep = Math.Ceiling( tempStep / 365.0 ); - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Month; - // Calculate the minor steps to give an estimated 4 steps - // per major step. - scale._minorStep = Math.Ceiling( range / ( targetSteps * 3 ) / 30.0 ); - // make sure the minorStep is 1, 2, 3, 6, or 12 months - if ( scale._minorStep > 6 ) - scale._minorStep = 12; - else if ( scale._minorStep > 3 ) - scale._minorStep = 6; - } - } - else if ( range > Default.RangeMonthMonth ) - { - scale._majorUnit = DateUnit.Month; - if ( scale._formatAuto ) - scale._format = Default.FormatMonthMonth; - tempStep = Math.Ceiling( tempStep / 30.0 ); - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Month; - scale._minorStep = tempStep * 0.25; - } - } - else if ( range > Default.RangeDayDay ) - { - scale._majorUnit = DateUnit.Day; - if ( scale._formatAuto ) - scale._format = Default.FormatDayDay; - tempStep = Math.Ceiling( tempStep ); - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Day; - scale._minorStep = tempStep * 0.25; - // make sure the minorStep is 1, 2, 3, 6, or 12 hours - } - } - else if ( range > Default.RangeDayHour ) - { - scale._majorUnit = DateUnit.Day; - if ( scale._formatAuto ) - scale._format = Default.FormatDayHour; - tempStep = Math.Ceiling( tempStep ); - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Hour; - // Calculate the minor steps to give an estimated 4 steps - // per major step. - scale._minorStep = Math.Ceiling( range / ( targetSteps * 3 ) * XDate.HoursPerDay ); - // make sure the minorStep is 1, 2, 3, 6, or 12 hours - if ( scale._minorStep > 6 ) - scale._minorStep = 12; - else if ( scale._minorStep > 3 ) - scale._minorStep = 6; - else - scale._minorStep = 1; - } - } - else if ( range > Default.RangeHourHour ) - { - scale._majorUnit = DateUnit.Hour; - tempStep = Math.Ceiling( tempStep * XDate.HoursPerDay ); - if ( scale._formatAuto ) - scale._format = Default.FormatHourHour; - - if ( tempStep > 12.0 ) - tempStep = 24.0; - else if ( tempStep > 6.0 ) - tempStep = 12.0; - else if ( tempStep > 2.0 ) - tempStep = 6.0; - else if ( tempStep > 1.0 ) - tempStep = 2.0; - else - tempStep = 1.0; - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Hour; - if ( tempStep <= 1.0 ) - scale._minorStep = 0.25; - else if ( tempStep <= 6.0 ) - scale._minorStep = 1.0; - else if ( tempStep <= 12.0 ) - scale._minorStep = 2.0; - else - scale._minorStep = 4.0; - } - } - else if ( range > Default.RangeHourMinute ) - { - scale._majorUnit = DateUnit.Hour; - tempStep = Math.Ceiling( tempStep * XDate.HoursPerDay ); - - if ( scale._formatAuto ) - scale._format = Default.FormatHourMinute; - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Minute; - // Calculate the minor steps to give an estimated 4 steps - // per major step. - scale._minorStep = Math.Ceiling( range / ( targetSteps * 3 ) * XDate.MinutesPerDay ); - // make sure the minorStep is 1, 5, 15, or 30 minutes - if ( scale._minorStep > 15.0 ) - scale._minorStep = 30.0; - else if ( scale._minorStep > 5.0 ) - scale._minorStep = 15.0; - else if ( scale._minorStep > 1.0 ) - scale._minorStep = 5.0; - else - scale._minorStep = 1.0; - } - } - else if ( range > Default.RangeMinuteMinute ) - { - scale._majorUnit = DateUnit.Minute; - if ( scale._formatAuto ) - scale._format = Default.FormatMinuteMinute; - - tempStep = Math.Ceiling( tempStep * XDate.MinutesPerDay ); - // make sure the minute step size is 1, 5, 15, or 30 minutes - if ( tempStep > 15.0 ) - tempStep = 30.0; - else if ( tempStep > 5.0 ) - tempStep = 15.0; - else if ( tempStep > 1.0 ) - tempStep = 5.0; - else - tempStep = 1.0; - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Minute; - if ( tempStep <= 1.0 ) - scale._minorStep = 0.25; - else if ( tempStep <= 5.0 ) - scale._minorStep = 1.0; - else - scale._minorStep = 5.0; - } - } - else if ( range > Default.RangeMinuteSecond ) - { - scale._majorUnit = DateUnit.Minute; - tempStep = Math.Ceiling( tempStep * XDate.MinutesPerDay ); - - if ( scale._formatAuto ) - scale._format = Default.FormatMinuteSecond; - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Second; - // Calculate the minor steps to give an estimated 4 steps - // per major step. - scale._minorStep = Math.Ceiling( range / ( targetSteps * 3 ) * XDate.SecondsPerDay ); - // make sure the minorStep is 1, 5, 15, or 30 seconds - if ( scale._minorStep > 15.0 ) - scale._minorStep = 30.0; - else if ( scale._minorStep > 5.0 ) - scale._minorStep = 15.0; - else if ( scale._minorStep > 1.0 ) - scale._minorStep = 5.0; - else - scale._minorStep = 1.0; - } - } - else if ( range > Default.RangeSecondSecond ) // SecondSecond - { - scale._majorUnit = DateUnit.Second; - if ( scale._formatAuto ) - scale._format = Default.FormatSecondSecond; - - tempStep = Math.Ceiling( tempStep * XDate.SecondsPerDay ); - // make sure the second step size is 1, 5, 15, or 30 seconds - if ( tempStep > 15.0 ) - tempStep = 30.0; - else if ( tempStep > 5.0 ) - tempStep = 15.0; - else if ( tempStep > 1.0 ) - tempStep = 5.0; - else - tempStep = 1.0; - - if ( scale._minorStepAuto ) - { - scale._minorUnit = DateUnit.Second; - if ( tempStep <= 1.0 ) - scale._minorStep = 0.25; - else if ( tempStep <= 5.0 ) - scale._minorStep = 1.0; - else - scale._minorStep = 5.0; - } - } - else // MilliSecond - { - scale._majorUnit = DateUnit.Millisecond; - if ( scale._formatAuto ) - scale._format = Default.FormatMillisecond; - - tempStep = CalcStepSize( range * XDate.MillisecondsPerDay, Default.TargetXSteps ); - - if ( scale._minorStepAuto ) - { - scale._minorStep = CalcStepSize( tempStep, - ( scale._ownerAxis is XAxis || scale._ownerAxis is X2Axis ) ? - Default.TargetMinorXSteps : Default.TargetMinorYSteps ); - scale._minorUnit = DateUnit.Millisecond; - } - } - - return tempStep; - } - - /// - /// Calculate a date that is close to the specified date and an - /// even multiple of the selected - /// for a scale. - /// This method is used by . - /// - /// The date which the calculation should be close to - /// The desired direction for the date to take. - /// 1 indicates the result date should be greater than the specified - /// date parameter. -1 indicates the other direction. - /// The calculated date - protected double CalcEvenStepDate( double date, int direction ) - { - int year, month, day, hour, minute, second, millisecond; - - XDate.XLDateToCalendarDate( date, out year, out month, out day, - out hour, out minute, out second, out millisecond ); - - // If the direction is -1, then it is sufficient to go to the beginning of - // the current time period, .e.g., for 15-May-95, and monthly steps, we - // can just back up to 1-May-95 - if ( direction < 0 ) - direction = 0; - - switch ( _majorUnit ) - { - case DateUnit.Year: - default: - // If the date is already an exact year, then don't step to the next year - if ( direction == 1 && month == 1 && day == 1 && hour == 0 - && minute == 0 && second == 0 ) - return date; - else - return XDate.CalendarDateToXLDate( year + direction, 1, 1, - 0, 0, 0 ); - case DateUnit.Month: - // If the date is already an exact month, then don't step to the next month - if ( direction == 1 && day == 1 && hour == 0 - && minute == 0 && second == 0 ) - return date; - else - return XDate.CalendarDateToXLDate( year, month + direction, 1, - 0, 0, 0 ); - case DateUnit.Day: - // If the date is already an exact Day, then don't step to the next day - if ( direction == 1 && hour == 0 && minute == 0 && second == 0 ) - return date; - else - return XDate.CalendarDateToXLDate( year, month, - day + direction, 0, 0, 0 ); - case DateUnit.Hour: - // If the date is already an exact hour, then don't step to the next hour - if ( direction == 1 && minute == 0 && second == 0 ) - return date; - else - return XDate.CalendarDateToXLDate( year, month, day, - hour + direction, 0, 0 ); - case DateUnit.Minute: - // If the date is already an exact minute, then don't step to the next minute - if ( direction == 1 && second == 0 ) - return date; - else - return XDate.CalendarDateToXLDate( year, month, day, hour, - minute + direction, 0 ); - case DateUnit.Second: - return XDate.CalendarDateToXLDate( year, month, day, hour, - minute, second + direction ); - - case DateUnit.Millisecond: - return XDate.CalendarDateToXLDate( year, month, day, hour, - minute, second, millisecond + direction ); - - } - } - - /// - /// Make a value label for an . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log () - /// and text () type axes. - /// - /// The resulting value label as a - override internal string MakeLabel( GraphPane pane, int index, double dVal ) - { - if ( _format == null ) - _format = Scale.Default.Format; - - return XDate.ToString( dVal, _format ); - } - - /// - /// Gets the major unit multiplier for this scale type, if any. - /// - /// The major unit multiplier will correct the units of - /// to match the units of - /// and . This reflects the setting of - /// . - /// - override internal double MajorUnitMultiplier - { - get { return GetUnitMultiple( _majorUnit ); } - } - - /// - /// Gets the minor unit multiplier for this scale type, if any. - /// - /// The minor unit multiplier will correct the units of - /// to match the units of - /// and . This reflects the setting of - /// . - /// - override internal double MinorUnitMultiplier - { - get { return GetUnitMultiple( _minorUnit ); } - } - - /// - /// Internal routine to calculate a multiplier to the selected unit back to days. - /// - /// The unit type for which the multiplier is to be - /// calculated - /// - /// This is ratio of days/selected unit - /// - private double GetUnitMultiple( DateUnit unit ) - { - switch ( unit ) - { - case DateUnit.Year: - default: - return 365.0; - case DateUnit.Month: - return 30.0; - case DateUnit.Day: - return 1.0; - case DateUnit.Hour: - return 1.0 / XDate.HoursPerDay; - case DateUnit.Minute: - return 1.0 / XDate.MinutesPerDay; - case DateUnit.Second: - return 1.0 / XDate.SecondsPerDay; - case DateUnit.Millisecond: - return 1.0 / XDate.MillisecondsPerDay; - } - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected DateScale( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/EllipseObj.cs b/SDK/ZedGraphs/ZedGraph/EllipseObj.cs deleted file mode 100644 index 6664b99..0000000 --- a/SDK/ZedGraphs/ZedGraph/EllipseObj.cs +++ /dev/null @@ -1,259 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that represents a bordered and/or filled ellipse object on - /// the graph. A list of EllipseObj objects is maintained by the - /// collection class. The ellipse is defined - /// as the ellipse that would be contained by the rectangular box as - /// defined by the property. - /// - /// - /// John Champion - /// $Revision: 3.3 $ $Date: 2007-01-25 07:56:08 $ - [Serializable] - public class EllipseObj : BoxObj, ICloneable, ISerializable - { - #region Constructors - /// Constructors for the object - /// - /// A constructor that allows the position and size - /// of the to be pre-specified. Other properties are defaulted. - /// - /// The x location for this . This will be in units determined by - /// . - /// The y location for this . This will be in units determined by - /// . - /// The width of this . This will be in units determined by - /// . - /// The height of this . This will be in units determined by - /// . - public EllipseObj( double x, double y, double width, double height ) - : base( x, y, width, height ) - { - } - - /// - /// A default constructor that places the at location (0,0), - /// with width/height of (1,1). Other properties are defaulted. - /// - public EllipseObj() : base() - { - } - - /// - /// A constructor that allows the position, border color, and solid fill color - /// of the to be pre-specified. - /// - /// An arbitrary specification - /// for the ellipse border - /// An arbitrary specification - /// for the ellipse fill (will be a solid color fill) - /// The x location for this . This will be in units determined by - /// . - /// The y location for this . This will be in units determined by - /// . - /// The width of this . This will be in units determined by - /// . - /// The height of this . This will be in units determined by - /// . - public EllipseObj( double x, double y, double width, double height, Color borderColor, Color fillColor ) - : base( x, y, width, height, borderColor, fillColor ) - { - } - - /// - /// A constructor that allows the position, border color, and two-color - /// gradient fill colors - /// of the to be pre-specified. - /// - /// An arbitrary specification - /// for the ellipse border - /// An arbitrary specification - /// for the start of the ellipse gradient fill - /// An arbitrary specification - /// for the end of the ellipse gradient fill - /// The x location for this . This will be in units determined by - /// . - /// The y location for this . This will be in units determined by - /// . - /// The width of this . This will be in units determined by - /// . - /// The height of this . This will be in units determined by - /// . - public EllipseObj( double x, double y, double width, double height, Color borderColor, - Color fillColor1, Color fillColor2 ) : - base( x, y, width, height, borderColor, fillColor1, fillColor2 ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from - /// which to copy - public EllipseObj( BoxObj rhs ) : base( rhs ) - { - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new EllipseObj Clone() - { - return new EllipseObj( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected EllipseObj( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema3" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema3", schema3 ); - } - #endregion - - #region Rendering Methods - /// - /// Render this object to the specified device. - /// - /// - /// This method is normally only called by the Draw method - /// of the parent collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) - { - // Convert the arrow coordinates from the user coordinate system - // to the screen coordinate system - RectangleF pixRect = this.Location.TransformRect( pane ); - - if ( Math.Abs( pixRect.Left ) < 100000 && - Math.Abs( pixRect.Top ) < 100000 && - Math.Abs( pixRect.Right ) < 100000 && - Math.Abs( pixRect.Bottom ) < 100000 ) - { - if ( _fill.IsVisible ) - using ( Brush brush = _fill.MakeBrush( pixRect ) ) - g.FillEllipse( brush, pixRect ); - - if ( _border.IsVisible ) - using ( Pen pen = _border.GetPen( pane, scaleFactor ) ) - g.DrawEllipse( pen, pixRect ); - } - } - - /// - /// Determine if the specified screen point lies inside the bounding box of this - /// . - /// - /// The screen point, in pixels - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// true if the point lies in the bounding box, false otherwise - override public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) - { - if ( ! base.PointInBox(pt, pane, g, scaleFactor ) ) - return false; - - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - RectangleF pixRect = _location.TransformRect( pane ); - - using ( GraphicsPath path = new GraphicsPath() ) - { - path.AddEllipse( pixRect ); - return path.IsVisible( pt ); - } - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ErrorBar.cs b/SDK/ZedGraphs/ZedGraph/ErrorBar.cs deleted file mode 100644 index 3358b02..0000000 --- a/SDK/ZedGraphs/ZedGraph/ErrorBar.cs +++ /dev/null @@ -1,388 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// This class handles the drawing of the curve objects. - /// The Error Bars are the vertical lines with a symbol at each end. - /// - /// To draw "I-Beam" bars, the symbol type defaults to - /// , which is just a horizontal line. - /// If is Y-oriented, then the symbol type should be - /// set to to get the same effect. - /// - /// - /// John Champion - /// $Revision: 3.21 $ $Date: 2007-08-10 16:22:54 $ - [Serializable] - public class ErrorBar : ICloneable, ISerializable - { - #region Fields - /// - /// Private field that stores the visibility of this - /// . Use the public - /// property to access this value. If this value is - /// false, the symbols will not be shown. - /// - private bool _isVisible; - /// - /// Private field that stores the error bar color. Use the public - /// property to access this value. - /// - private Color _color; - /// - /// Private field that stores the pen width for this error bar. Use the public - /// property to access this value. - /// - private float _penWidth; - /// - /// private field that contains the symbol element that will be drawn - /// at the top and bottom of the error bar. Use the public property - /// to access this value. - /// - private Symbol _symbol; - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - // Default Symbol properties - /// - /// The default size for curve symbols - /// ( property), - /// in units of points. - /// - public static float Size = 7; - /// - /// The default pen width to be used for drawing error bars - /// ( property). Units are points. - /// - public static float PenWidth = 1.0F; - /// - /// The default display mode for symbols ( property). - /// true to display symbols, false to hide them. - /// - public static bool IsVisible = true; - /// - /// The default color for drawing error bars ( property). - /// - public static Color Color = Color.Red; - /// - /// The default symbol for drawing at the top and bottom of the - /// error bar (see ). - /// - public static SymbolType Type = SymbolType.HDash; - } - #endregion - - #region Properties - /// - /// Gets or sets a property that shows or hides the . - /// - /// true to show the error bar, false to hide it - /// - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - - /// - /// Gets or sets the data for this - /// . - /// - /// This property only controls the color of - /// the vertical line. The symbol color is controlled separately in - /// the property. - /// - public Color Color - { - get { return _color; } - set { _color = value; } - } - /// - /// The pen width to be used for drawing error bars - /// Units are points. - /// - /// This property only controls the pen width for the - /// vertical line. The pen width for the symbol outline is - /// controlled separately by the property. - /// - public float PenWidth - { - get { return _penWidth; } - set { _penWidth = value; } - } - /// - /// Contains the symbol element that will be drawn - /// at the top and bottom of the error bar. - /// - public Symbol Symbol - { - get { return _symbol; } - set { _symbol = value; } - } - - #endregion - - #region Constructors - /// - /// Default constructor that sets all properties to - /// default values as defined in the class. - /// - public ErrorBar() : this( Default.Color ) - { - } - - /// - /// Default constructor that sets the - /// as specified, and the remaining - /// properties to default - /// values as defined in the class. - /// - /// A value indicating - /// the color of the symbol - /// - public ErrorBar( Color color ) - { - _symbol = new Symbol( Default.Type, color ); - _symbol.Size = Default.Size; - _color = color; - _penWidth = Default.PenWidth; - _isVisible = Default.IsVisible; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ErrorBar( ErrorBar rhs ) - { - _color = rhs.Color; - _isVisible = rhs.IsVisible; - _penWidth = rhs.PenWidth; - _symbol = rhs.Symbol.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public ErrorBar Clone() - { - return new ErrorBar( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected ErrorBar( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _isVisible = info.GetBoolean( "isVisible" ); - _color = (Color) info.GetValue( "color", typeof(Color) ); - _penWidth = info.GetSingle( "penWidth" ); - _symbol = (Symbol) info.GetValue( "symbol", typeof(Symbol) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "isVisible", _isVisible ); - info.AddValue( "color", _color ); - info.AddValue( "penWidth", _penWidth ); - info.AddValue( "symbol", _symbol ); - } - #endregion - - #region Rendering Methods - /// - /// Draw the to the specified - /// device at the specified location. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// boolean value that indicates if the "base" axis for this - /// is the X axis. True for an base, - /// false for a or base. - /// The independent axis position of the center of the error bar in - /// pixel units - /// The dependent axis position of the top of the error bar in - /// pixel units - /// The dependent axis position of the bottom of the error bar in - /// pixel units - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// A pen with attributes of and - /// for this - /// The data value to be used for a value-based - /// color gradient. This is only applicable for , - /// or . - /// Indicates that the should be drawn - /// with attributes from the class. - /// - public void Draw( Graphics g, GraphPane pane, bool isXBase, - float pixBase, float pixValue, - float pixLowValue, float scaleFactor, Pen pen, bool isSelected, - PointPair dataValue ) - { - if ( isXBase ) - { - g.DrawLine( pen, pixBase, pixValue, pixBase, pixLowValue ); - _symbol.DrawSymbol( g, pane, (int)pixBase, (int)pixValue, - scaleFactor, isSelected, dataValue ); - _symbol.DrawSymbol( g, pane, (int)pixBase, (int)pixLowValue, - scaleFactor, isSelected, dataValue ); - } - else - { - g.DrawLine( pen, pixValue, pixBase, pixLowValue, pixBase ); - _symbol.DrawSymbol( g, pane, (int)pixValue, (int)pixBase, - scaleFactor, isSelected, dataValue ); - _symbol.DrawSymbol( g, pane, (int)pixLowValue, (int)pixBase, - scaleFactor, isSelected, dataValue ); - } - } - - - /// - /// Draw all the 's to the specified - /// device as a an error bar at each defined point. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A object representing the - /// 's to be drawn. - /// The class instance that defines the base (independent) - /// axis for the - /// The class instance that defines the value (dependent) - /// axis for the - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void Draw( Graphics g, GraphPane pane, ErrorBarItem curve, - Axis baseAxis, Axis valueAxis, float scaleFactor ) - { - ValueHandler valueHandler = new ValueHandler( pane, false ); - - float pixBase, pixValue, pixLowValue; - double scaleBase, scaleValue, scaleLowValue; - - if ( curve.Points != null && this.IsVisible ) - { - using ( Pen pen = !curve.IsSelected ? new Pen( _color, _penWidth ) : - new Pen( Selection.Border.Color, Selection.Border.Width ) ) - { - // Loop over each defined point - for ( int i = 0; i < curve.Points.Count; i++ ) - { - valueHandler.GetValues( curve, i, out scaleBase, - out scaleLowValue, out scaleValue ); - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - - if ( !curve.Points[i].IsInvalid3D && - ( scaleBase > 0 || !baseAxis._scale.IsLog ) && - ( ( scaleValue > 0 && scaleLowValue > 0 ) || !valueAxis._scale.IsLog ) ) - { - pixBase = baseAxis.Scale.Transform( curve.IsOverrideOrdinal, i, scaleBase ); - pixValue = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, scaleValue ); - pixLowValue = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, scaleLowValue ); - - //if ( this.fill.IsGradientValueType ) - // brush = fill.MakeBrush( _rect, _points[i] ); - - this.Draw( g, pane, baseAxis is XAxis || baseAxis is X2Axis, pixBase, pixValue, - pixLowValue, scaleFactor, pen, curve.IsSelected, - curve.Points[i] ); - } - } - } - } - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ErrorBarItem.cs b/SDK/ZedGraphs/ZedGraph/ErrorBarItem.cs deleted file mode 100644 index 8511342..0000000 --- a/SDK/ZedGraphs/ZedGraph/ErrorBarItem.cs +++ /dev/null @@ -1,364 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// Encapsulates an "Error Bar" curve type that displays a vertical or horizontal - /// line with a symbol at each end. - /// - /// The type is intended for displaying - /// confidence intervals, candlesticks, stock High-Low charts, etc. It is - /// technically not a bar, since it is drawn as a vertical or horizontal line. - /// The default symbol at each end of the "bar" is , - /// which creates an "I-Beam". For horizontal bars - /// ( or - /// ), you will need to change the symbol to - /// to get horizontal "I-Beams". - /// Since the horizontal segments are actually symbols, their widths are - /// controlled by the symbol size in , - /// specified in points (1/72nd inch). The position of each "I-Beam" is set - /// according to the values. The independent axis - /// is assigned with , and is a - /// enum type. - /// John Champion - /// $Revision: 3.19 $ $Date: 2007-04-16 00:03:01 $ - [Serializable] - public class ErrorBarItem : CurveItem, ICloneable, ISerializable - { - #region Fields - /// - /// Private field that stores a reference to the - /// class defined for this . Use the public - /// property to access this value. - /// - private ErrorBar _bar; - - #endregion - - #region Properties - /// - /// Gets a reference to the class defined - /// for this . - /// - public ErrorBar Bar - { - get { return _bar; } - } - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return true; - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return pane._barSettings.Base == BarBase.X; - } - - #endregion - - #region Constructors - /// - /// Create a new , specifying only the legend label. - /// - /// The label that will appear in the legend. - public ErrorBarItem( string label ) : base( label ) - { - _bar = new ErrorBar(); - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// An array of double precision values that define - /// the X axis values for this curve - /// An array of double precision values that define - /// the Y axis values for this curve - /// An array of double precision values that define - /// the lower dependent values for this curve - /// A value that will be applied to - /// the properties. - /// - public ErrorBarItem( string label, double[] x, double[] y, double[] lowValue, - System.Drawing.Color color ) - : this( label, new PointPairList( x, y, lowValue ), color ) - { - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// A of double precision values that define - /// the X, Y and lower dependent values for this curve - /// A value that will be applied to - /// the properties. - /// - public ErrorBarItem( string label, IPointList points, Color color ) - : base( label, points ) - { - _bar = new ErrorBar( color ); - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ErrorBarItem( ErrorBarItem rhs ) : base( rhs ) - { - _bar = new ErrorBar( rhs.Bar ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public ErrorBarItem Clone() - { - return new ErrorBarItem( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected ErrorBarItem( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _bar = (ErrorBar) info.GetValue( "bar", typeof(ErrorBar) ); - - // This is now just a dummy variable, since barBase was removed - BarBase barBase = (BarBase) info.GetValue( "barBase", typeof(BarBase) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "bar", _bar ); - - // BarBase is now just a dummy value, since the GraphPane.BarBase is used exclusively - info.AddValue( "barBase", BarBase.X ); - } - #endregion - - #region Methods - /// - /// Do all rendering associated with this to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The ordinal position of the current - /// curve. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, GraphPane pane, int pos, float scaleFactor ) - { - if ( _isVisible ) - { - _bar.Draw( g, pane, this, this.BaseAxis( pane ), - this.ValueAxis( pane ), scaleFactor ); - } - } - - /// - /// Draw a legend key entry for this at the specified location - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The struct that specifies the - /// location for the legend key - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, - float scaleFactor ) - { - float pixBase, pixValue, pixLowValue; - - if ( pane._barSettings.Base == BarBase.X ) - { - pixBase = rect.Left + rect.Width / 2.0F; - pixValue = rect.Top; - pixLowValue = rect.Bottom; - } - else - { - pixBase = rect.Top + rect.Height / 2.0F; - pixValue = rect.Right; - pixLowValue = rect.Left; - } - - using ( Pen pen = new Pen( _bar.Color, _bar.PenWidth ) ) - { - this.Bar.Draw( g, pane, pane._barSettings.Base == BarBase.X, pixBase, pixValue, - pixLowValue, scaleFactor, pen, false, null ); - } - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - override public bool GetCoords( GraphPane pane, int i, out string coords ) - { - coords = string.Empty; - - if ( i < 0 || i >= _points.Count ) - return false; - - Axis valueAxis = ValueAxis( pane ); - Axis baseAxis = BaseAxis( pane ); - - float scaledSize = _bar.Symbol.Size * pane.CalcScaleFactor(); - - // pixBase = pixel value for the bar center on the base axis - // pixHiVal = pixel value for the bar top on the value axis - // pixLowVal = pixel value for the bar bottom on the value axis - float pixBase, pixHiVal, pixLowVal; - - float clusterWidth = pane.BarSettings.GetClusterWidth(); - float barWidth = GetBarWidth( pane ); - float clusterGap = pane._barSettings.MinClusterGap * barWidth; - float barGap = barWidth * pane._barSettings.MinBarGap; - - // curBase = the scale value on the base axis of the current bar - // curHiVal = the scale value on the value axis of the current bar - // curLowVal = the scale value of the bottom of the bar - double curBase, curLowVal, curHiVal; - ValueHandler valueHandler = new ValueHandler( pane, false ); - valueHandler.GetValues( this, i, out curBase, out curLowVal, out curHiVal ); - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - - if ( !_points[i].IsInvalid3D ) - { - // calculate a pixel value for the top of the bar on value axis - pixLowVal = valueAxis.Scale.Transform( _isOverrideOrdinal, i, curLowVal ); - pixHiVal = valueAxis.Scale.Transform( _isOverrideOrdinal, i, curHiVal ); - // calculate a pixel value for the center of the bar on the base axis - pixBase = baseAxis.Scale.Transform( _isOverrideOrdinal, i, curBase ); - - // Calculate the pixel location for the side of the bar (on the base axis) - float pixSide = pixBase - scaledSize / 2.0F; - - // Draw the bar - if ( baseAxis is XAxis || baseAxis is X2Axis ) - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixSide, pixLowVal, - pixSide + scaledSize, pixHiVal ); - else - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixLowVal, pixSide, - pixHiVal, pixSide + scaledSize ); - - return true; - } - - return false; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ExponentScale.cs b/SDK/ZedGraphs/ZedGraph/ExponentScale.cs deleted file mode 100644 index 1d98ce2..0000000 --- a/SDK/ZedGraphs/ZedGraph/ExponentScale.cs +++ /dev/null @@ -1,404 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The ExponentScale class inherits from the class, and implements - /// the features specific to . - /// - /// - /// ExponentScale is a non-linear axis in which the values are scaled using an exponential function - /// with the property. - /// - /// - /// John Champion with contributions by jackply - /// $Revision: 1.8 $ $Date: 2007-04-16 00:03:01 $ - [Serializable] - class ExponentScale : Scale, ISerializable //, ICloneable - { - - #region constructors - - /// - /// Default constructor that defines the owner - /// (containing object) for this new object. - /// - /// The owner, or containing object, of this instance - public ExponentScale( Axis owner ) - : base( owner ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - /// The object that will own the - /// new instance of - public ExponentScale( Scale rhs, Axis owner ) - : base( rhs, owner ) - { - } - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - public override Scale Clone( Axis owner ) - { - return new ExponentScale( this, owner ); - } - - #endregion - - #region properties - - public override AxisType Type - { - get { return AxisType.Exponent; } - } - - #endregion - - #region methods - - /// - /// Setup some temporary transform values in preparation for rendering the . - /// - /// - /// This method is typically called by the parent - /// object as part of the method. It is also - /// called by and - /// - /// methods to setup for coordinate transformations. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The parent for this - /// - override public void SetupScaleData( GraphPane pane, Axis axis ) - { - base.SetupScaleData( pane, axis ); - - if ( _exponent > 0 ) - { - _minLinTemp = Linearize( _min ); - _maxLinTemp = Linearize( _max ); - } - else if ( _exponent < 0 ) - { - _minLinTemp = Linearize( _max ); - _maxLinTemp = Linearize( _min ); - } - } - - /// - /// Convert a value to its linear equivalent for this type of scale. - /// - /// - /// The default behavior is to just return the value unchanged. However, - /// for and , - /// it returns the log or power equivalent. - /// - /// The value to be converted - override public double Linearize( double val ) - { - return SafeExp( val, _exponent ); - } - - /// - /// Convert a value from its linear equivalent to its actual scale value - /// for this type of scale. - /// - /// - /// The default behavior is to just return the value unchanged. However, - /// for and , - /// it returns the anti-log or inverse-power equivalent. - /// - /// The value to be converted - override public double DeLinearize( double val ) - { - return Math.Pow( val, 1 / _exponent ); - } - - /// - /// Determine the value for any major tic. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// The value of the first major tic (floating point double) - /// - /// - /// The major tic number (0 = first major tic). For log scales, this is the actual power of 10. - /// - /// - /// The specified major tic value (floating point double). - /// - override internal double CalcMajorTicValue( double baseVal, double tic ) - { - if ( _exponent > 0.0 ) - { - //return baseVal + Math.Pow ( (double) this.majorStep * tic, exp ); - //baseVal is got from CalBase..., and it is exp.. - return Math.Pow( Math.Pow( baseVal, 1 / _exponent ) + _majorStep * tic, _exponent ); - } - else if ( _exponent < 0.0 ) - { - //baseVal is got from CalBase..., and it is exp.. - return Math.Pow( Math.Pow( baseVal, 1 / _exponent ) + _majorStep * tic, _exponent ); - } - - return 1.0; - } - - /// - /// Determine the value for any minor tic. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// The value of the first major tic (floating point double). This tic value is the base - /// reference for all tics (including minor ones). - /// - /// - /// The major tic number (0 = first major tic). For log scales, this is the actual power of 10. - /// - /// - /// The specified minor tic value (floating point double). - /// - override internal double CalcMinorTicValue( double baseVal, int iTic ) - { - return baseVal + Math.Pow( (double) _majorStep * (double) iTic, _exponent ); - } - - /// - /// Internal routine to determine the ordinals of the first minor tic mark - /// - /// - /// The value of the first major tic for the axis. - /// - /// - /// The ordinal position of the first minor tic, relative to the first major tic. - /// This value can be negative (e.g., -3 means the first minor tic is 3 minor step - /// increments before the first major tic. - /// - override internal int CalcMinorStart( double baseVal ) - { - return (int) ( ( Math.Pow( _min, _exponent ) - baseVal ) / Math.Pow( _minorStep, _exponent ) ); - } - - /// - /// Select a reasonable exponential axis scale given a range of data values. - /// - /// - /// This method only applies to type axes, and it - /// is called by the general method. The exponential scale - /// relies on the property to set the scaling exponent. This - /// method honors the , , - /// and autorange settings. - /// In the event that any of the autorange settings are false, the - /// corresponding , , or - /// setting is explicitly honored, and the remaining autorange settings (if any) will - /// be calculated to accomodate the non-autoranged values. For log axes, the MinorStep - /// value is not used. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// - /// - override public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - // call the base class first - base.PickScale( pane, g, scaleFactor ); - - // Test for trivial condition of range = 0 and pick a suitable default - if ( _max - _min < 1.0e-20 ) - { - if ( _maxAuto ) - _max = _max + 0.2 * ( _max == 0 ? 1.0 : Math.Abs( _max ) ); - if ( _minAuto ) - _min = _min - 0.2 * ( _min == 0 ? 1.0 : Math.Abs( _min ) ); - } - - // This is the zero-lever test. If minVal is within the zero lever fraction - // of the data range, then use zero. - - if ( _minAuto && _min > 0 && - _min / ( _max - _min ) < Default.ZeroLever ) - _min = 0; - - // Repeat the zero-lever test for cases where the maxVal is less than zero - if ( _maxAuto && _max < 0 && - Math.Abs( _max / ( _max - _min ) ) < - Default.ZeroLever ) - _max = 0; - - // Calculate the new step size - if ( _majorStepAuto ) - { - double targetSteps = ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) ? - Default.TargetXSteps : Default.TargetYSteps; - - // Calculate the step size based on target steps - _majorStep = CalcStepSize( _max - _min, targetSteps ); - - if ( _isPreventLabelOverlap ) - { - // Calculate the maximum number of labels - double maxLabels = (double) this.CalcMaxLabels( g, pane, scaleFactor ); - - if ( maxLabels < ( _max - _min ) / _majorStep ) - _majorStep = CalcBoundedStepSize( _max - _min, maxLabels ); - } - } - - // Calculate the new step size - if ( _minorStepAuto ) - _minorStep = CalcStepSize( _majorStep, - ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) ? - Default.TargetMinorXSteps : Default.TargetMinorYSteps ); - - // Calculate the scale minimum - if ( _minAuto ) - _min = _min - MyMod( _min, _majorStep ); - - // Calculate the scale maximum - if ( _maxAuto ) - _max = MyMod( _max, _majorStep ) == 0.0 ? _max : - _max + _majorStep - MyMod( _max, _majorStep ); - - // set the scale magnitude if required - if ( _magAuto ) - { - // Find the optimal scale display multiple - double mag = 0; - double mag2 = 0; - - if ( Math.Abs( _min ) > 1.0e-10 ) - mag = Math.Floor( Math.Log10( Math.Abs( _min ) ) ); - if ( Math.Abs( _max ) > 1.0e-10 ) - mag2 = Math.Floor( Math.Log10( Math.Abs( _max ) ) ); - if ( Math.Abs( mag2 ) > Math.Abs( mag ) ) - mag = mag2; - - // Do not use scale multiples for magnitudes below 4 - if ( Math.Abs( mag ) <= 3 ) - mag = 0; - - // Use a power of 10 that is a multiple of 3 (engineering scale) - _mag = (int) ( Math.Floor( mag / 3.0 ) * 3.0 ); - } - - // Calculate the appropriate number of dec places to display if required - if ( _formatAuto ) - { - int numDec = 0 - (int) ( Math.Floor( Math.Log10( _majorStep ) ) - _mag ); - if ( numDec < 0 ) - numDec = 0; - _format = "f" + numDec.ToString(); - } - } - - /// - /// Make a value label for an . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log () - /// and text () type axes. - /// - /// The resulting value label as a - override internal string MakeLabel( GraphPane pane, int index, double dVal ) - { - if ( _format == null ) - _format = Scale.Default.Format; - - double scaleMult = Math.Pow( (double) 10.0, _mag ); - double val = Math.Pow( dVal, 1 / _exponent ) / scaleMult; - return val.ToString( _format ); - } - - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected ExponentScale( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Fill.cs b/SDK/ZedGraphs/ZedGraph/Fill.cs deleted file mode 100644 index fbd7159..0000000 --- a/SDK/ZedGraphs/ZedGraph/Fill.cs +++ /dev/null @@ -1,1145 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that encapsulates color-fill properties for an object. The class - /// is used in , , , - /// , and objects. - /// - /// - /// John Champion - /// $Revision: 3.22 $ $Date: 2007-01-26 09:01:49 $ - [Serializable] - public class Fill : ISerializable, ICloneable - { - #region Fields - - /// - /// Private field that stores the fill color. Use the public - /// property to access this value. This property is - /// only applicable if the is not . - /// - private Color _color; - /// - /// Private field that stores the secondary color for gradientByValue fills. Use the public - /// property to access this value. This property is - /// only applicable if the is , - /// , or . - /// - private Color _secondaryValueGradientColor; - /// - /// Private field that stores the custom fill brush. Use the public - /// property to access this value. This property is - /// only applicable if the - /// property is set to . - /// - protected Brush _brush; - /// - /// Private field that determines the type of color fill. Use the public - /// property to access this value. The fill color - /// is determined by the property or - /// . - /// - private FillType _type; - /// - /// Private field that determines if the brush will be scaled to the bounding box - /// of the filled object. If this value is false, then the brush will only be aligned - /// with the filled object based on the and - /// properties. - /// - private bool _isScaled; - /// - /// Private field that determines how the brush will be aligned with the filled object - /// in the horizontal direction. This value is a enumeration. - /// This field only applies if is false. - /// properties. - /// - /// - /// - private AlignH _alignH; - /// - /// Private field that determines how the brush will be aligned with the filled object - /// in the vertical direction. This value is a enumeration. - /// This field only applies if is false. - /// properties. - /// - /// - /// - private AlignV _alignV; - - private double _rangeMin; - private double _rangeMax; - private double _rangeDefault; - private Bitmap _gradientBM; - - /// - /// Private field that saves the image passed to the constructor. - /// This is used strictly for serialization. - /// - private Image _image; - /// - /// Private field that saves the image wrapmode passed to the constructor. - /// This is used strictly for serialization. - /// - private WrapMode _wrapMode; - /// - /// Private field that saves the list of colors used to create the - /// in the constructor. This is used strictly - /// for serialization. - /// - private Color[] _colorList; - /// - /// Private field that saves the list of positions used to create the - /// in the constructor. This is used strictly - /// for serialization. - /// - private float[] _positionList; - /// - /// Private field the saves the angle of the fill. This is used strictly for serialization. - /// - private float _angle; - - - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - // Default Fill properties - /// - /// The default scaling mode for fills. - /// This is the default value for the property. - /// - public static bool IsScaled = true; - /// - /// The default horizontal alignment for fills. - /// This is the default value for the property. - /// - public static AlignH AlignH = AlignH.Center; - /// - /// The default vertical alignment for fills. - /// This is the default value for the property. - /// - public static AlignV AlignV = AlignV.Center; - } - #endregion - - #region Constructors - /// - /// Generic initializer to default values - /// - private void Init() - { - _color = Color.White; - _secondaryValueGradientColor = Color.White; - _brush = null; - _type = FillType.None; - _isScaled = Default.IsScaled; - _alignH = Default.AlignH; - _alignV = Default.AlignV; - _rangeMin = 0.0; - _rangeMax = 1.0; - _rangeDefault = double.MaxValue; - _gradientBM = null; - - _colorList = null; - _positionList = null; - _angle = 0; - _image = null; - _wrapMode = WrapMode.Tile; - - } - - /// - /// The default constructor. Initialized to no fill. - /// - public Fill() - { - Init(); - } - - /// - /// Constructor that specifies the color, brush, and type for this fill. - /// - /// The color of the fill for solid fills - /// A custom brush for fills. Can be a , - /// , or . - /// The for this fill. - public Fill( Color color, Brush brush, FillType type ) - { - Init(); - _color = color; - _brush = brush; - _type = type; - } - - /// - /// Constructor that creates a solid color-fill, setting to - /// , and setting to the - /// specified color value. - /// - /// The color of the solid fill - public Fill( Color color ) - { - Init(); - _color = color; - if ( color != Color.Empty ) - _type = FillType.Solid; - } - - /// - /// Constructor that creates a linear gradient color-fill, setting to - /// using the specified colors and angle. - /// - /// The first color for the gradient fill - /// The second color for the gradient fill - /// The angle (degrees) of the gradient fill - public Fill( Color color1, Color color2, float angle ) - { - Init(); - _color = color2; - - ColorBlend blend = new ColorBlend( 2 ); - blend.Colors[0] = color1; - blend.Colors[1] = color2; - blend.Positions[0] = 0.0f; - blend.Positions[1] = 1.0f; - _type = FillType.Brush; - - this.CreateBrushFromBlend( blend, angle ); - } - - /// - /// Constructor that creates a linear gradient color-fill, setting to - /// using the specified colors. - /// - /// The first color for the gradient fill - /// The second color for the gradient fill - public Fill( Color color1, Color color2 ) : this( color1, color2, 0.0F ) - { - } - - /// - /// Constructor that creates a linear gradient color-fill, setting to - /// using the specified colors. This gradient fill - /// consists of three colors. - /// - /// The first color for the gradient fill - /// The second color for the gradient fill - /// The third color for the gradient fill - public Fill( Color color1, Color color2, Color color3 ) : - this( color1, color2, color3, 0.0f ) - { - } - - /// - /// Constructor that creates a linear gradient color-fill, setting to - /// using the specified colors. This gradient fill - /// consists of three colors - /// - /// The first color for the gradient fill - /// The second color for the gradient fill - /// The third color for the gradient fill - /// The angle (degrees) of the gradient fill - public Fill( Color color1, Color color2, Color color3, float angle ) - { - Init(); - _color = color3; - - ColorBlend blend = new ColorBlend( 3 ); - blend.Colors[0] = color1; - blend.Colors[1] = color2; - blend.Colors[2] = color3; - blend.Positions[0] = 0.0f; - blend.Positions[1] = 0.5f; - blend.Positions[2] = 1.0f; - _type = FillType.Brush; - - this.CreateBrushFromBlend( blend, angle ); - } - - /// - /// Constructor that creates a linear gradient multi-color-fill, setting to - /// using the specified colors. This gradient fill - /// consists of many colors based on a object. The gradient - /// angle is defaulted to zero. - /// - /// The object that defines the colors - /// and positions along the gradient. - public Fill( ColorBlend blend ) : - this( blend, 0.0F ) - { - } - - /// - /// Constructor that creates a linear gradient multi-color-fill, setting to - /// using the specified colors. This gradient fill - /// consists of many colors based on a object, drawn at the - /// specified angle (degrees). - /// - /// The object that defines the colors - /// and positions along the gradient. - /// The angle (degrees) of the gradient fill - public Fill( ColorBlend blend, float angle ) - { - Init(); - _type = FillType.Brush; - this.CreateBrushFromBlend( blend, angle ); - } - - /// - /// Constructor that creates a linear gradient multi-color-fill, setting to - /// using the specified colors. This gradient fill - /// consists of many colors based on an array of objects, drawn at an - /// angle of zero (degrees). The array is used to create - /// a object assuming a even linear distribution of the colors - /// across the gradient. - /// - /// The array of objects that defines the colors - /// along the gradient. - public Fill( Color[] colors ) : - this( colors, 0.0F ) - { - } - - /// - /// Constructor that creates a linear gradient multi-color-fill, setting to - /// using the specified colors. This gradient fill - /// consists of many colors based on an array of objects, drawn at the - /// specified angle (degrees). The array is used to create - /// a object assuming a even linear distribution of the colors - /// across the gradient. - /// - /// The array of objects that defines the colors - /// along the gradient. - /// The angle (degrees) of the gradient fill - public Fill( Color[] colors, float angle ) - { - Init(); - _color = colors[ colors.Length - 1 ]; - - ColorBlend blend = new ColorBlend(); - blend.Colors = colors; - blend.Positions = new float[colors.Length]; - blend.Positions[0] = 0.0F; - for ( int i=1; i - /// Constructor that creates a linear gradient multi-color-fill, setting to - /// using the specified colors. This gradient fill - /// consists of many colors based on an array of objects, drawn at the - /// an angle of zero (degrees). The array is used to create - /// a object assuming a even linear distribution of the colors - /// across the gradient. - /// - /// The array of objects that defines the colors - /// along the gradient. - /// The array of floating point values that defines the color - /// positions along the gradient. Values should range from 0 to 1. - public Fill( Color[] colors, float[] positions ) : - this( colors, positions, 0.0F ) - { - } - - /// - /// Constructor that creates a linear gradient multi-color-fill, setting to - /// using the specified colors. This gradient fill - /// consists of many colors based on an array of objects, drawn at the - /// specified angle (degrees). The array is used to create - /// a object assuming a even linear distribution of the colors - /// across the gradient. - /// - /// The array of objects that defines the colors - /// along the gradient. - /// The array of floating point values that defines the color - /// positions along the gradient. Values should range from 0 to 1. - /// The angle (degrees) of the gradient fill - public Fill( Color[] colors, float[] positions, float angle ) - { - Init(); - _color = colors[ colors.Length - 1 ]; - - ColorBlend blend = new ColorBlend(); - blend.Colors = colors; - blend.Positions = positions; - _type = FillType.Brush; - - this.CreateBrushFromBlend( blend, angle ); - } - - /// - /// Constructor that creates a texture fill, setting to - /// and using the specified image. - /// - /// The to use for filling - /// The class that controls the image wrapping properties - public Fill( Image image, WrapMode wrapMode ) - { - Init(); - _color = Color.White; - _brush = new TextureBrush( image, wrapMode ); - _type = FillType.Brush; - _image = image; - _wrapMode = wrapMode; - } - - /// - /// Constructor that creates a fill, using a user-supplied, custom - /// . The brush will be scaled to fit the destination screen object - /// unless you manually change to false; - /// - /// The to use for fancy fills. Typically, this would - /// be a or a class - public Fill( Brush brush ) : this( brush, Default.IsScaled ) - { - } - - /// - /// Constructor that creates a fill, using a user-supplied, custom - /// . The brush will be scaled to fit the destination screen object - /// according to the parameter. - /// - /// The to use for fancy fills. Typically, this would - /// be a or a class - /// Determines if the brush will be scaled to fit the bounding box - /// of the destination object. true to scale it, false to leave it unscaled - public Fill( Brush brush, bool isScaled ) - { - Init(); - _isScaled = isScaled; - _color = Color.White; - _brush = (Brush) brush.Clone(); - _type = FillType.Brush; - } - - /// - /// Constructor that creates a fill, using a user-supplied, custom - /// . This constructor will make the brush unscaled (see ), - /// but it provides and parameters to control - /// alignment of the brush with respect to the filled object. - /// - /// The to use for fancy fills. Typically, this would - /// be a or a class - /// Controls the horizontal alignment of the brush within the filled object - /// (see - /// Controls the vertical alignment of the brush within the filled object - /// (see - public Fill( Brush brush, AlignH alignH, AlignV alignV ) - { - Init(); - _alignH = alignH; - _alignV = alignV; - _isScaled = false; - _color = Color.White; - _brush = (Brush) brush.Clone(); - _type = FillType.Brush; - } - - /// - /// The Copy Constructor - /// - /// The Fill object from which to copy - public Fill( Fill rhs ) - { - _color = rhs._color; - _secondaryValueGradientColor = rhs._color; - - if ( rhs._brush != null ) - _brush = (Brush) rhs._brush.Clone(); - else - _brush = null; - _type = rhs._type; - _alignH = rhs.AlignH; - _alignV = rhs.AlignV; - _isScaled = rhs.IsScaled; - _rangeMin = rhs._rangeMin; - _rangeMax = rhs._rangeMax; - _rangeDefault = rhs._rangeDefault; - _gradientBM = null; - - if ( rhs._colorList != null ) - _colorList = (Color[]) rhs._colorList.Clone(); - else - _colorList = null; - - if ( rhs._positionList != null ) - { - _positionList = (float[]) rhs._positionList.Clone(); - } - else - _positionList = null; - - if ( rhs._image != null ) - _image = (Image) rhs._image.Clone(); - else - _image = null; - - _angle = rhs._angle; - _wrapMode = rhs._wrapMode; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Fill Clone() - { - return new Fill( this ); - } - - private void CreateBrushFromBlend( ColorBlend blend, float angle ) - { - _angle = angle; - - _colorList = (Color[]) blend.Colors.Clone(); - _positionList = (float[]) blend.Positions.Clone(); - - _brush = new LinearGradientBrush( new Rectangle( 0, 0, 100, 100 ), - Color.Red, Color.White, angle ); - ((LinearGradientBrush)_brush).InterpolationColors = blend; - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - // schema changed to 2 with addition of rangeDefault - // schema changed to 10 with version 5 refactor -- not backwards compatible - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Fill( SerializationInfo info, StreamingContext context ) - { - Init(); - - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _color = (Color) info.GetValue( "color", typeof(Color) ); - _secondaryValueGradientColor = (Color) info.GetValue( "secondaryValueGradientColor", typeof( Color ) ); - //brush = (Brush) info.GetValue( "brush", typeof(Brush) ); - //brushHolder = (BrushHolder) info.GetValue( "brushHolder", typeof(BrushHolder) ); - _type = (FillType) info.GetValue( "type", typeof(FillType) ); - _isScaled = info.GetBoolean( "isScaled" ); - _alignH = (AlignH) info.GetValue( "alignH", typeof(AlignH) ); - _alignV = (AlignV) info.GetValue( "alignV", typeof(AlignV) ); - _rangeMin = info.GetDouble( "rangeMin" ); - _rangeMax = info.GetDouble( "rangeMax" ); - - //BrushHolder brushHolder = (BrushHolder) info.GetValue( "brushHolder", typeof( BrushHolder ) ); - //brush = brush; - - _colorList = (Color[]) info.GetValue( "colorList", typeof(Color[]) ); - _positionList = (float[]) info.GetValue( "positionList", typeof(float[]) ); - _angle = info.GetSingle( "angle" ); - _image = (Image) info.GetValue( "image", typeof(Image) ); - _wrapMode = (WrapMode) info.GetValue( "wrapMode", typeof(WrapMode) ); - - if ( _colorList != null && _positionList != null ) - { - ColorBlend blend = new ColorBlend(); - blend.Colors = _colorList; - blend.Positions = _positionList; - CreateBrushFromBlend( blend, _angle ); - } - else if ( _image != null ) - { - _brush = new TextureBrush( _image, _wrapMode ); - } - - _rangeDefault = info.GetDouble( "rangeDefault" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - - info.AddValue( "schema", schema ); - info.AddValue( "color", _color ); - info.AddValue( "secondaryValueGradientColor", _secondaryValueGradientColor ); - //info.AddValue( "brush", brush ); - //info.AddValue( "brushHolder", brushHolder ); - info.AddValue( "type", _type ); - info.AddValue( "isScaled", _isScaled ); - info.AddValue( "alignH", _alignH ); - info.AddValue( "alignV", _alignV ); - info.AddValue( "rangeMin", _rangeMin ); - info.AddValue( "rangeMax", _rangeMax ); - - //BrushHolder brushHolder = new BrushHolder(); - //brush = brush; - //info.AddValue( "brushHolder", brushHolder ); - - info.AddValue( "colorList", _colorList ); - info.AddValue( "positionList", _positionList ); - info.AddValue( "angle", _angle ); - info.AddValue( "image", _image ); - info.AddValue( "wrapMode", _wrapMode ); - - info.AddValue( "rangeDefault", _rangeDefault ); - } - #endregion - - #region Properties - - /// - /// The fill color. This property is used as a single color to make a solid fill - /// ( is ), or it can be used in - /// combination with to make a - /// - /// when is and - /// is null. - /// - /// - public Color Color - { - get { return _color; } - set { _color = value; } - } - - /// - /// Gets or sets the secondary color for gradientByValue fills. - /// - /// - /// This property is only applicable if the is - /// , - /// , or - /// . Once the gradient-by-value logic picks - /// a color, a new gradient will be created using the SecondaryValueGradientColor, the - /// resulting gradient-by-value color, and the angle setting for this - /// . Use a value of Color.Empty to have - /// a solid-color resulting from a gradient-by-value - /// . - /// - public Color SecondaryValueGradientColor - { - get { return _secondaryValueGradientColor; } - set { _secondaryValueGradientColor = value; } - } - - /// - /// The custom fill brush. This can be a , a - /// , or a . This property is - /// only applicable if the property is set - /// to . - /// - public Brush Brush - { - get { return _brush; } - set { _brush = value; } - } - /// - /// Determines the type of fill, which can be either solid - /// color () or a custom brush - /// (). See for - /// more information. - /// - /// - public FillType Type - { - get { return _type; } - set { _type = value; } - } - /// - /// This property determines the type of color fill. - /// Returns true if the property is either - /// or - /// . If set to true, this property - /// will automatically set the to - /// . If set to false, this property - /// will automatically set the to - /// . In order to get a regular - /// solid-color fill, you have to manually set - /// to . - /// - /// - /// - /// - public bool IsVisible - { - get { return _type != FillType.None; } - set { _type = value ? ( _type == FillType.None ? FillType.Brush : _type ) : FillType.None; } - } - - /// - /// Determines if the brush will be scaled to the bounding box - /// of the filled object. If this value is false, then the brush will only be aligned - /// with the filled object based on the and - /// properties. - /// - public bool IsScaled - { - get { return _isScaled; } - set { _isScaled = value; } - } - - /// - /// Determines how the brush will be aligned with the filled object - /// in the horizontal direction. This value is a enumeration. - /// This field only applies if is false. - /// - /// - public AlignH AlignH - { - get { return _alignH; } - set { _alignH = value; } - } - - /// - /// Determines how the brush will be aligned with the filled object - /// in the vertical direction. This value is a enumeration. - /// This field only applies if is false. - /// - /// - public AlignV AlignV - { - get { return _alignV; } - set { _alignV = value; } - } - - /// - /// Returns a boolean value indicating whether or not this fill is a "Gradient-By-Value" - /// type. This is true for , , - /// or . - /// - /// - /// The gradient by value fill method allows the fill color for each point or bar to - /// be based on a value for that point (either X, Y, or Z in the . - /// For example, assume a class is defined with a linear gradient ranging from - /// to and the - /// is set to . If is set to - /// 100.0 and is set to 200.0, then a point that has a Y value of - /// 100 or less will be colored blue, a point with a Y value of 200 or more will be - /// colored red, and a point between 100 and 200 will have a color based on a linear scale - /// between blue and red. Note that the fill color is always solid for any given point. - /// You can use the Z value from along with - /// to color individual points according to some - /// property that is independent of the X,Y point pair. - /// - /// true if this is a Gradient-by-value type, false otherwise - /// - /// - /// - public bool IsGradientValueType - { - get { return _type == FillType.GradientByX || _type == FillType.GradientByY || - _type == FillType.GradientByZ || _type == FillType.GradientByColorValue; } - } - - /// - /// The minimum user-scale value for the gradient-by-value determination. This defines - /// the user-scale value for the start of the gradient. - /// - /// - /// - /// - /// - /// - /// - /// A double value, in user scale unit - public double RangeMin - { - get { return _rangeMin; } - set { _rangeMin = value; } - } - /// - /// The maximum user-scale value for the gradient-by-value determination. This defines - /// the user-scale value for the end of the gradient. - /// - /// - /// - /// - /// - /// - /// - /// A double value, in user scale unit - public double RangeMax - { - get { return _rangeMax; } - set { _rangeMax = value; } - } - - /// - /// The default user-scale value for the gradient-by-value determination. This defines the - /// value that will be used when there is no point value available, or the actual point value - /// is invalid. - /// - /// - /// Note that this value, when defined, will determine the color that is used in the legend. - /// If this value is set to double.MaxValue, then it remains "undefined." In this case, the - /// legend symbols will actually be filled with a color gradient representing the range of - /// colors. - /// - /// - /// - /// - /// - /// - /// - /// A double value, in user scale unit - public double RangeDefault - { - get { return _rangeDefault; } - set { _rangeDefault = value; } - } - - #endregion - - #region Methods - - /// - /// Create a fill brush using current properties. This method will construct a brush based on the - /// settings of , - /// and . If - /// is set to and - /// - /// is null, then a will be created between the colors of - /// and . - /// - /// A rectangle that bounds the object to be filled. This determines - /// the start and end of the gradient fill. - /// A class representing the fill brush - public Brush MakeBrush( RectangleF rect ) - { - // just provide a default value for the valueFraction - // return MakeBrush( rect, new PointPair( 0.5, 0.5, 0.5 ) ); - return MakeBrush( rect, null ); - } - - /// - /// Create a fill brush using current properties. This method will construct a brush based on the - /// settings of , - /// and . If - /// is set to and - /// - /// is null, then a will be created between the colors of - /// and . - /// - /// A rectangle that bounds the object to be filled. This determines - /// the start and end of the gradient fill. - /// The data value to be used for a value-based - /// color gradient. This is only applicable for , - /// or . - /// A class representing the fill brush - public Brush MakeBrush( RectangleF rect, PointPair dataValue ) - { - // get a brush - if ( this.IsVisible && ( !_color.IsEmpty || _brush != null ) ) - { - if ( rect.Height < 1.0F ) - rect.Height = 1.0F; - if ( rect.Width < 1.0F ) - rect.Width = 1.0F; - - //Brush brush; - if ( _type == FillType.Brush ) - { - return ScaleBrush( rect, _brush, _isScaled ); - } - else if ( IsGradientValueType ) - { - if ( dataValue != null ) - { - if ( !_secondaryValueGradientColor.IsEmpty ) - { - // Go ahead and create a new Fill so we can do all the scaling, etc., - // that is associated with a gradient - Fill tmpFill = new Fill( _secondaryValueGradientColor, - GetGradientColor( dataValue ), _angle ); - return tmpFill.MakeBrush( rect ); - } - else - return new SolidBrush( GetGradientColor( dataValue ) ); - } - else if ( _rangeDefault != double.MaxValue ) - { - if ( !_secondaryValueGradientColor.IsEmpty ) - { - // Go ahead and create a new Fill so we can do all the scaling, etc., - // that is associated with a gradient - Fill tmpFill = new Fill( _secondaryValueGradientColor, - GetGradientColor( _rangeDefault ), _angle ); - return tmpFill.MakeBrush( rect ); - } - else - return new SolidBrush( GetGradientColor( _rangeDefault ) ); - } - else - return ScaleBrush( rect, _brush, true ); - } - else - return new SolidBrush( _color ); - } - - // Always return a suitable default - return new SolidBrush( Color.White ); - } - - internal Color GetGradientColor( PointPair dataValue ) - { - double val; - - if ( dataValue == null ) - val = _rangeDefault; - else if ( _type == FillType.GradientByColorValue ) - val = dataValue.ColorValue; - else if ( _type == FillType.GradientByZ ) - val = dataValue.Z; - else if ( _type == FillType.GradientByY ) - val = dataValue.Y; - else - val = dataValue.X; - - return GetGradientColor( val ); - } - - internal Color GetGradientColor( double val ) - { - double valueFraction; - - if ( Double.IsInfinity( val ) || double.IsNaN( val ) || val == PointPair.Missing ) - val = _rangeDefault; - - if ( _rangeMax - _rangeMin < 1e-20 || val == double.MaxValue ) - valueFraction = 0.5; - else - valueFraction = ( val - _rangeMin ) / ( _rangeMax - _rangeMin ); - - if ( valueFraction < 0.0 ) - valueFraction = 0.0; - else if ( valueFraction > 1.0 ) - valueFraction = 1.0; - - if ( _gradientBM == null ) - { - RectangleF rect = new RectangleF( 0, 0, 100, 1 ); - _gradientBM = new Bitmap( 100, 1 ); - Graphics gBM = Graphics.FromImage( _gradientBM ); - - Brush tmpBrush = ScaleBrush( rect, _brush, true ); - gBM.FillRectangle( tmpBrush, rect ); - } - - return _gradientBM.GetPixel( (int) (99.9 * valueFraction), 0 ); - } - - private Brush ScaleBrush( RectangleF rect, Brush brush, bool isScaled ) - { - if ( brush != null ) - { - if ( brush is SolidBrush ) - { - return (Brush) brush.Clone(); - } - else if ( brush is LinearGradientBrush ) - { - LinearGradientBrush linBrush = (LinearGradientBrush) brush.Clone(); - - if ( isScaled ) - { - linBrush.ScaleTransform( rect.Width / linBrush.Rectangle.Width, - rect.Height / linBrush.Rectangle.Height, MatrixOrder.Append ); - linBrush.TranslateTransform( rect.Left - linBrush.Rectangle.Left, - rect.Top - linBrush.Rectangle.Top, MatrixOrder.Append ); - } - else - { - float dx = 0, - dy = 0; - switch ( _alignH ) - { - case AlignH.Left: - dx = rect.Left - linBrush.Rectangle.Left; - break; - case AlignH.Center: - dx = ( rect.Left + rect.Width / 2.0F ) - linBrush.Rectangle.Left; - break; - case AlignH.Right: - dx = ( rect.Left + rect.Width ) - linBrush.Rectangle.Left; - break; - } - - switch ( _alignV ) - { - case AlignV.Top: - dy = rect.Top - linBrush.Rectangle.Top; - break; - case AlignV.Center: - dy = ( rect.Top + rect.Height / 2.0F ) - linBrush.Rectangle.Top; - break; - case AlignV.Bottom: - dy = ( rect.Top + rect.Height) - linBrush.Rectangle.Top; - break; - } - - linBrush.TranslateTransform( dx, dy, MatrixOrder.Append ); - } - - return linBrush; - - } // LinearGradientBrush - else if ( brush is TextureBrush ) - { - TextureBrush texBrush = (TextureBrush) brush.Clone(); - - if ( isScaled ) - { - texBrush.ScaleTransform( rect.Width / texBrush.Image.Width, - rect.Height / texBrush.Image.Height, MatrixOrder.Append ); - texBrush.TranslateTransform( rect.Left, rect.Top, MatrixOrder.Append ); - } - else - { - float dx = 0, - dy = 0; - switch ( _alignH ) - { - case AlignH.Left: - dx = rect.Left; - break; - case AlignH.Center: - dx = ( rect.Left + rect.Width / 2.0F ); - break; - case AlignH.Right: - dx = ( rect.Left + rect.Width ); - break; - } - - switch ( _alignV ) - { - case AlignV.Top: - dy = rect.Top; - break; - case AlignV.Center: - dy = ( rect.Top + rect.Height / 2.0F ); - break; - case AlignV.Bottom: - dy = ( rect.Top + rect.Height); - break; - } - - texBrush.TranslateTransform( dx, dy, MatrixOrder.Append ); - } - - return texBrush; - } - else // other brush type - { - return (Brush) brush.Clone(); - } - } - else - // If they didn't provide a brush, make one using the fillcolor gradient to white - return new LinearGradientBrush( rect, Color.White, _color, 0F ); - } - - /// - /// Fill the background of the area, using the - /// fill type from this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The struct specifying the area - /// to be filled - public void Draw( Graphics g, RectangleF rect ) - { - Draw( g, rect, null ); - /* - if ( this.IsVisible ) - { - using( Brush brush = this.MakeBrush( rect ) ) - { - g.FillRectangle( brush, rect ); - //brush.Dispose(); - } - } - */ - } - - /// - /// Fill the background of the area, using the - /// fill type from this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The struct specifying the area - /// to be filled - /// The data value to be used in case it's a - /// , , or - /// . - public void Draw( Graphics g, RectangleF rect, PointPair pt ) - { - if ( this.IsVisible ) - { - using ( Brush brush = this.MakeBrush( rect, pt ) ) - { - g.FillRectangle( brush, rect ); - } - } - } - - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/FilteredPointList.cs b/SDK/ZedGraphs/ZedGraph/FilteredPointList.cs deleted file mode 100644 index f42e4cc..0000000 --- a/SDK/ZedGraphs/ZedGraph/FilteredPointList.cs +++ /dev/null @@ -1,321 +0,0 @@ -//============================================================================ -//FilteredPointList class -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//=============================================================================using System; -using System; - -namespace ZedGraph -{ - /// - /// An example of an implementation that stores large datasets, and - /// selectively filters the output data depending on the displayed range. - /// - /// - /// This class will refilter the data points each time is called. The - /// data are filtered down to points, within the data bounds of - /// a minimum and maximum data range. The data are filtered by simply skipping - /// points to achieve the desired total number of points. Input arrays are assumed to be - /// monotonically increasing in X, and evenly spaced in X. - /// - /// - /// - /// - /// - /// - /// John Champion with mods by Christophe Holmes - /// $Revision: 1.11 $ $Date: 2007-11-29 02:15:39 $ - [Serializable] - public class FilteredPointList : IPointList - { - - #region Fields - - /// - /// Instance of an array of x values - /// - private double[] _x; - /// - /// Instance of an array of x values - /// - private double[] _y; - /* - /// - /// This is the minimum value of the range of interest (typically the minimum of - /// the range that you have zoomed into) - /// - //private double _xMinBound = double.MinValue; - /// - /// This is the maximum value of the range of interest (typically the maximum of - /// the range that you have zoomed into) - /// - //private double _xMaxBound = double.MaxValue; - */ - /// - /// This is the maximum number of points that you want to see in the filtered dataset - /// - private int _maxPts = -1; - - /// - /// The index of the xMinBound above - /// - private int _minBoundIndex = -1; - /// - /// The index of the xMaxBound above - /// - private int _maxBoundIndex = -1; - -// /// -// /// Switch used to indicate if the next filtered point should be the high point or the -// /// low point within the current range. -// /// -// private bool _upDown = false; - -// /// -// /// Determines if the high/low logic will be used. -// /// -// private bool _isApplyHighLowLogic = true; - - #endregion - - #region Properties - - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// - /// Returns for any value of - /// that is outside of its corresponding array bounds. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public PointPair this[ int index ] - { - get - { - // See if the array should be bounded - if ( _minBoundIndex >= 0 && _maxBoundIndex >= 0 && _maxPts >= 0 ) - { - // get number of points in bounded range - int nPts = _maxBoundIndex - _minBoundIndex + 1; - - if ( nPts > _maxPts ) - { - // if we're skipping points, then calculate the new index - index = _minBoundIndex + (int) ( (double) index * (double) nPts / (double) _maxPts ); - } - else - { - // otherwise, index is just offset by the start of the bounded range - index += _minBoundIndex; - } - } - - double xVal, yVal; - if ( index >= 0 && index < _x.Length ) - xVal = _x[index]; - else - xVal = PointPair.Missing; - - if ( index >= 0 && index < _y.Length ) - yVal = _y[index]; - else - yVal = PointPair.Missing; - - - - return new PointPair( xVal, yVal, PointPair.Missing, null ); - } - - set - { - // See if the array should be bounded - if ( _minBoundIndex >= 0 && _maxBoundIndex >= 0 && _maxPts >= 0 ) - { - // get number of points in bounded range - int nPts = _maxBoundIndex - _minBoundIndex + 1; - - if ( nPts > _maxPts ) - { - // if we're skipping points, then calculate the new index - index = _minBoundIndex + (int) ( (double) index * (double) nPts / (double) _maxPts ); - } - else - { - // otherwise, index is just offset by the start of the bounded range - index += _minBoundIndex; - } - } - - if ( index >= 0 && index < _x.Length ) - _x[index] = value.X; - - if ( index >= 0 && index < _y.Length ) - _y[index] = value.Y; - } - } - - /// - /// Returns the number of points according to the current state of the filter. - /// - public int Count - { - get - { - int arraySize = _x.Length; - - // Is the filter active? - if ( _minBoundIndex >= 0 && _maxBoundIndex >= 0 && _maxPts > 0 ) - { - // get the number of points within the filter bounds - int boundSize = _maxBoundIndex - _minBoundIndex + 1; - - // limit the point count to the filter bounds - if ( boundSize < arraySize ) - arraySize = boundSize; - - // limit the point count to the declared max points - if ( arraySize > _maxPts ) - arraySize = _maxPts; - } - - return arraySize; - } - } - - /// - /// Gets the desired number of filtered points to output. You can set this value by - /// calling . - /// - public int MaxPts - { - get { return _maxPts; } - } - - - #endregion - - #region Constructors - - /// - /// Constructor to initialize the PointPairList from two arrays of - /// type double. - /// - public FilteredPointList( double[] x, double[] y ) - { - _x = x; - _y = y; - } - - /// - /// The Copy Constructor - /// - /// The FilteredPointList from which to copy - public FilteredPointList( FilteredPointList rhs ) - { - _x = (double[]) rhs._x.Clone(); - _y = (double[]) rhs._y.Clone(); - _minBoundIndex = rhs._minBoundIndex; - _maxBoundIndex = rhs._maxBoundIndex; - _maxPts = rhs._maxPts; - - } - - /// - /// Deep-copy clone routine - /// - /// A new, independent copy of the FilteredPointList - virtual public object Clone() - { - return new FilteredPointList( this ); - } - - - #endregion - - #region Methods - - /// - /// Set the data bounds to the specified minimum, maximum, and point count. Use values of - /// min=double.MinValue and max=double.MaxValue to get the full range of data. Use maxPts=-1 - /// to not limit the number of points. Call this method anytime the zoom range is changed. - /// - /// The lower bound for the X data of interest - /// The upper bound for the X data of interest - /// The maximum number of points allowed to be - /// output by the filter - // New code mods by ingineer - public void SetBounds( double min, double max, int maxPts ) - { - _maxPts = maxPts; - - // find the index of the start and end of the bounded range - int first = Array.BinarySearch( _x, min ); - int last = Array.BinarySearch( _x, max ); - - // Make sure the bounded indices are legitimate - // if BinarySearch() doesn't find the value, it returns the bitwise - // complement of the index of the 1st element larger than the sought value - - if (first < 0) - { - if (first == -1) - first = 0; - else - first = ~(first + 1); - } - - if ( last < 0 ) - last = ~last; - - _minBoundIndex = first; - _maxBoundIndex = last; - } - - // The old version, as of 21-Oct-2007 - //public void SetBounds2(double min, double max, int maxPts) - //{ - // _maxPts = maxPts; - - // // assume data points are equally spaced, and calculate the X step size between - // // each data point - // double step = (_x[_x.Length - 1] - _x[0]) / (double)_x.Length; - - // if (min < _x[0]) - // min = _x[0]; - // if (max > _x[_x.Length - 1]) - // max = _x[_x.Length - 1]; - - // // calculate the index of the start of the bounded range - // int first = (int)((min - _x[0]) / step); - - // // calculate the index of the last point of the bounded range - // int last = (int)((max - min) / step + first); - - // // Make sure the bounded indices are legitimate - // first = Math.Max(Math.Min(first, _x.Length), 0); - // last = Math.Max(Math.Min(last, _x.Length), 0); - - // _minBoundIndex = first; - // _maxBoundIndex = last; - //} - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/FontSpec.cs b/SDK/ZedGraphs/ZedGraph/FontSpec.cs deleted file mode 100644 index 65be3cd..0000000 --- a/SDK/ZedGraphs/ZedGraph/FontSpec.cs +++ /dev/null @@ -1,1503 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The class is a generic font class that maintains the font family, - /// attributes, colors, border and fill modes, font size, and angle information. - /// This class can render text with a variety of alignment options using the - /// and parameters in the - /// method. - /// - /// - /// John Champion - /// $Revision: 3.24 $ $Date: 2007-01-25 07:56:08 $ - [Serializable] - public class FontSpec : ICloneable, ISerializable - { - #region Fields - /// - /// Private field that stores the color of the font characters for this - /// . Use the public property - /// to access this value. - /// - /// A system reference. - private Color _fontColor; - /// - /// Private field that stores the font family name for this . - /// Use the public property to access this value. - /// - /// A text string with the font family name, e.g., "Arial" - private string _family; - /// - /// Private field that determines whether this is - /// drawn with bold typeface. - /// Use the public property to access this value. - /// - /// A boolean value, true for bold, false for normal - private bool _isBold; - /// - /// Private field that determines whether this is - /// drawn with italic typeface. - /// Use the public property to access this value. - /// - /// A boolean value, true for italic, false for normal - private bool _isItalic; - /// - /// Private field that determines whether this is - /// drawn with underlined typeface. - /// Use the public property to access this value. - /// - /// A boolean value, true for underline, false for normal - private bool _isUnderline; - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Fill _fill; - /// - /// Private field that determines the properties of the border around the text. - /// Use the public property to access this value. - /// - private Border _border; - - /// - /// Private field that determines the angle at which this - /// object is drawn. Use the public property - /// to access this value. - /// - /// The angle of the font, measured in anti-clockwise degrees from - /// horizontal. Negative values are permitted. - private float _angle; - - /// - /// Private field that determines the alignment with which this - /// object is drawn. This alignment really only - /// affects multi-line strings. Use the public property - /// to access this value. - /// - /// A enumeration. - private StringAlignment _stringAlignment; - - /// - /// Private field that determines the size of the font for this - /// object. Use the public property - /// to access this value. - /// - /// The size of the font, measured in points (1/72 inch). - private float _size; - - /// - /// Private field that stores a reference to the - /// object for this . This font object will be at - /// the actual drawn size according to the current - /// size of the . Use the public method - /// to access this font object. - /// - /// A reference to a object - private Font _font; - - /// - /// Private field that determines if the will be - /// displayed using anti-aliasing logic. - /// Use the public property to access this value. - /// - private bool _isAntiAlias; - /// - /// Private field that determines if the will be - /// displayed with a drop shadow. - /// Use the public property to access this value. - /// - private bool _isDropShadow; - /// - /// Private field that determines the color of the dropshadow for this - /// . - /// Use the public property to access this value. - /// - private Color _dropShadowColor; - /// - /// Private field that determines the offset angle of the dropshadow for this - /// . - /// Use the public property to access this value. - /// - private float _dropShadowAngle; - /// - /// Private field that determines the offset distance of the dropshadow for this - /// . - /// Use the public property to access this value. - /// - private float _dropShadowOffset; - - /// - /// Private field that stores a reference to the - /// object that will be used for superscripts. This font object will be a - /// fraction of the , - /// based on the value of . This - /// property is internal, and has no public access. - /// - /// A reference to a object - private Font _superScriptFont; - - /// - /// Private field that temporarily stores the scaled size of the font for this - /// object. This represents the actual on-screen - /// size, rather than the that represents the reference - /// size for a "full-sized" . - /// - /// The size of the font, measured in points (1/72 inch). - private float _scaledSize; - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default size fraction of the superscript font, expressed as a fraction - /// of the size of the main font. - /// - public static float SuperSize = 0.85F; - /// - /// The default shift fraction of the superscript, expressed as a - /// fraction of the superscripted character height. This is the height - /// above the main font (a zero shift means the main font and the superscript - /// font have the tops aligned). - /// - public static float SuperShift = 0.4F; - /// - /// The default color for filling in the background of the text block - /// ( property). - /// - public static Color FillColor = Color.White; - /// - /// The default custom brush for filling in this - /// ( property). - /// - public static Brush FillBrush = null; - /// - /// The default fill mode for this - /// ( property). - /// - public static FillType FillType = FillType.Solid; - /// - /// Default value for the alignment with which this - /// object is drawn. This alignment really only - /// affects multi-line strings. - /// - /// A enumeration. - public static StringAlignment StringAlignment = StringAlignment.Center; - - /// - /// Default value for , which determines - /// if the drop shadow is displayed for this . - /// - public static bool IsDropShadow = false; - /// - /// Default value for , which determines - /// if anti-aliasing logic is used for this . - /// - public static bool IsAntiAlias = false; - /// - /// Default value for , which determines - /// the color of the drop shadow for this . - /// - public static Color DropShadowColor = Color.Black; - /// - /// Default value for , which determines - /// the offset angle of the drop shadow for this . - /// - public static float DropShadowAngle = 45f; - /// - /// Default value for , which determines - /// the offset distance of the drop shadow for this . - /// - public static float DropShadowOffset = 0.05f; - - } - #endregion - - #region Properties - /// - /// The color of the font characters for this . - /// Note that the border and background - /// colors are set using the and - /// properties, respectively. - /// - /// A system reference. - public Color FontColor - { - get { return _fontColor; } - set { _fontColor = value; } - } - /// - /// The font family name for this . - /// - /// A text string with the font family name, e.g., "Arial" - public string Family - { - get { return _family; } - set - { - if ( value != _family ) - { - _family = value; - Remake( _scaledSize / _size, this.Size, ref _scaledSize, ref _font ); - } - } - } - /// - /// Determines whether this is - /// drawn with bold typeface. - /// - /// A boolean value, true for bold, false for normal - public bool IsBold - { - get { return _isBold; } - set - { - if ( value != _isBold ) - { - _isBold = value; - Remake( _scaledSize / _size, this.Size, ref _scaledSize, ref _font ); - } - } - } - /// - /// Determines whether this is - /// drawn with italic typeface. - /// - /// A boolean value, true for italic, false for normal - public bool IsItalic - { - get { return _isItalic; } - set - { - if ( value != _isItalic ) - { - _isItalic = value; - Remake( _scaledSize / _size, this.Size, ref _scaledSize, ref _font ); - } - } - } - /// - /// Determines whether this is - /// drawn with underlined typeface. - /// - /// A boolean value, true for underline, false for normal - public bool IsUnderline - { - get { return _isUnderline; } - set - { - if ( value != _isUnderline ) - { - _isUnderline = value; - Remake( _scaledSize / _size, this.Size, ref _scaledSize, ref _font ); - } - } - } - /// - /// The angle at which this object is drawn. - /// - /// The angle of the font, measured in anti-clockwise degrees from - /// horizontal. Negative values are permitted. - public float Angle - { - get { return _angle; } - set { _angle = value; } - } - - /// - /// Determines the alignment with which this - /// object is drawn. This alignment really only - /// affects multi-line strings. - /// - /// A enumeration. - public StringAlignment StringAlignment - { - get { return _stringAlignment; } - set { _stringAlignment = value; } - } - - /// - /// The size of the font for this object. - /// - /// The size of the font, measured in points (1/72 inch). - public float Size - { - get { return _size; } - set - { - if ( value != _size ) - { - Remake( _scaledSize / _size * value, _size, ref _scaledSize, - ref _font ); - _size = value; - } - } - } - /// - /// Gets or sets the class used to draw the border border - /// around this text. - /// - public Border Border - { - get { return _border; } - set { _border = value; } - } - - /// - /// Gets or sets the data for this - /// , which controls how the background - /// behind the text is filled. - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - - /// - /// Gets or sets a value that determines if the will be - /// drawn using anti-aliasing logic within GDI+. - /// - /// - /// If this property is set to true, it will override the current setting of - /// by setting the value temporarily to - /// . If this property is set to false, - /// the the current setting of will be - /// left as-is. - /// - public bool IsAntiAlias - { - get { return _isAntiAlias; } - set { _isAntiAlias = value; } - } - /// - /// Gets or sets a value that determines if the will be - /// displayed with a drop shadow. - /// - /// - /// - /// - public bool IsDropShadow - { - get { return _isDropShadow; } - set { _isDropShadow = value; } - } - /// - /// Gets or sets the color of the drop shadow for this . - /// - /// - /// This value only applies if is true. - /// - /// - /// - /// - public Color DropShadowColor - { - get { return _dropShadowColor; } - set { _dropShadowColor = value; } - } - /// - /// Gets or sets the offset angle of the drop shadow for this . - /// - /// - /// This value only applies if is true. - /// - /// The angle, measured in anti-clockwise degrees from - /// horizontal. Negative values are permitted. - /// - /// - /// - public float DropShadowAngle - { - get { return _dropShadowAngle; } - set { _dropShadowAngle = value; } - } - /// - /// Gets or sets the offset distance of the drop shadow for this . - /// - /// - /// This value only applies if is true. - /// - /// The offset distance, measured as a fraction of the scaled font height. - /// - /// - /// - public float DropShadowOffset - { - get { return _dropShadowOffset; } - set { _dropShadowOffset = value; } - } - - #endregion - - #region Constructors - - /// - /// Construct a object with default properties. - /// - public FontSpec() - : this( "Arial", 12, Color.Black, false, false, false ) - { - } - - /// - /// Construct a object with the given properties. All other properties - /// are defaulted according to the values specified in the - /// default class. - /// - /// A text string representing the font family - /// (default is "Arial") - /// A size of the font in points. This size will be scaled - /// based on the ratio of the dimension to the - /// of the object. - /// The color with which to render the font - /// true for a bold typeface, false otherwise - /// true for an italic typeface, false otherwise - /// true for an underlined font, false otherwise - public FontSpec( string family, float size, Color color, bool isBold, - bool isItalic, bool isUnderline ) - { - Init( family, size, color, isBold, isItalic, isUnderline, - Default.FillColor, Default.FillBrush, Default.FillType ); - } - - /// - /// Construct a object with the given properties. All other properties - /// are defaulted according to the values specified in the - /// default class. - /// - /// A text string representing the font family - /// (default is "Arial") - /// A size of the font in points. This size will be scaled - /// based on the ratio of the dimension to the - /// of the object. - /// The color with which to render the font - /// true for a bold typeface, false otherwise - /// true for an italic typeface, false otherwise - /// true for an underlined font, false otherwise - /// The to use for filling in the text background - /// The to use for filling in the text background - /// The to use for the - /// text background - public FontSpec( string family, float size, Color color, bool isBold, - bool isItalic, bool isUnderline, Color fillColor, Brush fillBrush, - FillType fillType ) - { - Init( family, size, color, isBold, isItalic, isUnderline, - fillColor, fillBrush, fillType ); - } - - private void Init( string family, float size, Color color, bool isBold, - bool isItalic, bool isUnderline, Color fillColor, Brush fillBrush, - FillType fillType ) - { - _fontColor = color; - _family = family; - _isBold = isBold; - _isItalic = isItalic; - _isUnderline = isUnderline; - _size = size; - _angle = 0F; - - _isAntiAlias = Default.IsAntiAlias; - _stringAlignment = Default.StringAlignment; - _isDropShadow = Default.IsDropShadow; - _dropShadowColor = Default.DropShadowColor; - _dropShadowAngle = Default.DropShadowAngle; - _dropShadowOffset = Default.DropShadowOffset; - - _fill = new Fill( fillColor, fillBrush, fillType ); - _border = new Border( true, Color.Black, 1.0F ); - - _scaledSize = -1; - Remake( 1.0F, _size, ref _scaledSize, ref _font ); - } - - /// - /// The Copy Constructor - /// - /// The FontSpec object from which to copy - public FontSpec( FontSpec rhs ) - { - _fontColor = rhs.FontColor; - _family = rhs.Family; - _isBold = rhs.IsBold; - _isItalic = rhs.IsItalic; - _isUnderline = rhs.IsUnderline; - _fill = rhs.Fill.Clone(); - _border = rhs.Border.Clone(); - _isAntiAlias = rhs._isAntiAlias; - - _stringAlignment = rhs.StringAlignment; - _angle = rhs.Angle; - _size = rhs.Size; - - _isDropShadow = rhs._isDropShadow; - _dropShadowColor = rhs._dropShadowColor; - _dropShadowAngle = rhs._dropShadowAngle; - _dropShadowOffset = rhs._dropShadowOffset; - - _scaledSize = rhs._scaledSize; - Remake( 1.0F, _size, ref _scaledSize, ref _font ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public FontSpec Clone() - { - return new FontSpec( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - // Change to 2 with addition of isDropShadow, dropShadowColor, dropShadowAngle, dropShadowOffset - // changed to 10 with the version 5 refactor -- not backwards compatible - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected FontSpec( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _fontColor = (Color)info.GetValue( "fontColor", typeof( Color ) ); - _family = info.GetString( "family" ); - _isBold = info.GetBoolean( "isBold" ); - _isItalic = info.GetBoolean( "isItalic" ); - _isUnderline = info.GetBoolean( "isUnderline" ); - _isAntiAlias = info.GetBoolean( "isAntiAlias" ); - - _fill = (Fill)info.GetValue( "fill", typeof( Fill ) ); - _border = (Border)info.GetValue( "border", typeof( Border ) ); - _angle = info.GetSingle( "angle" ); - _stringAlignment = (StringAlignment)info.GetValue( "stringAlignment", typeof( StringAlignment ) ); - _size = info.GetSingle( "size" ); - - _isDropShadow = info.GetBoolean( "isDropShadow" ); - _dropShadowColor = (Color)info.GetValue( "dropShadowColor", typeof( Color ) ); - _dropShadowAngle = info.GetSingle( "dropShadowAngle" ); - _dropShadowOffset = info.GetSingle( "dropShadowOffset" ); - - _scaledSize = -1; - Remake( 1.0F, _size, ref _scaledSize, ref _font ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "fontColor", _fontColor ); - info.AddValue( "family", _family ); - info.AddValue( "isBold", _isBold ); - info.AddValue( "isItalic", _isItalic ); - info.AddValue( "isUnderline", _isUnderline ); - info.AddValue( "isAntiAlias", _isAntiAlias ); - - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - info.AddValue( "angle", _angle ); - info.AddValue( "stringAlignment", _stringAlignment ); - info.AddValue( "size", _size ); - - info.AddValue( "isDropShadow", _isDropShadow ); - info.AddValue( "dropShadowColor", _dropShadowColor ); - info.AddValue( "dropShadowAngle", _dropShadowAngle ); - info.AddValue( "dropShadowOffset", _dropShadowOffset ); - } - #endregion - - #region Font Construction Methods - /// - /// Recreate the font based on a new scaled size. The font - /// will only be recreated if the scaled size has changed by - /// at least 0.1 points. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The unscaled size of the font, in points - /// The scaled size of the font, in points - /// A reference to the object - private void Remake( float scaleFactor, float size, ref float scaledSize, ref Font font ) - { - float newSize = size * scaleFactor; - - float oldSize = ( font == null ) ? 0.0f : font.Size; - - // Regenerate the font only if the size has changed significantly - if ( font == null || - Math.Abs( newSize - oldSize ) > 0.1 || - font.Name != this.Family || - font.Bold != _isBold || - font.Italic != _isItalic || - font.Underline != _isUnderline ) - { - FontStyle style = FontStyle.Regular; - style = ( _isBold ? FontStyle.Bold : style ) | - ( _isItalic ? FontStyle.Italic : style ) | - ( _isUnderline ? FontStyle.Underline : style ); - - scaledSize = size * (float)scaleFactor; - font = new Font( _family, scaledSize, style, GraphicsUnit.World ); - } - } - - /// - /// Get the class for the current scaled font. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// Returns a reference to a object - /// with a size of , and font . - /// - public Font GetFont( float scaleFactor ) - { - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - return _font; - } - #endregion - - #region Rendering Methods - /// - /// Render the specified to the specifed - /// device. The text, border, and fill options - /// will be rendered as required. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A string value containing the text to be - /// displayed. This can be multiple lines, separated by newline ('\n') - /// characters - /// The X location to display the text, in screen - /// coordinates, relative to the horizontal () - /// alignment parameter - /// The Y location to display the text, in screen - /// coordinates, relative to the vertical ( - /// alignment parameter - /// A horizontal alignment parameter specified - /// using the enum type - /// A vertical alignment parameter specified - /// using the enum type - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void Draw( Graphics g, PaneBase pane, string text, float x, - float y, AlignH alignH, AlignV alignV, - float scaleFactor ) - { - this.Draw( g, pane, text, x, y, alignH, alignV, - scaleFactor, new SizeF() ); - } - - /// - /// Render the specified to the specifed - /// device. The text, border, and fill options - /// will be rendered as required. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A string value containing the text to be - /// displayed. This can be multiple lines, separated by newline ('\n') - /// characters - /// The X location to display the text, in screen - /// coordinates, relative to the horizontal () - /// alignment parameter - /// The Y location to display the text, in screen - /// coordinates, relative to the vertical ( - /// alignment parameter - /// A horizontal alignment parameter specified - /// using the enum type - /// A vertical alignment parameter specified - /// using the enum type - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The limiting area () into which the text - /// must fit. The actual rectangle may be smaller than this, but the text will be wrapped - /// to accomodate the area. - public void Draw( Graphics g, PaneBase pane, string text, float x, - float y, AlignH alignH, AlignV alignV, - float scaleFactor, SizeF layoutArea ) - { - // make sure the font size is properly scaled - //Remake( scaleFactor, this.Size, ref this.scaledSize, ref this.font ); - - SmoothingMode sModeSave = g.SmoothingMode; - TextRenderingHint sHintSave = g.TextRenderingHint; - if ( _isAntiAlias ) - { - g.SmoothingMode = SmoothingMode.HighQuality; - g.TextRenderingHint = TextRenderingHint.AntiAlias; - } - - SizeF sizeF; - if ( layoutArea.IsEmpty ) - sizeF = MeasureString( g, text, scaleFactor ); - else - sizeF = MeasureString( g, text, scaleFactor, layoutArea ); - - // Save the old transform matrix for later restoration - Matrix saveMatrix = g.Transform; - g.Transform = SetupMatrix( g.Transform, x, y, sizeF, alignH, alignV, _angle ); - - // Create a rectangle representing the border around the - // text. Note that, while the text is drawn based on the - // TopCenter position, the rectangle is drawn based on - // the TopLeft position. Therefore, move the rectangle - // width/2 to the left to align it properly - RectangleF rectF = new RectangleF( -sizeF.Width / 2.0F, 0.0F, - sizeF.Width, sizeF.Height ); - - // If the background is to be filled, fill it - _fill.Draw( g, rectF ); - - // Draw the border around the text if required - _border.Draw( g, pane, scaleFactor, rectF ); - - // make a center justified StringFormat alignment - // for drawing the text - StringFormat strFormat = new StringFormat(); - strFormat.Alignment = _stringAlignment; - // if ( this.stringAlignment == StringAlignment.Far ) - // g.TranslateTransform( sizeF.Width / 2.0F, 0F, MatrixOrder.Prepend ); - // else if ( this.stringAlignment == StringAlignment.Near ) - // g.TranslateTransform( -sizeF.Width / 2.0F, 0F, MatrixOrder.Prepend ); - - - // Draw the drop shadow text. Note that the coordinate system - // is set up such that 0,0 is at the location where the - // CenterTop of the text needs to be. - if ( _isDropShadow ) - { - float xShift = (float)( Math.Cos( _dropShadowAngle ) * - _dropShadowOffset * _font.Height ); - float yShift = (float)( Math.Sin( _dropShadowAngle ) * - _dropShadowOffset * _font.Height ); - RectangleF rectD = rectF; - rectD.Offset( xShift, yShift ); - // make a solid brush for rendering the font itself - using ( SolidBrush brushD = new SolidBrush( _dropShadowColor ) ) - g.DrawString( text, _font, brushD, rectD, strFormat ); - } - - // make a solid brush for rendering the font itself - using ( SolidBrush brush = new SolidBrush( _fontColor ) ) - { - // Draw the actual text. Note that the coordinate system - // is set up such that 0,0 is at the location where the - // CenterTop of the text needs to be. - //RectangleF layoutArea = new RectangleF( 0.0F, 0.0F, sizeF.Width, sizeF.Height ); - g.DrawString( text, _font, brush, rectF, strFormat ); - } - - // Restore the transform matrix back to original - g.Transform = saveMatrix; - - g.SmoothingMode = sModeSave; - g.TextRenderingHint = sHintSave; - } - - /// - /// Render the specified to the specifed - /// device. The text, border, and fill options - /// will be rendered as required. This special case method will show the - /// specified text as a power of 10, using the - /// and . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A string value containing the text to be - /// displayed. This can be multiple lines, separated by newline ('\n') - /// characters - /// The X location to display the text, in screen - /// coordinates, relative to the horizontal () - /// alignment parameter - /// The Y location to display the text, in screen - /// coordinates, relative to the vertical ( - /// alignment parameter - /// A horizontal alignment parameter specified - /// using the enum type - /// A vertical alignment parameter specified - /// using the enum type - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void DrawTenPower( Graphics g, GraphPane pane, string text, float x, - float y, AlignH alignH, AlignV alignV, - float scaleFactor ) - { - SmoothingMode sModeSave = g.SmoothingMode; - TextRenderingHint sHintSave = g.TextRenderingHint; - if ( _isAntiAlias ) - { - g.SmoothingMode = SmoothingMode.HighQuality; - g.TextRenderingHint = TextRenderingHint.AntiAlias; - } - - // make sure the font size is properly scaled - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - float scaledSuperSize = _scaledSize * Default.SuperSize; - Remake( scaleFactor, this.Size * Default.SuperSize, ref scaledSuperSize, - ref _superScriptFont ); - - // Get the width and height of the text - SizeF size10 = g.MeasureString( "10", _font ); - SizeF sizeText = g.MeasureString( text, _superScriptFont ); - SizeF totSize = new SizeF( size10.Width + sizeText.Width, - size10.Height + sizeText.Height * Default.SuperShift ); - float charWidth = g.MeasureString( "x", _superScriptFont ).Width; - - // Save the old transform matrix for later restoration - Matrix saveMatrix = g.Transform; - - g.Transform = SetupMatrix( g.Transform, x, y, totSize, alignH, alignV, _angle ); - - // make a center justified StringFormat alignment - // for drawing the text - StringFormat strFormat = new StringFormat(); - strFormat.Alignment = _stringAlignment; - - // Create a rectangle representing the border around the - // text. Note that, while the text is drawn based on the - // TopCenter position, the rectangle is drawn based on - // the TopLeft position. Therefore, move the rectangle - // width/2 to the left to align it properly - RectangleF rectF = new RectangleF( -totSize.Width / 2.0F, 0.0F, - totSize.Width, totSize.Height ); - - // If the background is to be filled, fill it - _fill.Draw( g, rectF ); - - // Draw the border around the text if required - _border.Draw( g, pane, scaleFactor, rectF ); - - // make a solid brush for rendering the font itself - using ( SolidBrush brush = new SolidBrush( _fontColor ) ) - { - // Draw the actual text. Note that the coordinate system - // is set up such that 0,0 is at the location where the - // CenterTop of the text needs to be. - g.DrawString( "10", _font, brush, - ( -totSize.Width + size10.Width ) / 2.0F, - sizeText.Height * Default.SuperShift, strFormat ); - g.DrawString( text, _superScriptFont, brush, - ( totSize.Width - sizeText.Width - charWidth ) / 2.0F, - 0.0F, - strFormat ); - } - - // Restore the transform matrix back to original - g.Transform = saveMatrix; - - g.SmoothingMode = sModeSave; - g.TextRenderingHint = sHintSave; - } - #endregion - - #region Sizing Methods - /// - /// Get the height of the scaled font - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The scaled font height, in pixels - public float GetHeight( float scaleFactor ) - { - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - float height = _font.Height; - if ( _isDropShadow ) - height += (float)( Math.Sin( _dropShadowAngle ) * _dropShadowOffset * _font.Height ); - return height; - } - /// - /// Get the average character width of the scaled font. The average width is - /// based on the character 'x' - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The scaled font width, in pixels - public float GetWidth( Graphics g, float scaleFactor ) - { - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - return g.MeasureString( "x", _font ).Width; - } - - /// - /// Get the total width of the specified text string - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The text string for which the width is to be calculated - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The scaled text width, in pixels - public float GetWidth( Graphics g, string text, float scaleFactor ) - { - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - float width = g.MeasureString( text, _font ).Width; - if ( _isDropShadow ) - width += (float)( Math.Cos( _dropShadowAngle ) * _dropShadowOffset * _font.Height ); - return width; - } - /// - /// Get a struct representing the width and height - /// of the specified text string, based on the scaled font size - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The text string for which the width is to be calculated - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The scaled text dimensions, in pixels, in the form of - /// a struct - public SizeF MeasureString( Graphics g, string text, float scaleFactor ) - { - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - SizeF size = g.MeasureString( text, _font ); - if ( _isDropShadow ) - { - size.Width += (float)( Math.Cos( _dropShadowAngle ) * - _dropShadowOffset * _font.Height ); - size.Height += (float)( Math.Sin( _dropShadowAngle ) * - _dropShadowOffset * _font.Height ); - } - return size; - } - - /// - /// Get a struct representing the width and height - /// of the specified text string, based on the scaled font size, and using - /// the specified as an outer limit. - /// - /// - /// This method will allow the text to wrap as necessary to fit the - /// . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The text string for which the width is to be calculated - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The limiting area () into which the text - /// must fit. The actual rectangle may be smaller than this, but the text will be wrapped - /// to accomodate the area. - /// The scaled text dimensions, in pixels, in the form of - /// a struct - public SizeF MeasureString( Graphics g, string text, float scaleFactor, SizeF layoutArea ) - { - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - SizeF size = g.MeasureString( text, _font, layoutArea ); - if ( _isDropShadow ) - { - size.Width += (float)( Math.Cos( _dropShadowAngle ) * - _dropShadowOffset * _font.Height ); - size.Height += (float)( Math.Sin( _dropShadowAngle ) * - _dropShadowOffset * _font.Height ); - } - return size; - } - - /// - /// Get a struct representing the width and height - /// of the bounding box for the specified text string, based on the scaled font size. - /// - /// - /// This routine differs from in that it takes into - /// account the rotation angle of the font, and gives the dimensions of the - /// bounding box that encloses the text at the specified angle. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The text string for which the width is to be calculated - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The scaled text dimensions, in pixels, in the form of - /// a struct - public SizeF BoundingBox( Graphics g, string text, float scaleFactor ) - { - return BoundingBox( g, text, scaleFactor, new SizeF() ); - } - - /// - /// Get a struct representing the width and height - /// of the bounding box for the specified text string, based on the scaled font size. - /// - /// - /// This routine differs from in that it takes into - /// account the rotation angle of the font, and gives the dimensions of the - /// bounding box that encloses the text at the specified angle. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The text string for which the width is to be calculated - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The limiting area () into which the text - /// must fit. The actual rectangle may be smaller than this, but the text will be wrapped - /// to accomodate the area. - /// The scaled text dimensions, in pixels, in the form of - /// a struct - public SizeF BoundingBox( Graphics g, string text, float scaleFactor, SizeF layoutArea ) - { - //Remake( scaleFactor, this.Size, ref this.scaledSize, ref this.font ); - SizeF s; - if ( layoutArea.IsEmpty ) - s = MeasureString( g, text, scaleFactor ); - else - s = MeasureString( g, text, scaleFactor, layoutArea ); - - float cs = (float)Math.Abs( Math.Cos( _angle * Math.PI / 180.0 ) ); - float sn = (float)Math.Abs( Math.Sin( _angle * Math.PI / 180.0 ) ); - - SizeF s2 = new SizeF( s.Width * cs + s.Height * sn, - s.Width * sn + s.Height * cs ); - - return s2; - } - - /// - /// Get a struct representing the width and height - /// of the bounding box for the specified text string, based on the scaled font size. - /// - /// - /// This special case method will show the specified string as a power of 10, - /// superscripted and downsized according to the - /// and . - /// This routine differs from in that it takes into - /// account the rotation angle of the font, and gives the dimensions of the - /// bounding box that encloses the text at the specified angle. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The text string for which the width is to be calculated - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The scaled text dimensions, in pixels, in the form of - /// a struct - public SizeF BoundingBoxTenPower( Graphics g, string text, float scaleFactor ) - { - //Remake( scaleFactor, this.Size, ref this.scaledSize, ref this.font ); - float scaledSuperSize = _scaledSize * Default.SuperSize; - Remake( scaleFactor, this.Size * Default.SuperSize, ref scaledSuperSize, - ref _superScriptFont ); - - // Get the width and height of the text - SizeF size10 = MeasureString( g, "10", scaleFactor ); - SizeF sizeText = g.MeasureString( text, _superScriptFont ); - - if ( _isDropShadow ) - { - sizeText.Width += (float)( Math.Cos( _dropShadowAngle ) * - _dropShadowOffset * _superScriptFont.Height ); - sizeText.Height += (float)( Math.Sin( _dropShadowAngle ) * - _dropShadowOffset * _superScriptFont.Height ); - } - - SizeF totSize = new SizeF( size10.Width + sizeText.Width, - size10.Height + sizeText.Height * Default.SuperShift ); - - - float cs = (float)Math.Abs( Math.Cos( _angle * Math.PI / 180.0 ) ); - float sn = (float)Math.Abs( Math.Sin( _angle * Math.PI / 180.0 ) ); - - SizeF s2 = new SizeF( totSize.Width * cs + totSize.Height * sn, - totSize.Width * sn + totSize.Height * cs ); - - return s2; - } - - - /// - /// Determines if the specified screen point lies within the bounding box of - /// the text, taking into account alignment and rotation parameters. - /// - /// The screen point, in pixel units - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// A string value containing the text to be - /// displayed. This can be multiple lines, separated by newline ('\n') - /// characters - /// The X location to display the text, in screen - /// coordinates, relative to the horizontal () - /// alignment parameter - /// The Y location to display the text, in screen - /// coordinates, relative to the vertical ( - /// alignment parameter - /// A horizontal alignment parameter specified - /// using the enum type - /// A vertical alignment parameter specified - /// using the enum type - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// true if the point lies within the bounding box, false otherwise - public bool PointInBox( PointF pt, Graphics g, string text, float x, - float y, AlignH alignH, AlignV alignV, - float scaleFactor ) - { - return PointInBox( pt, g, text, x, y, alignH, alignV, scaleFactor, new SizeF() ); - } - - /// - /// Determines if the specified screen point lies within the bounding box of - /// the text, taking into account alignment and rotation parameters. - /// - /// The screen point, in pixel units - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// A string value containing the text to be - /// displayed. This can be multiple lines, separated by newline ('\n') - /// characters - /// The X location to display the text, in screen - /// coordinates, relative to the horizontal () - /// alignment parameter - /// The Y location to display the text, in screen - /// coordinates, relative to the vertical ( - /// alignment parameter - /// A horizontal alignment parameter specified - /// using the enum type - /// A vertical alignment parameter specified - /// using the enum type - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The limiting area () into which the text - /// must fit. The actual rectangle may be smaller than this, but the text will be wrapped - /// to accomodate the area. - /// true if the point lies within the bounding box, false otherwise - public bool PointInBox( PointF pt, Graphics g, string text, float x, - float y, AlignH alignH, AlignV alignV, - float scaleFactor, SizeF layoutArea ) - { - // make sure the font size is properly scaled - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - - // Get the width and height of the text - SizeF sizeF; - if ( layoutArea.IsEmpty ) - sizeF = g.MeasureString( text, _font ); - else - sizeF = g.MeasureString( text, _font, layoutArea ); - - // Create a bounding box rectangle for the text - RectangleF rect = new RectangleF( new PointF( -sizeF.Width / 2.0F, 0.0F ), sizeF ); - - // Build a transform matrix that inverts that drawing transform - // in this manner, the point is brought back to the box, rather - // than vice-versa. This allows the container check to be a simple - // RectangleF.Contains, since the rectangle won't be rotated. - Matrix matrix = GetMatrix( x, y, sizeF, alignH, alignV, _angle ); - - PointF[] pts = new PointF[1]; - pts[0] = pt; - matrix.TransformPoints( pts ); - - return rect.Contains( pts[0] ); - } - - private Matrix SetupMatrix( Matrix matrix, float x, float y, SizeF sizeF, AlignH alignH, - AlignV alignV, float angle ) - { - // Move the coordinate system to local coordinates - // of this text object (that is, at the specified - // x,y location) - matrix.Translate( x, y, MatrixOrder.Prepend ); - - // Rotate the coordinate system according to the - // specified angle of the FontSpec - if ( _angle != 0.0F ) - matrix.Rotate( -angle, MatrixOrder.Prepend ); - - // Since the text will be drawn by g.DrawString() - // assuming the location is the TopCenter - // (the Font is aligned using StringFormat to the - // center so multi-line text is center justified), - // shift the coordinate system so that we are - // actually aligned per the caller specified position - float xa, ya; - if ( alignH == AlignH.Left ) - xa = sizeF.Width / 2.0F; - else if ( alignH == AlignH.Right ) - xa = -sizeF.Width / 2.0F; - else - xa = 0.0F; - - if ( alignV == AlignV.Center ) - ya = -sizeF.Height / 2.0F; - else if ( alignV == AlignV.Bottom ) - ya = -sizeF.Height; - else - ya = 0.0F; - - // Shift the coordinates to accomodate the alignment - // parameters - matrix.Translate( xa, ya, MatrixOrder.Prepend ); - - return matrix; - } - - private Matrix GetMatrix( float x, float y, SizeF sizeF, AlignH alignH, AlignV alignV, - float angle ) - { - // Build a transform matrix that inverts that drawing transform - // in this manner, the point is brought back to the box, rather - // than vice-versa. This allows the container check to be a simple - // RectangleF.Contains, since the rectangle won't be rotated. - Matrix matrix = new Matrix(); - - // In this case, the bounding box is anchored to the - // top-left of the text box. Handle the alignment - // as needed. - float xa, ya; - if ( alignH == AlignH.Left ) - xa = sizeF.Width / 2.0F; - else if ( alignH == AlignH.Right ) - xa = -sizeF.Width / 2.0F; - else - xa = 0.0F; - - if ( alignV == AlignV.Center ) - ya = -sizeF.Height / 2.0F; - else if ( alignV == AlignV.Bottom ) - ya = -sizeF.Height; - else - ya = 0.0F; - - // Shift the coordinates to accomodate the alignment - // parameters - matrix.Translate( -xa, -ya, MatrixOrder.Prepend ); - - // Rotate the coordinate system according to the - // specified angle of the FontSpec - if ( angle != 0.0F ) - matrix.Rotate( angle, MatrixOrder.Prepend ); - - // Move the coordinate system to local coordinates - // of this text object (that is, at the specified - // x,y location) - matrix.Translate( -x, -y, MatrixOrder.Prepend ); - - return matrix; - } - - /// - /// Returns a polygon that defines the bounding box of - /// the text, taking into account alignment and rotation parameters. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// A string value containing the text to be - /// displayed. This can be multiple lines, separated by newline ('\n') - /// characters - /// The X location to display the text, in screen - /// coordinates, relative to the horizontal () - /// alignment parameter - /// The Y location to display the text, in screen - /// coordinates, relative to the vertical ( - /// alignment parameter - /// A horizontal alignment parameter specified - /// using the enum type - /// A vertical alignment parameter specified - /// using the enum type - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The limiting area () into which the text - /// must fit. The actual rectangle may be smaller than this, but the text will be wrapped - /// to accomodate the area. - /// A polygon of 4 points defining the area of this text - public PointF[] GetBox( Graphics g, string text, float x, - float y, AlignH alignH, AlignV alignV, - float scaleFactor, SizeF layoutArea ) - { - // make sure the font size is properly scaled - Remake( scaleFactor, this.Size, ref _scaledSize, ref _font ); - - // Get the width and height of the text - SizeF sizeF; - if ( layoutArea.IsEmpty ) - sizeF = g.MeasureString( text, _font ); - else - sizeF = g.MeasureString( text, _font, layoutArea ); - - // Create a bounding box rectangle for the text - RectangleF rect = new RectangleF( new PointF( -sizeF.Width / 2.0F, 0.0F ), sizeF ); - - Matrix matrix = new Matrix(); - SetupMatrix( matrix, x, y, sizeF, alignH, alignV, _angle ); - - PointF[] pts = new PointF[4]; - pts[0] = new PointF( rect.Left, rect.Top ); - pts[1] = new PointF( rect.Right, rect.Top ); - pts[2] = new PointF( rect.Right, rect.Bottom ); - pts[3] = new PointF( rect.Left, rect.Bottom ); - matrix.TransformPoints( pts ); - - return pts; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/GapLabel.cs b/SDK/ZedGraphs/ZedGraph/GapLabel.cs deleted file mode 100644 index 3e4fe35..0000000 --- a/SDK/ZedGraphs/ZedGraph/GapLabel.cs +++ /dev/null @@ -1,176 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that handles the data associated with a text title and its associated font - /// properties. Inherits from , and adds the - /// property for use by the and objects. - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class GapLabel : Label, ICloneable, ISerializable - { - internal float _gap; - - #region Constructors - - /// - /// Constructor to build a from the text and the - /// associated font properties. - /// - /// The representing the text to be - /// displayed - /// The font family name - /// The size of the font in points and scaled according - /// to the logic. - /// The instance representing the color - /// of the font - /// true for a bold font face - /// true for an italic font face - /// true for an underline font face - public GapLabel( string text, string fontFamily, float fontSize, Color color, bool isBold, - bool isItalic, bool isUnderline ) - : base( text, fontFamily, fontSize, color, isBold, isItalic, isUnderline ) - { - _gap = Default.Gap; - } - - /// - /// Copy constructor - /// - /// the instance to be copied. - public GapLabel( GapLabel rhs ) - : base( rhs ) - { - _gap = rhs._gap; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new GapLabel Clone() - { - return new GapLabel( this ); - } - - #endregion - - #region Properties - - /// - /// Gets or sets the gap factor between this label and the opposing - /// or . - /// - /// - /// This value is expressed as a fraction of the character height for the . - /// - public float Gap - { - get { return _gap; } - set { _gap = value; } - } - - /// - /// Calculate the size of the based on the - /// height, in pixel units and scaled according to . - /// - /// The scaling factor to be applied - public float GetScaledGap( float scaleFactor ) - { - return _fontSpec.GetHeight( scaleFactor ) * _gap; - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected GapLabel( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch2 = info.GetInt32( "schema2" ); - - _gap = info.GetSingle( "gap" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema2", schema2 ); - info.AddValue( "gap", _gap ); - } - #endregion - - #region Default - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default setting. - /// - public static float Gap = 0.3f; - } - #endregion - - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/GasGaugeNeedle.cs b/SDK/ZedGraphs/ZedGraph/GasGaugeNeedle.cs deleted file mode 100644 index dabc389..0000000 --- a/SDK/ZedGraphs/ZedGraph/GasGaugeNeedle.cs +++ /dev/null @@ -1,594 +0,0 @@ -//============================================================================ -//GasGaugeNeedle Class -//Copyright 2006 Jay Mistry -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= -using System.Runtime.Serialization; -using System.Drawing.Drawing2D; -using System; -using System.Text; -using System.Drawing; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class representing a needle on the GasGuage chart - /// s. - /// - /// Jay Mistry - /// $Revision: 1.2 $ $Date: 2007-08-11 14:37:47 $ - [Serializable] - public class GasGaugeNeedle : CurveItem, ICloneable, ISerializable - { - #region Fields - - /// - /// Value of this needle - /// - private double _needleValue; - - /// - /// Width of the line being drawn - /// - private float _needleWidth; - - /// - /// Color of the needle line - /// - private Color _color; - - /// - /// Internally calculated angle that places this needle relative to the MinValue and - /// MaxValue of 180 degree GasGuage - /// - private float _sweepAngle; - - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Fill _fill; - - /// - /// A which will customize the label display of this - /// - /// - private TextObj _labelDetail; - - /// - /// Private field that stores the class that defines the - /// properties of the border around this . Use the public - /// property to access this value. - /// - private Border _border; - - /// - /// The bounding rectangle for this . - /// - private RectangleF _boundingRectangle; - - /// - /// Private field to hold the GraphicsPath of this to be - /// used for 'hit testing'. - /// - private GraphicsPath _slicePath; - - #endregion - - #region Constructors - - /// - /// Create a new - /// - /// The value associated with this - /// instance. - /// The display color for this - /// instance. - /// The value of this . - public GasGaugeNeedle( string label, double val, Color color ) - : base( label ) - { - NeedleValue = val; - NeedleColor = color; - NeedleWidth = Default.NeedleWidth; - SweepAngle = 0f; - _border = new Border( Default.BorderColor, Default.BorderWidth ); - _labelDetail = new TextObj(); - _labelDetail.FontSpec.Size = Default.FontSize; - _slicePath = null; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public GasGaugeNeedle( GasGaugeNeedle ggn ) - : base( ggn ) - { - NeedleValue = ggn.NeedleValue; - NeedleColor = ggn.NeedleColor; - NeedleWidth = ggn.NeedleWidth; - SweepAngle = ggn.SweepAngle; - _border = ggn.Border.Clone(); - _labelDetail = ggn.LabelDetail.Clone(); - _labelDetail.FontSpec.Size = ggn.LabelDetail.FontSpec.Size; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public GasGaugeNeedle Clone() - { - return new GasGaugeNeedle( this ); - } - - #endregion - - #region Properties - - /// - /// Gets or Sets the NeedleWidth of this - /// - public float NeedleWidth - { - get { return _needleWidth; } - set { _needleWidth = value; } - } - - /// - /// Gets or Sets the Border of this - /// - public Border Border - { - get { return ( _border ); } - set { _border = value; } - } - - /// - /// Gets or Sets the SlicePath of this - /// - public GraphicsPath SlicePath - { - get { return _slicePath; } - } - - /// - /// Gets or Sets the LableDetail of this - /// - public TextObj LabelDetail - { - get { return _labelDetail; } - set { _labelDetail = value; } - } - - - /// - /// Gets or Sets the NeedelColor of this - /// - public Color NeedleColor - { - get { return _color; } - set - { - _color = value; - Fill = new Fill( _color ); - } - } - - /// - /// Gets or Sets the Fill of this - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - - /// - /// Private property that Gets or Sets the SweepAngle of this - /// - private float SweepAngle - { - get { return _sweepAngle; } - set { _sweepAngle = value; } - } - - /// - /// Gets or Sets the NeedleValue of this - /// - public double NeedleValue - { - get { return ( _needleValue ); } - set { _needleValue = value > 0 ? value : 0; } - } - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return false; - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return true; - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected GasGaugeNeedle( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _labelDetail = (TextObj)info.GetValue( "labelDetail", typeof( TextObj ) ); - _fill = (Fill)info.GetValue( "fill", typeof( Fill ) ); - _border = (Border)info.GetValue( "border", typeof( Border ) ); - _needleValue = info.GetDouble( "needleValue" ); - _boundingRectangle = (RectangleF)info.GetValue( "boundingRectangle", typeof( RectangleF ) ); - _slicePath = (GraphicsPath)info.GetValue( "slicePath", typeof( GraphicsPath ) ); - _sweepAngle = (float)info.GetDouble( "sweepAngle" ); - _color = (Color)info.GetValue( "color", typeof( Color ) ); - } - - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "labelDetail", _labelDetail ); - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - info.AddValue( "needleValue", _needleValue ); - info.AddValue( "boundingRectangle", _boundingRectangle ); - info.AddValue( "slicePath", _slicePath ); - info.AddValue( "sweepAngle", _sweepAngle ); - } - - #endregion - - #region Default - - /// - /// Specify the default property values for the class. - /// - public struct Default - { - /// - /// The default width of the gas gauge needle. Units are points, scaled according - /// to - /// - public static float NeedleWidth = 10.0F; - - /// - /// The default pen width to be used for drawing the border around the GasGaugeNeedle - /// ( property). Units are points. - /// - public static float BorderWidth = 1.0F; - - /// - /// The default border mode for GasGaugeNeedle ( - /// property). - /// true to display frame around GasGaugeNeedle, false otherwise - /// - public static bool IsBorderVisible = true; - - /// - /// The default color for drawing frames around GasGaugeNeedle - /// ( property). - /// - public static Color BorderColor = Color.Gray; - - /// - /// The default fill type for filling the GasGaugeNeedle. - /// - public static FillType FillType = FillType.Brush; - - /// - /// The default color for filling in the GasGaugeNeedle - /// ( property). - /// - public static Color FillColor = Color.Empty; - - /// - /// The default custom brush for filling in the GasGaugeNeedle. - /// ( property). - /// - public static Brush FillBrush = null; - - /// - ///Default value for controlling display. - /// - public static bool isVisible = true; - -// /// -// /// Default value for . -// /// -// public static PieLabelType LabelType = PieLabelType.Name; - - /// - /// The default font size for entries - /// ( property). Units are - /// in points (1/72 inch). - /// - public static float FontSize = 10; - } - - #endregion Defaults - - #region Methods - - /// - /// Do all rendering associated with this item to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// Not used for rendering GasGaugeNeedle - /// Not used for rendering GasGaugeNeedle - public override void Draw( Graphics g, GraphPane pane, int pos, float scaleFactor ) - { - if ( pane.Chart._rect.Width <= 0 && pane.Chart._rect.Height <= 0 ) - { - _slicePath = null; - } - else - { - CalcRectangle( g, pane, scaleFactor, pane.Chart._rect ); - - _slicePath = new GraphicsPath(); - - if ( !_isVisible ) - return; - - RectangleF tRect = _boundingRectangle; - - if ( tRect.Width >= 1 && tRect.Height >= 1 ) - { - SmoothingMode sMode = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - - Matrix matrix = new Matrix(); - - matrix.Translate( tRect.X + ( tRect.Width / 2 ), tRect.Y + ( tRect.Height / 2 ), MatrixOrder.Prepend ); - - PointF[] pts = new PointF[2]; - pts[0] = new PointF( ( ( tRect.Height * .10f ) / 2.0f ) * (float)Math.Cos( -SweepAngle * Math.PI / 180.0f ), - ( ( tRect.Height * .10f ) / 2.0f ) * (float)Math.Sin( -SweepAngle * Math.PI / 180.0f ) ); - pts[1] = new PointF( ( tRect.Width / 2.0f ) * (float)Math.Cos( -SweepAngle * Math.PI / 180.0f ), - ( tRect.Width / 2.0f ) * (float)Math.Sin( -SweepAngle * Math.PI / 180.0f ) ); - - matrix.TransformPoints( pts ); - - Pen p = new Pen( NeedleColor, ( ( tRect.Height * .10f ) / 2.0f ) ); - p.EndCap = LineCap.ArrowAnchor; - g.DrawLine( p, pts[0].X, pts[0].Y, pts[1].X, pts[1].Y ); - - //Fill center 10% with Black dot; - Fill f = new Fill( Color.Black ); - RectangleF r = new RectangleF( ( tRect.X + ( tRect.Width / 2 ) ) - 1.0f, ( tRect.Y + ( tRect.Height / 2 ) ) - 1.0f, 1.0f, 1.0f ); - r.Inflate( ( tRect.Height * .10f ), ( tRect.Height * .10f ) ); - Brush b = f.MakeBrush( r ); - g.FillPie( b, r.X, r.Y, r.Width, r.Height, 0.0f, -180.0f ); - - Pen borderPen = new Pen( Color.White, 2.0f ); - g.DrawPie( borderPen, r.X, r.Y, r.Width, r.Height, 0.0f, -180.0f ); - - g.SmoothingMode = sMode; - } - } - } - - /// - /// Render the label for this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// Bounding rectangle for this . - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public override void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor ) - { - if ( !_isVisible ) - return; - - float yMid = rect.Top + rect.Height / 2.0F; - - Pen pen = new Pen( NeedleColor, pane.ScaledPenWidth( NeedleWidth / 2, scaleFactor ) ); - pen.StartCap = LineCap.Round; - pen.EndCap = LineCap.ArrowAnchor; - pen.DashStyle = DashStyle.Solid; - g.DrawLine( pen, rect.Left, yMid, rect.Right, yMid ); - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - public override bool GetCoords( GraphPane pane, int i, out string coords ) - { - coords = String.Empty; - return false; - } - - /// - /// Calculate the values needed to properly display this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - public static void CalculateGasGaugeParameters( GraphPane pane ) - { - //loop thru slices and get total value and maxDisplacement - double minVal = double.MaxValue; - double maxVal = double.MinValue; - foreach ( CurveItem curve in pane.CurveList ) - if ( curve is GasGaugeRegion ) - { - GasGaugeRegion ggr = (GasGaugeRegion)curve; - if ( maxVal < ggr.MaxValue ) - maxVal = ggr.MaxValue; - - if ( minVal > ggr.MinValue ) - minVal = ggr.MinValue; - } - - //Set Needle Sweep angle values here based on the min and max values of the GasGuage - foreach ( CurveItem curve in pane.CurveList ) - { - if ( curve is GasGaugeNeedle ) - { - GasGaugeNeedle ggn = (GasGaugeNeedle)curve; - float sweep = ( (float)ggn.NeedleValue - (float)minVal ) / - ( (float)maxVal - (float)minVal ) * 180.0f; - ggn.SweepAngle = sweep; - } - } - } - - /// - /// Calculate the that will be used to define the bounding rectangle of - /// the GasGaugeNeedle. - /// - /// This rectangle always lies inside of the , and it is - /// normally a square so that the pie itself is not oval-shaped. - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The (normally the ) - /// that bounds this pie. - /// - public static RectangleF CalcRectangle( Graphics g, GraphPane pane, float scaleFactor, RectangleF chartRect ) - { - RectangleF nonExpRect = chartRect; - - if ( ( 2 * nonExpRect.Height ) > nonExpRect.Width ) - { - //Scale based on width - float percentS = ( ( nonExpRect.Height * 2 ) - nonExpRect.Width ) / ( nonExpRect.Height * 2 ); - nonExpRect.Height = ( ( nonExpRect.Height * 2 ) - ( ( nonExpRect.Height * 2 ) * percentS ) ); - } - else - { - nonExpRect.Height = nonExpRect.Height * 2; - } - - nonExpRect.Width = nonExpRect.Height; - - float xDelta = ( chartRect.Width / 2 ) - ( nonExpRect.Width / 2 ); - - //Align Horizontally - nonExpRect.X += xDelta; - - nonExpRect.Inflate( -(float)0.05F * nonExpRect.Height, -(float)0.05 * nonExpRect.Width ); - - GasGaugeNeedle.CalculateGasGaugeParameters( pane ); - - foreach ( CurveItem curve in pane.CurveList ) - { - if ( curve is GasGaugeNeedle ) - { - GasGaugeNeedle ggn = (GasGaugeNeedle)curve; - ggn._boundingRectangle = nonExpRect; - } - } - - return nonExpRect; - - } - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/GasGaugeRegion.cs b/SDK/ZedGraphs/ZedGraph/GasGaugeRegion.cs deleted file mode 100644 index 1147366..0000000 --- a/SDK/ZedGraphs/ZedGraph/GasGaugeRegion.cs +++ /dev/null @@ -1,598 +0,0 @@ -//============================================================================ -//GasGaugeRegion Class -//Copyright 2006 Jay Mistry -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= -using System.Runtime.Serialization; -using System.Drawing.Drawing2D; -using System; -using System.Text; -using System.Drawing; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class representing a region on the GasGuage chart - /// s. - /// - /// Jay Mistry - /// $Revision: 1.2 $ $Date: 2007-07-30 05:26:23 $ - [Serializable] - public class GasGaugeRegion : CurveItem, ICloneable, ISerializable - { - #region Fields - - /// - /// Defines the minimum value of this - /// - private double _minValue; - - /// - /// Defines the maximum value of this - /// - private double _maxValue; - - /// - /// Defines the Color of this - /// - private Color _color; - - /// - /// Internally calculated; Start angle of this pie that defines this - /// - private float _startAngle; - - /// - /// Internally calculated; Sweep angle of this pie that defines this - /// - private float _sweepAngle; - - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Fill _fill; - - /// - /// A which will customize the label display of this - /// - /// - private TextObj _labelDetail; - - /// - /// Private field that stores the class that defines the - /// properties of the border around this . Use the public - /// property to access this value. - /// - private Border _border; - - /// - /// The bounding rectangle for this . - /// - private RectangleF _boundingRectangle; - - /// - /// Private field to hold the GraphicsPath of this to be - /// used for 'hit testing'. - /// - private GraphicsPath _slicePath; - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected GasGaugeRegion( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _labelDetail = (TextObj)info.GetValue( "labelDetail", typeof( TextObj ) ); - _fill = (Fill)info.GetValue( "fill", typeof( Fill ) ); - _border = (Border)info.GetValue( "border", typeof( Border ) ); - _color = (Color)info.GetValue( "color", typeof( Color ) ); - _minValue = info.GetDouble( "minValue" ); - _maxValue = info.GetDouble( "maxValue" ); - _startAngle = (float)info.GetDouble( "startAngle" ); - _sweepAngle = (float)info.GetDouble( "sweepAngle" ); - _boundingRectangle = (RectangleF)info.GetValue( "boundingRectangle", typeof( RectangleF ) ); - _slicePath = (GraphicsPath)info.GetValue( "slicePath", typeof( GraphicsPath ) ); - } - - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "labelDetail", _labelDetail ); - info.AddValue( "fill", _fill ); - info.AddValue( "color", _color ); - info.AddValue( "border", _border ); - info.AddValue( "minVal", _minValue ); - info.AddValue( "maxVal", _maxValue ); - info.AddValue( "startAngle", _startAngle ); - info.AddValue( "sweepAngle", _sweepAngle ); - info.AddValue( "boundingRectangle", _boundingRectangle ); - info.AddValue( "slicePath", _slicePath ); - } - #endregion - - #region Constructors - - /// - /// Create a new - /// - /// The value associated with this instance. - /// The display color for this instance. - /// The minimum value of this . - /// The maximum value of this . - public GasGaugeRegion( string label, double minVal, double maxVal, Color color ) - : base( label ) - { - MinValue = minVal; - MaxValue = maxVal; - RegionColor = color; - StartAngle = 0f; - SweepAngle = 0f; - _border = new Border( Default.BorderColor, Default.BorderWidth ); - _labelDetail = new TextObj(); - _labelDetail.FontSpec.Size = Default.FontSize; - _slicePath = null; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public GasGaugeRegion( GasGaugeRegion ggr ) - : base( ggr ) - { - _minValue = ggr._minValue; - _maxValue = ggr._maxValue; - _color = ggr._color; - _startAngle = ggr._startAngle; - _sweepAngle = ggr._sweepAngle; - _border = ggr._border.Clone(); - _labelDetail = ggr._labelDetail.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public GasGaugeRegion Clone() - { - return new GasGaugeRegion( this ); - } - #endregion - - #region Properties - - /// - /// Gets or sets the SlicePath of this - /// - public GraphicsPath SlicePath - { - get { return _slicePath; } - } - - /// - /// Gets or sets the LabelDetail of this - /// - public TextObj LabelDetail - { - get { return _labelDetail; } - set { _labelDetail = value; } - } - - /// - /// Gets or sets the Border of this - /// - public Border Border - { - get { return ( _border ); } - set { _border = value; } - } - - /// - /// Gets or sets the RegionColor of this - /// - public Color RegionColor - { - get { return _color; } - set - { - _color = value; - Fill = new Fill( _color ); - } - } - - /// - /// Gets or sets the Fill of this - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - - /// - /// Gets or sets the SweepAngle of this - /// - private float SweepAngle - { - get { return _sweepAngle; } - set { _sweepAngle = value; } - } - - /// - /// Gets or sets the StartAngle of this - /// - private float StartAngle - { - get { return ( _startAngle ); } - set { _startAngle = value; } - } - - /// - /// Gets or sets the MinValue of this - /// - public double MinValue - { - get { return ( _minValue ); } - set { _minValue = value > 0 ? value : 0; } - } - - /// - /// Gets or sets the MaxValue of this - /// - public double MaxValue - { - get { return ( _maxValue ); } - set { _maxValue = value > 0 ? value : 0; } - } - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return false; - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return true; - } - - #endregion - - #region Defaults - - /// - /// Specify the default property values for the class. - /// - public struct Default - { - /// - /// The default border pen width for the - /// - public static float BorderWidth = 1.0F; - - /// - /// The default fill type for the - /// - public static FillType FillType = FillType.Brush; - - /// - /// The default value for the visibility of the border. - /// - public static bool IsBorderVisible = true; - - /// - /// The default value for the color of the border - /// - public static Color BorderColor = Color.Gray; - - /// - /// The default value for the color of the fill - /// - public static Color FillColor = Color.Empty; - - /// - /// The default value for the fill brush of the - /// - public static Brush FillBrush = null; - - /// - /// The default value for the visibility of the fill. - /// - public static bool isVisible = true; - -// public static PieLabelType LabelType = PieLabelType.Name; - - /// - /// The default value for the font size of the labels. - /// - public static float FontSize = 10; - } - - #endregion Defaults - - #region Methods - - /// - /// Do all rendering associated with this item to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// Not used for rendering GasGaugeNeedle - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public override void Draw( Graphics g, GraphPane pane, int pos, float scaleFactor ) - { - if ( pane.Chart._rect.Width <= 0 && pane.Chart._rect.Height <= 0 ) - { - _slicePath = null; - } - else - { - CalcRectangle( g, pane, scaleFactor, pane.Chart._rect ); - - _slicePath = new GraphicsPath(); - - if ( !_isVisible ) - return; - - RectangleF tRect = _boundingRectangle; - - if ( tRect.Width >= 1 && tRect.Height >= 1 ) - { - SmoothingMode sMode = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - - _slicePath.AddPie( tRect.X, tRect.Y, tRect.Width, tRect.Height, - -0.0f, -180.0f ); - - g.FillPie( Fill.MakeBrush( _boundingRectangle ), tRect.X, tRect.Y, tRect.Width, tRect.Height, -StartAngle, -SweepAngle ); - - if ( this.Border.IsVisible ) - { - Pen borderPen = _border.GetPen( pane, scaleFactor ); - g.DrawPie( borderPen, tRect.X, tRect.Y, tRect.Width, tRect.Height, - -0.0f, -180.0f ); - borderPen.Dispose(); - } - - g.SmoothingMode = sMode; - } - } - } - - /// - /// Render the label for this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// Bounding rectangle for this . - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public override void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor ) - { - if ( !_isVisible ) - return; - - // Fill the slice - if ( _fill.IsVisible ) - { - // just avoid height/width being less than 0.1 so GDI+ doesn't cry - using ( Brush brush = _fill.MakeBrush( rect ) ) - { - g.FillRectangle( brush, rect ); - //brush.Dispose(); - } - } - - // Border the bar - if ( !_border.Color.IsEmpty ) - _border.Draw( g, pane, scaleFactor, rect ); - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - public override bool GetCoords( GraphPane pane, int i, out string coords ) - { - coords = String.Empty; - return false; - } - - /// - /// Calculate the values needed to properly display this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - public static void CalculateGasGuageParameters( GraphPane pane ) - { - //loop thru slices and get total value and maxDisplacement - double minVal = double.MaxValue; - double maxVal = double.MinValue; - foreach ( CurveItem curve in pane.CurveList ) - if ( curve is GasGaugeRegion ) - { - GasGaugeRegion ggr = (GasGaugeRegion)curve; - if ( maxVal < ggr.MaxValue ) - maxVal = ggr.MaxValue; - - if ( minVal > ggr.MinValue ) - minVal = ggr.MinValue; - } - - //Calculate start and sweep angles for each of the GasGaugeRegion based on teh min and max value - foreach ( CurveItem curve in pane.CurveList ) - { - if ( curve is GasGaugeRegion ) - { - GasGaugeRegion ggr = (GasGaugeRegion)curve; - float start = ( (float)ggr.MinValue - (float)minVal ) / ( (float)maxVal - (float)minVal ) * 180.0f; - float sweep = ( (float)ggr.MaxValue - (float)minVal ) / ( (float)maxVal - (float)minVal ) * 180.0f; - sweep = sweep - start; - - Fill f = new Fill( Color.White, ggr.RegionColor, -( sweep / 2f ) ); - ggr.Fill = f; - - ggr.StartAngle = start; - ggr.SweepAngle = sweep; - } - } - } - - /// - /// Calculate the that will be used to define the bounding rectangle of - /// the GasGaugeNeedle. - /// - /// This rectangle always lies inside of the , and it is - /// normally a square so that the pie itself is not oval-shaped. - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The (normally the ) - /// that bounds this pie. - /// - public static RectangleF CalcRectangle( Graphics g, GraphPane pane, float scaleFactor, RectangleF chartRect ) - { - RectangleF nonExpRect = chartRect; - - if ( ( 2 * nonExpRect.Height ) > nonExpRect.Width ) - { - //Scale based on width - float percentS = ( ( nonExpRect.Height * 2 ) - nonExpRect.Width ) / ( nonExpRect.Height * 2 ); - nonExpRect.Height = ( ( nonExpRect.Height * 2 ) - ( ( nonExpRect.Height * 2 ) * percentS ) ); - } - else - { - nonExpRect.Height = nonExpRect.Height * 2; - } - - nonExpRect.Width = nonExpRect.Height; - - float xDelta = ( chartRect.Width / 2 ) - ( nonExpRect.Width / 2 ); - - //Align Horizontally - nonExpRect.X += xDelta; - //nonExpRect.Y += -(float)0.025F * nonExpRect.Height; - //nonExpRect.Y += ((chartRect.Height) - (nonExpRect.Height / 2)) - 10.0f; - - nonExpRect.Inflate( -(float)0.05F * nonExpRect.Height, -(float)0.05 * nonExpRect.Width ); - - GasGaugeRegion.CalculateGasGuageParameters( pane ); - - foreach ( CurveItem curve in pane.CurveList ) - { - if ( curve is GasGaugeRegion ) - { - GasGaugeRegion gg = (GasGaugeRegion)curve; - gg._boundingRectangle = nonExpRect; - } - } - - return nonExpRect; - - } - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/GraphObj.cs b/SDK/ZedGraphs/ZedGraph/GraphObj.cs deleted file mode 100644 index aaa0adb..0000000 --- a/SDK/ZedGraphs/ZedGraph/GraphObj.cs +++ /dev/null @@ -1,505 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// An abstract base class that represents a text object on the graph. A list of - /// objects is maintained by the - /// collection class. - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - abstract public class GraphObj : ISerializable, ICloneable - { - #region Fields - /// - /// Protected field that stores the location of this . - /// Use the public property to access this value. - /// - protected Location _location; - - /// - /// Protected field that determines whether or not this - /// is visible in the graph. Use the public property to - /// access this value. - /// - protected bool _isVisible; - - /// - /// Protected field that determines whether or not the rendering of this - /// will be clipped to the ChartRect. Use the public property to - /// access this value. - /// - protected bool _isClippedToChartRect; - - /// - /// A tag object for use by the user. This can be used to store additional - /// information associated with the . ZedGraph does - /// not use this value for any purpose. - /// - /// - /// Note that, if you are going to Serialize ZedGraph data, then any type - /// that you store in must be a serializable type (or - /// it will cause an exception). - /// - public object Tag; - - /// - /// Internal field that determines the z-order "depth" of this - /// item relative to other graphic objects. Use the public property - /// to access this value. - /// - internal ZOrder _zOrder; - - /// - /// Internal field that stores the hyperlink information for this object. - /// - internal Link _link; - - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - // Default text item properties - /// - /// Default value for the vertical - /// text alignment ( property). - /// This is specified - /// using the enum type. - /// - public static AlignV AlignV = AlignV.Center; - /// - /// Default value for the horizontal - /// text alignment ( property). - /// This is specified - /// using the enum type. - /// - public static AlignH AlignH = AlignH.Center; - /// - /// The default coordinate system to be used for defining the - /// location coordinates - /// ( property). - /// - /// The coordinate system is defined with the - /// enum - public static CoordType CoordFrame = CoordType.AxisXYScale; - /// - /// The default value for . - /// - public static bool IsClippedToChartRect = false; - } - #endregion - - #region Properties - /// - /// The struct that describes the location - /// for this . - /// - public Location Location - { - get { return _location; } - set { _location = value; } - } - - /// - /// Gets or sets a value that determines the z-order "depth" of this - /// item relative to other graphic objects. - /// - /// Note that this controls the z-order with respect to - /// other elements such as 's, - /// objects, etc. The order of objects having - /// the same value is controlled by their order in - /// the . The first - /// in the list is drawn in front of other - /// objects having the same value. - public ZOrder ZOrder - { - get { return _zOrder; } - set { _zOrder = value; } - } - - /// - /// Gets or sets a value that determines if this will be - /// visible in the graph. true displays the item, false hides it. - /// - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - - /// - /// Gets or sets a value that determines whether or not the rendering of this - /// will be clipped to the . - /// - /// true to clip the to the bounds, - /// false to leave it unclipped. - public bool IsClippedToChartRect - { - get { return _isClippedToChartRect; } - set { _isClippedToChartRect = value; } - } - - /// - /// Gets or sets the hyperlink information for this . - /// - // /// - public Link Link - { - get { return _link; } - set { _link = value; } - } - - /// - /// true if the of this object is set to put it in front - /// of the data points. - /// - public bool IsInFrontOfData - { - get - { - return _zOrder == ZOrder.A_InFront || - _zOrder == ZOrder.B_BehindLegend || - _zOrder == ZOrder.C_BehindChartBorder; - } - } - - #endregion - - #region Constructors - /// - /// Constructors for the class. - /// - /// - /// Default constructor that sets all properties to default - /// values as defined in the class. - /// - public GraphObj() : - this( 0, 0, Default.CoordFrame, Default.AlignH, Default.AlignV ) - { - } - - /// - /// Constructor that sets all properties to default - /// values as defined in the class. - /// - /// The x position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - /// The y position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - public GraphObj( double x, double y ) : - this( x, y, Default.CoordFrame, Default.AlignH, Default.AlignV ) - { - } - - /// - /// Constructor that creates a with the specified - /// coordinates and all other properties to defaults as specified - /// in the class.. - /// - /// - /// The four coordinates define the starting point and ending point for - /// 's, or the topleft and bottomright points for - /// 's. For 's that only require - /// one point, the and values - /// will be ignored. The units of the coordinates are specified by the - /// property. - /// - /// The x position of the item. - /// The y position of the item. - /// The x2 position of the item. - /// The x2 position of the item. - public GraphObj( double x, double y, double x2, double y2 ) : - this( x, y, x2, y2, Default.CoordFrame, Default.AlignH, Default.AlignV ) - { - } - - /// - /// Constructor that creates a with the specified - /// position and . Other properties are set to default - /// values as defined in the class. - /// - /// - /// The two coordinates define the location point for the object. - /// The units of the coordinates are specified by the - /// property. - /// - /// The x position of the item. The item will be - /// aligned to this position based on the - /// property. - /// The y position of the item. The item will be - /// aligned to this position based on the - /// property. - /// The enum value that - /// indicates what type of coordinate system the x and y parameters are - /// referenced to. - public GraphObj( double x, double y, CoordType coordType ) : - this( x, y, coordType, Default.AlignH, Default.AlignV ) - { - } - - /// - /// Constructor that creates a with the specified - /// position, , , and . - /// Other properties are set to default values as defined in the class. - /// - /// - /// The two coordinates define the location point for the object. - /// The units of the coordinates are specified by the - /// property. - /// - /// The x position of the item. The item will be - /// aligned to this position based on the - /// property. - /// The y position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - /// The enum value that - /// indicates what type of coordinate system the x and y parameters are - /// referenced to. - /// The enum that specifies - /// the horizontal alignment of the object with respect to the (x,y) location - /// The enum that specifies - /// the vertical alignment of the object with respect to the (x,y) location - public GraphObj( double x, double y, CoordType coordType, AlignH alignH, AlignV alignV ) - { - _isVisible = true; - _isClippedToChartRect = Default.IsClippedToChartRect; - this.Tag = null; - _zOrder = ZOrder.A_InFront; - _location = new Location( x, y, coordType, alignH, alignV ); - _link = new Link(); - } - - /// - /// Constructor that creates a with the specified - /// position, , , and . - /// Other properties are set to default values as defined in the class. - /// - /// - /// The four coordinates define the starting point and ending point for - /// 's, or the topleft and bottomright points for - /// 's. For 's that only require - /// one point, the and values - /// will be ignored. The units of the coordinates are specified by the - /// property. - /// - /// The x position of the item. - /// The y position of the item. - /// The x2 position of the item. - /// The x2 position of the item. - /// The enum value that - /// indicates what type of coordinate system the x and y parameters are - /// referenced to. - /// The enum that specifies - /// the horizontal alignment of the object with respect to the (x,y) location - /// The enum that specifies - /// the vertical alignment of the object with respect to the (x,y) location - public GraphObj( double x, double y, double x2, double y2, CoordType coordType, - AlignH alignH, AlignV alignV ) - { - _isVisible = true; - _isClippedToChartRect = Default.IsClippedToChartRect; - this.Tag = null; - _zOrder = ZOrder.A_InFront; - _location = new Location( x, y, x2, y2, coordType, alignH, alignV ); - _link = new Link(); - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public GraphObj( GraphObj rhs ) - { - // Copy value types - _isVisible = rhs.IsVisible; - _isClippedToChartRect = rhs._isClippedToChartRect; - _zOrder = rhs.ZOrder; - - // copy reference types by cloning - if ( rhs.Tag is ICloneable ) - this.Tag = ((ICloneable) rhs.Tag).Clone(); - else - this.Tag = rhs.Tag; - - _location = rhs.Location.Clone(); - _link = rhs._link.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of Clone. - /// - /// - /// Note that this method must be called with an explicit cast to ICloneable, and - /// that it is inherently virtual. For example: - /// - /// ParentClass foo = new ChildClass(); - /// ChildClass bar = (ChildClass) ((ICloneable)foo).Clone(); - /// - /// Assume that ChildClass is inherited from ParentClass. Even though foo is declared with - /// ParentClass, it is actually an instance of ChildClass. Calling the ICloneable implementation - /// of Clone() on foo actually calls ChildClass.Clone() as if it were a virtual function. - /// - /// A deep copy of this object - object ICloneable.Clone() - { - throw new NotImplementedException( "Can't clone an abstract base type -- child types must implement ICloneable" ); - //return new PaneBase( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - /// - /// schema changed to 2 when isClippedToChartRect was added. - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected GraphObj( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _location = (Location) info.GetValue( "location", typeof(Location) ); - _isVisible = info.GetBoolean( "isVisible" ); - Tag = info.GetValue( "Tag", typeof(object) ); - _zOrder = (ZOrder) info.GetValue( "zOrder", typeof(ZOrder) ); - - _isClippedToChartRect = info.GetBoolean( "isClippedToChartRect" ); - _link = (Link) info.GetValue( "link", typeof( Link ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "location", _location ); - info.AddValue( "isVisible", _isVisible ); - info.AddValue( "Tag", Tag ); - info.AddValue( "zOrder", _zOrder ); - - info.AddValue( "isClippedToChartRect", _isClippedToChartRect ); - info.AddValue( "link", _link ); - } - #endregion - - #region Rendering Methods - /// - /// Render this object to the specified device. - /// - /// - /// This method is normally only called by the Draw method - /// of the parent collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - abstract public void Draw( Graphics g, PaneBase pane, float scaleFactor ); - - /// - /// Determine if the specified screen point lies inside the bounding box of this - /// . - /// - /// The screen point, in pixels - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// true if the point lies in the bounding box, false otherwise - virtual public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) - { - GraphPane gPane = pane as GraphPane; - - if ( gPane != null && _isClippedToChartRect && !gPane.Chart.Rect.Contains( pt ) ) - return false; - - return true; - } - - /// - /// Determines the shape type and Coords values for this GraphObj - /// - abstract public void GetCoords( PaneBase pane, Graphics g, float scaleFactor, - out string shape, out string coords ); - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/GraphObjList.cs b/SDK/ZedGraphs/ZedGraph/GraphObjList.cs deleted file mode 100644 index 0529cf4..0000000 --- a/SDK/ZedGraphs/ZedGraph/GraphObjList.cs +++ /dev/null @@ -1,304 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections.Generic; - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects - /// to be displayed on the graph. - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class GraphObjList : List, ICloneable - { - #region Constructors - /// - /// Default constructor for the collection class - /// - public GraphObjList() - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public GraphObjList( GraphObjList rhs ) - { - foreach ( GraphObj item in rhs ) - this.Add( (GraphObj) ((ICloneable)item).Clone() ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public GraphObjList Clone() - { - return new GraphObjList( this ); - } - - - #endregion - - #region Methods -/* - /// - /// Indexer to access the specified object by its ordinal - /// position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public GraphObj this[ int index ] - { - get { return( (GraphObj) List[index] ); } - set { List[index] = value; } - } -*/ - /// - /// Indexer to access the specified object by its . - /// Note that the must be a type for this method - /// to work. - /// - /// The type tag to search for. - /// A object reference. - /// - public GraphObj this[string tag] - { - get - { - int index = IndexOfTag( tag ); - if ( index >= 0 ) - return( this[index] ); - else - return null; - } - } -/* - /// - /// Add a object to the - /// collection at the end of the list. - /// - /// A reference to the object to - /// be added - /// - public GraphObj Add( GraphObj item ) - { - List.Add( item ); - return item; - } - - /// - /// Insert a object into the collection - /// at the specified zero-based index location. - /// - /// The zero-based index location for insertion. - /// The object that is to be - /// inserted. - /// - public void Insert( int index, GraphObj item ) - { - List.Insert( index, item ); - } -*/ - - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// In order for this method to work, the - /// property must be of type . - /// The tag that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the is not in the list - public int IndexOfTag( string tag ) - { - int index = 0; - foreach ( GraphObj p in this ) - { - if ( p.Tag is string && - String.Compare( (string) p.Tag, tag, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - /// - /// Move the position of the object at the specified index - /// to the new relative position in the list. - /// For Graphic type objects, this method controls the - /// Z-Order of the items. Objects at the beginning of the list - /// appear in front of objects at the end of the list. - /// The zero-based index of the object - /// to be moved. - /// The relative number of positions to move - /// the object. A value of -1 will move the - /// object one position earlier in the list, a value - /// of 1 will move it one position later. To move an item to the - /// beginning of the list, use a large negative value (such as -999). - /// To move it to the end of the list, use a large positive value. - /// - /// The new position for the object, or -1 if the object - /// was not found. - public int Move( int index, int relativePos ) - { - if ( index < 0 || index >= Count ) - return -1; - - GraphObj graphObj = this[index]; - this.RemoveAt( index ); - - index += relativePos; - if ( index < 0 ) - index = 0; - if ( index > Count ) - index = Count; - - Insert( index, graphObj ); - return index; - } - - #endregion - - #region Render Methods - - /// - /// Render text to the specified device - /// by calling the Draw method of each object in - /// the collection. - /// - /// This method is normally only called by the Draw method - /// of the parent object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// A enumeration that controls - /// the placement of this relative to other - /// graphic objects. The order of 's with the - /// same value is control by their order in - /// this . - public void Draw( Graphics g, PaneBase pane, float scaleFactor, - ZOrder zOrder ) - { - // Draw the items in reverse order, so the last items in the - // list appear behind the first items (consistent with - // CurveList) - for ( int i=this.Count-1; i>=0; i-- ) - { - GraphObj item = this[i]; - if ( item.ZOrder == zOrder && item.IsVisible ) - { - Region region = null; - if ( item.IsClippedToChartRect && pane is GraphPane ) - { - region = g.Clip.Clone(); - g.SetClip( ((GraphPane)pane).Chart._rect ); - } - - item.Draw( g, pane, scaleFactor ); - - if ( item.IsClippedToChartRect && pane is GraphPane ) - g.Clip = region; - } - } - } - - /// - /// Determine if a mouse point is within any , and if so, - /// return the index number of the the . - /// - /// The screen point, in pixel coordinates. - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The index number of the - /// that is under the mouse point. The object is - /// accessible via the indexer property. - /// - /// true if the mouse point is within a bounding - /// box, false otherwise. - /// - public bool FindPoint( PointF mousePt, PaneBase pane, Graphics g, float scaleFactor, out int index ) - { - index = -1; - - // Search in reverse direction to honor the Z-order - for ( int i=Count-1; i>=0; i-- ) - { - if ( this[i].PointInBox( mousePt, pane, g, scaleFactor ) ) - { - if ( ( index >= 0 && this[i].ZOrder > this[index].ZOrder ) || index < 0 ) - index = i; - } - } - - if ( index >= 0 ) - return true; - else - return false; - } - - - #endregion - } -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/GraphPane.cs b/SDK/ZedGraphs/ZedGraph/GraphPane.cs deleted file mode 100644 index 2295a5a..0000000 --- a/SDK/ZedGraphs/ZedGraph/GraphPane.cs +++ /dev/null @@ -1,2330 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Drawing.Imaging; -using System.Windows.Forms; -using System.Diagnostics; -using System.IO; -using System.Runtime.Serialization; -using System.Security.Permissions; -using System.ComponentModel; - -namespace ZedGraph -{ - // - // ZedGraph is a class library and UserControl () that display - // 2D line graphs of user specified data. The ZedGraph namespace includes all functionality - // required to draw, modify, and update the graph. - // - - /// - /// Class encapsulates the graph pane, which is all display elements - /// associated with an individual graph. - /// - /// This class is the outside "wrapper" - /// for the ZedGraph classes, and provides the interface to access the attributes - /// of the graph. You can have multiple graphs in the same document or form, - /// just instantiate multiple GraphPane's. - /// - /// - /// John Champion modified by Jerry Vos - /// $Revision: 3.81 $ $Date: 2007-09-30 07:44:11 $ - [Serializable] - public class GraphPane : PaneBase, ICloneable, ISerializable - { - - #region Events - - /// - /// A delegate to provide notification through the - /// when is called. - /// - /// The for which AxisChange() has - /// been called. - /// - public delegate void AxisChangeEventHandler( GraphPane pane ); - - /// - /// Subscribe to this event to be notified when is called. - /// - public event AxisChangeEventHandler AxisChangeEvent; - - #endregion - - #region Private Fields - - // Item subclasses //////////////////////////////////////////////////////////////////// - - /// Private field instance of the class. Use the - /// public property to access this class. - private XAxis _xAxis; - /// Private field instance of the class. Use the - /// public property to access this class. - private X2Axis _x2Axis; - /// Private field instance of the class. Use the - /// public property to access this class. - private YAxisList _yAxisList; - /// Private field instance of the class. Use the - /// public property to access this class. - private Y2AxisList _y2AxisList; - /// Private field instance of the class. Use the - /// public property to access this class. - private CurveList _curveList; - - /// - /// private value that contains a , which stores prior - /// objects containing scale range information. This enables - /// zooming and panning functionality for the . - /// - private ZoomStateStack _zoomStack; - - // Chart Properties ////////////////////////////////////////////////////////////// - - internal Chart _chart; - - internal BarSettings _barSettings; - - /// Private field that determines whether or not initial zero values will - /// be included or excluded when determining the Y or Y2 axis scale range. - /// Use the public property to access - /// this value. - private bool _isIgnoreInitial; - /// Private field that determines whether or not initial - /// values will cause the line segments of - /// a curve to be discontinuous. If this field is true, then the curves - /// will be plotted as continuous lines as if the Missing values did not - /// exist. - /// Use the public property to access - /// this value. - private bool _isIgnoreMissing; - /// private field that determines if the auto-scaled axis ranges will subset the - /// data points based on any manually set scale range values. Use the public property - /// to access this value. - /// The bounds provide a means to subset the data. For example, if all the axes are set to - /// autoscale, then the full range of data are used. But, if the XAxis.Min and XAxis.Max values - /// are manually set, then the Y data range will reflect the Y values within the bounds of - /// XAxis.Min and XAxis.Max. - private bool _isBoundedRanges; - - /// - /// private field that determines if ZedGraph should modify the scale ranges for the Y and Y2 - /// axes such that the number of steps, and therefore the grid lines, line up. Use the - /// public property to acccess this value. - /// - private bool _isAlignGrids; - - - /// Private field that determines how the - /// graphs will be displayed. See the enum - /// for the individual types available. - /// To access this value, use the public property . - /// - /// - private LineType _lineType; - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public new struct Default - { - /// - /// The default settings for the scale ignore initial - /// zero values option ( property). - /// true to have the auto-scale-range code ignore the initial data points - /// until the first non-zero Y value, false otherwise. - /// - public static bool IsIgnoreInitial = false; - /// - /// The default settings for the scale bounded ranges option - /// ( property). - /// true to have the auto-scale-range code subset the data according to any - /// manually set scale values, false otherwise. - /// - public static bool IsBoundedRanges = false; - - /// The default value for the property, which - /// determines if the lines are drawn in normal or "stacked" mode. See the - /// for more information. - /// - /// - public static LineType LineType = LineType.Normal; - /// - /// The default width of a bar cluster - /// on a graph. This value only applies to - /// graphs, and only when the - /// is , - /// or . - /// This dimension is expressed in terms of X scale user units. - /// - /// - /// - public static double ClusterScaleWidth = 1.0; - /// - /// The tolerance that is applied to the - /// routine. - /// If a given curve point is within this many pixels of the mousePt, the curve - /// point is considered to be close enough for selection as a nearest point - /// candidate. - /// - public static double NearestTol = 7.0; - - } - #endregion - - #region Class Instance Properties - /// - /// Gets or sets the list of items for this - /// - /// A reference to a collection object - public CurveList CurveList - { - get { return _curveList; } - set { _curveList = value; } - } - /// - /// Accesses the for this graph - /// - /// A reference to a object - public XAxis XAxis - { - get { return _xAxis; } - } - /// - /// Accesses the for this graph - /// - /// A reference to a object - public X2Axis X2Axis - { - get { return _x2Axis; } - } - /// - /// Accesses the primary for this graph - /// - /// A reference to a object - /// - /// - public YAxis YAxis - { - get { return _yAxisList[0] as YAxis; } - } - /// - /// Accesses the primary for this graph - /// - /// A reference to a object - /// - /// - public Y2Axis Y2Axis - { - get { return _y2AxisList[0] as Y2Axis; } - } - - /// - /// Gets the collection of Y axes that belong to this . - /// - public YAxisList YAxisList - { - get { return _yAxisList; } - } - /// - /// Gets the collection of Y2 axes that belong to this . - /// - public Y2AxisList Y2AxisList - { - get { return _y2AxisList; } - } - - /// - /// Gets the instance for this . - /// - public Chart Chart - { - get { return _chart; } - } - - /// - /// Gets the instance for this , - /// which stores the global properties for bar type charts. - /// - public BarSettings BarSettings - { - get { return _barSettings; } - } - - #endregion - - #region General Properties - - /// - /// Gets or sets a boolean value that affects the data range that is considered - /// for the automatic scale ranging. - /// - /// If true, then initial data points where the Y value - /// is zero are not included when automatically determining the scale , - /// , and size. - /// All data after the first non-zero Y value are included. - /// - /// - [Bindable( true ), Browsable( true ), Category( "Display" ), NotifyParentProperty( true )] - [Description("Determines whether the auto-ranged scale will include all data points" + - " or just the visible data points")] - public bool IsIgnoreInitial - { - get { return _isIgnoreInitial; } - set { _isIgnoreInitial = value; } - } - /// Gets or sets a boolean value that determines if the auto-scaled axis ranges will - /// subset the data points based on any manually set scale range values. - /// The bounds provide a means to subset the data. For example, if all the axes are set to - /// autoscale, then the full range of data are used. But, if the XAxis.Min and XAxis.Max values - /// are manually set, then the Y data range will reflect the Y values within the bounds of - /// XAxis.Min and XAxis.Max. Set to true to subset the data, or false to always include - /// all data points when calculating scale ranges. - public bool IsBoundedRanges - { - get { return _isBoundedRanges; } - set { _isBoundedRanges = value; } - } - /// Gets or sets a value that determines whether or not initial - /// values will cause the line segments of - /// a curve to be discontinuous. - /// - /// If this field is true, then the curves - /// will be plotted as continuous lines as if the Missing values did not exist. - /// Use the public property to access - /// this value. - public bool IsIgnoreMissing - { - get { return _isIgnoreMissing; } - set { _isIgnoreMissing = value; } - } - - /// - /// Gets or sets a value that determines if ZedGraph should modify the scale ranges - /// for the Y and Y2 axes such that the number of major steps, and therefore the - /// major grid lines, line up. - /// - /// - /// This property affects the way that selects the scale - /// ranges for the Y and Y2 axes. It applies to the scale ranges of all Y and Y2 axes, - /// but only if the is set to true.
- ///
- public bool IsAlignGrids - { - get { return _isAlignGrids; } - set { _isAlignGrids = value; } - } - - /// Determines how the - /// graphs will be displayed. See the enum - /// for the individual types available. - /// - /// - public LineType LineType - { - get { return _lineType; } - set { _lineType = value; } - } - - /// - /// Gets a value that indicates whether or not the for - /// this is empty. Note that this value is only used for - /// the . - /// - public bool IsZoomed - { - get { return !_zoomStack.IsEmpty; } - } - - /// - /// Gets a reference to the for this . - /// - public ZoomStateStack ZoomStack - { - get { return _zoomStack; } - } - - #endregion - - #region Constructors - - /// - /// Default Constructor. Sets the to (0, 0, 500, 375), and - /// sets the and values to empty - /// strings. - /// - public GraphPane() - : this( new RectangleF( 0, 0, 500, 375 ), "", "", "" ) - { - } - - /// - /// Constructor for the object. This routine will - /// initialize all member variables and classes, setting appropriate default - /// values as defined in the class. - /// - /// A rectangular screen area where the graph is to be displayed. - /// This area can be any size, and can be resize at any time using the - /// property. - /// - /// The for this - /// The for the - /// The for the - public GraphPane( RectangleF rect, string title, - string xTitle, string yTitle ) - : base( title, rect ) - { - _xAxis = new XAxis( xTitle ); - _x2Axis = new X2Axis( "" ); - - _yAxisList = new YAxisList(); - _y2AxisList = new Y2AxisList(); - - _yAxisList.Add( new YAxis( yTitle ) ); - _y2AxisList.Add( new Y2Axis( string.Empty ) ); - - _curveList = new CurveList(); - _zoomStack = new ZoomStateStack(); - - _isIgnoreInitial = Default.IsIgnoreInitial; - _isBoundedRanges = Default.IsBoundedRanges; - _isAlignGrids = false; - - _chart = new Chart(); - - _barSettings = new BarSettings( this ); - - _lineType = Default.LineType; - } - - /// - /// The Copy Constructor - /// - /// The GraphPane object from which to copy - public GraphPane( GraphPane rhs ) - : base( rhs ) - { - // copy values for all the value types - _isIgnoreInitial = rhs.IsIgnoreInitial; - _isBoundedRanges = rhs._isBoundedRanges; - _isAlignGrids = rhs._isAlignGrids; - - _chart = rhs._chart.Clone(); - - _barSettings = new BarSettings( rhs._barSettings, this ); - - _lineType = rhs.LineType; - - - // copy all the reference types with deep copies - _xAxis = new XAxis( rhs.XAxis ); - _x2Axis = new X2Axis( rhs.X2Axis ); - - _yAxisList = new YAxisList( rhs._yAxisList ); - _y2AxisList = new Y2AxisList( rhs._y2AxisList ); - - _curveList = new CurveList( rhs.CurveList ); - _zoomStack = new ZoomStateStack( rhs._zoomStack ); - - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public GraphPane Clone() - { - return new GraphPane( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - //changed to 2 when yAxisList and y2AxisList were added - //changed to 3 when chart object was added - //changed to 10 when refactored to version 5 - //changed to 11 when added x2axis - public const int schema2 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected GraphPane( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _xAxis = (XAxis)info.GetValue( "xAxis", typeof( XAxis ) ); - if ( sch >= 11 ) - _x2Axis = (X2Axis)info.GetValue( "x2Axis", typeof( X2Axis ) ); - else - _x2Axis = new X2Axis( "" ); - - _yAxisList = (YAxisList)info.GetValue( "yAxisList", typeof( YAxisList ) ); - _y2AxisList = (Y2AxisList)info.GetValue( "y2AxisList", typeof( Y2AxisList ) ); - - _curveList = (CurveList)info.GetValue( "curveList", typeof( CurveList ) ); - - _chart = (Chart) info.GetValue( "chart", typeof( Chart ) ); - - _barSettings = (BarSettings)info.GetValue( "barSettings", typeof( BarSettings ) ); - _barSettings._ownerPane = this; - - _isIgnoreInitial = info.GetBoolean( "isIgnoreInitial" ); - _isBoundedRanges = info.GetBoolean( "isBoundedRanges" ); - _isIgnoreMissing = info.GetBoolean( "isIgnoreMissing" ); - _isAlignGrids = info.GetBoolean( "isAlignGrids" ); - - _lineType = (LineType)info.GetValue( "lineType", typeof( LineType ) ); - - _zoomStack = new ZoomStateStack(); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema2", schema2 ); - - info.AddValue( "xAxis", _xAxis ); - info.AddValue( "x2Axis", _x2Axis ); - info.AddValue( "yAxisList", _yAxisList ); - info.AddValue( "y2AxisList", _y2AxisList ); - info.AddValue( "curveList", _curveList ); - - info.AddValue( "chart", _chart ); - - info.AddValue( "barSettings", _barSettings ); - - info.AddValue( "isIgnoreInitial", _isIgnoreInitial ); - info.AddValue( "isBoundedRanges", _isBoundedRanges ); - info.AddValue( "isIgnoreMissing", _isIgnoreMissing ); - info.AddValue( "isAlignGrids", _isAlignGrids ); - - info.AddValue( "lineType", _lineType ); - } - - #endregion - - #region Rendering Methods - - /// - /// AxisChange causes the axes scale ranges to be recalculated based on the current data range. - /// - /// - /// There is no obligation to call AxisChange() for manually scaled axes. AxisChange() is only - /// intended to handle auto scaling operations. Call this function anytime you change, add, or - /// remove curve data to insure that the scale range of the axes are appropriate for the data range. - /// This method calculates - /// a scale minimum, maximum, and step size for each axis based on the current curve data. - /// Only the axis attributes (min, max, step) that are set to auto-range - /// (, , ) - /// will be modified. You must call after calling - /// AxisChange to make sure the display gets updated.
- /// This overload of AxisChange just uses the default Graphics instance for the screen. - /// If you have a Graphics instance available from your Windows Form, you should use - /// the overload instead. - ///
- public void AxisChange() - { - using ( Graphics g = Graphics.FromHwnd( IntPtr.Zero ) ) - AxisChange( g ); - } - - /// - /// AxisChange causes the axes scale ranges to be recalculated based on the current data range. - /// - /// - /// There is no obligation to call AxisChange() for manually scaled axes. AxisChange() is only - /// intended to handle auto scaling operations. Call this function anytime you change, add, or - /// remove curve data to insure that the scale range of the axes are appropriate for the data range. - /// This method calculates - /// a scale minimum, maximum, and step size for each axis based on the current curve data. - /// Only the axis attributes (min, max, step) that are set to auto-range - /// (, , ) - /// will be modified. You must call - /// after calling AxisChange to make sure the display gets updated. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - public void AxisChange( Graphics g ) - { - //double xMin, xMax, yMin, yMax, y2Min, y2Max; - - // Get the scale range of the data (all curves) - _curveList.GetRange( /* out xMin, out xMax, out yMin, - out yMax, out y2Min, out y2Max, */ - _isIgnoreInitial, _isBoundedRanges, this ); - - // Determine the scale factor - float scaleFactor = this.CalcScaleFactor(); - - // For pie charts, go ahead and turn off the axis displays if it's only pies - if ( this.CurveList.IsPieOnly ) - { - //don't want to display axis or border if there's only pies - this.XAxis.IsVisible = false; - this.X2Axis.IsVisible = false; - this.YAxis.IsVisible = false; - this.Y2Axis.IsVisible = false; - _chart.Border.IsVisible = false; - //this.Legend.Position = LegendPos.TopCenter; - } - - // Set the ClusterScaleWidth, if needed - //_barSettings.CalcClusterScaleWidth(); - if ( _barSettings._clusterScaleWidthAuto ) - _barSettings._clusterScaleWidth = 1.0; - - // if the ChartRect is not yet determined, then pick a scale based on a default ChartRect - // size (using 75% of Rect -- code is in Axis.CalcMaxLabels() ) - // With the scale picked, call CalcChartRect() so calculate a real ChartRect - // then let the scales re-calculate to make sure that the assumption was ok - if ( _chart._isRectAuto ) - { - PickScale( g, scaleFactor ); - - _chart._rect = CalcChartRect( g ); - //this.pieRect = PieItem.CalcPieRect( g, this, scaleFactor, this.chartRect ); - } - - // Pick new scales based on the range - PickScale( g, scaleFactor ); - - // Set the ClusterScaleWidth, if needed - _barSettings.CalcClusterScaleWidth(); - - // Trigger the AxisChangeEvent - if ( this.AxisChangeEvent != null ) - this.AxisChangeEvent( this ); - - } - - private void PickScale( Graphics g, float scaleFactor ) - { - int maxTics = 0; - - _xAxis._scale.PickScale( this, g, scaleFactor ); - _x2Axis._scale.PickScale( this, g, scaleFactor ); - - foreach ( Axis axis in _yAxisList ) - { - axis._scale.PickScale( this, g, scaleFactor ); - if ( axis._scale.MaxAuto ) - { - int nTics = axis._scale.CalcNumTics(); - maxTics = nTics > maxTics ? nTics : maxTics; - } - } - foreach ( Axis axis in _y2AxisList ) - { - axis._scale.PickScale( this, g, scaleFactor ); - if ( axis._scale.MaxAuto ) - { - int nTics = axis._scale.CalcNumTics(); - maxTics = nTics > maxTics ? nTics : maxTics; - } - } - - if ( _isAlignGrids ) - { - foreach ( Axis axis in _yAxisList ) - ForceNumTics( axis, maxTics ); - - foreach ( Axis axis in _y2AxisList ) - ForceNumTics( axis, maxTics ); - } - - } - - private void ForceNumTics( Axis axis, int numTics ) - { - if ( axis._scale.MaxAuto ) - { - int nTics = axis._scale.CalcNumTics(); - if ( nTics < numTics ) - axis._scale._maxLinearized += axis._scale._majorStep * ( numTics - nTics ); - } - } - - /// - /// Draw all elements in the to the specified graphics device. - /// - /// This method - /// should be part of the Paint() update process. Calling this routine will redraw all - /// features of the graph. No preparation is required other than an instantiated - /// object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - public override void Draw( Graphics g ) - { - // Calculate the chart rect, deducting the area for the scales, titles, legend, etc. - //int hStack; - //float legendWidth, legendHeight; - - // Draw the pane border & background fill, the title, and the GraphObj objects that lie at - // ZOrder.G_BehindAll - base.Draw( g ); - - if ( _rect.Width <= 1 || _rect.Height <= 1 ) - return; - - // Clip everything to the rect - g.SetClip( _rect ); - - // calculate scaleFactor on "normal" pane size (BaseDimension) - float scaleFactor = this.CalcScaleFactor(); - - - // if the size of the ChartRect is determined automatically, then do so - // otherwise, calculate the legendrect, scalefactor, hstack, and legendwidth parameters - // but leave the ChartRect alone - if ( _chart._isRectAuto ) - { - _chart._rect = CalcChartRect( g, scaleFactor ); - //this.pieRect = PieItem.CalcPieRect( g, this, scaleFactor, this.chartRect ); - } - else - CalcChartRect( g, scaleFactor ); - - // do a sanity check on the ChartRect - if ( _chart._rect.Width < 1 || _chart._rect.Height < 1 ) - return; - - // Draw the graph features only if there is at least one curve with data - // if ( _curveList.HasData() && - // Go ahead and draw the graph, even without data. This makes the control - // version still look like a graph before it is fully set up - bool showGraf = AxisRangesValid(); - - // Setup the axes for graphing - This setup must be done before - // the GraphObj's are drawn so that the Transform functions are - // ready. Also, this should be done before CalcChartRect so that the - // Axis.Cross - shift parameter can be calculated. - _xAxis.Scale.SetupScaleData( this, _xAxis ); - _x2Axis.Scale.SetupScaleData( this, _x2Axis ); - foreach ( Axis axis in _yAxisList ) - axis.Scale.SetupScaleData( this, axis ); - foreach ( Axis axis in _y2AxisList ) - axis.Scale.SetupScaleData( this, axis ); - - // Draw the GraphItems that are behind the Axis objects - if ( showGraf ) - _graphObjList.Draw( g, this, scaleFactor, ZOrder.G_BehindChartFill ); - - // Fill the axis background - _chart.Fill.Draw( g, _chart._rect ); - - if ( showGraf ) - { - // Draw the GraphItems that are behind the CurveItems - _graphObjList.Draw( g, this, scaleFactor, ZOrder.F_BehindGrid ); - - DrawGrid( g, scaleFactor ); - - // Draw the GraphItems that are behind the CurveItems - _graphObjList.Draw( g, this, scaleFactor, ZOrder.E_BehindCurves ); - - // Clip the points to the actual plot area - g.SetClip( _chart._rect ); - _curveList.Draw( g, this, scaleFactor ); - g.SetClip( _rect ); - - } - - if ( showGraf ) - { - // Draw the GraphItems that are behind the Axis objects - _graphObjList.Draw( g, this, scaleFactor, ZOrder.D_BehindAxis ); - - // Draw the Axes - _xAxis.Draw( g, this, scaleFactor, 0.0f ); - _x2Axis.Draw( g, this, scaleFactor, 0.0f ); - - float yPos = 0; - foreach ( Axis axis in _yAxisList ) - { - axis.Draw( g, this, scaleFactor, yPos ); - yPos += axis._tmpSpace; - } - - yPos = 0; - foreach ( Axis axis in _y2AxisList ) - { - axis.Draw( g, this, scaleFactor, yPos ); - yPos += axis._tmpSpace; - } - - // Draw the GraphItems that are behind the Axis border - _graphObjList.Draw( g, this, scaleFactor, ZOrder.C_BehindChartBorder ); - } - - // Border the axis itself - _chart.Border.Draw( g, this, scaleFactor, _chart._rect ); - - if ( showGraf ) - { - // Draw the GraphItems that are behind the Legend object - _graphObjList.Draw( g, this, scaleFactor, ZOrder.B_BehindLegend ); - - _legend.Draw( g, this, scaleFactor ); - - // Draw the GraphItems that are in front of all other items - _graphObjList.Draw( g, this, scaleFactor, ZOrder.A_InFront ); - } - - // Reset the clipping - g.ResetClip(); - - // Reset scale data - // this sets the temp values to NaN to cause an exception if these values are - // being used improperly - // Don't do this, since the web control needs access - /* - _xAxis.Scale.ResetScaleData(); - foreach ( Axis axis in _yAxisList ) - axis.Scale.ResetScaleData(); - foreach ( Axis axis in _y2AxisList ) - axis.Scale.ResetScaleData(); - */ - } - - internal void DrawGrid( Graphics g, float scaleFactor ) - { - _xAxis.DrawGrid( g, this, scaleFactor, 0.0f ); - _x2Axis.DrawGrid( g, this, scaleFactor, 0.0f ); - - float shiftPos = 0.0f; - foreach ( YAxis yAxis in _yAxisList ) - { - yAxis.DrawGrid( g, this, scaleFactor, shiftPos ); - shiftPos += yAxis._tmpSpace; - } - - shiftPos = 0.0f; - foreach ( Y2Axis y2Axis in _y2AxisList ) - { - y2Axis.DrawGrid( g, this, scaleFactor, shiftPos ); - shiftPos += y2Axis._tmpSpace; - } - } - - private bool AxisRangesValid() - { - bool showGraf = _xAxis._scale._min < _xAxis._scale._max && - _x2Axis._scale._min < _x2Axis._scale._max; - foreach ( Axis axis in _yAxisList ) - if ( axis._scale._min >= axis._scale._max ) - showGraf = false; - foreach ( Axis axis in _y2AxisList ) - if ( axis._scale._min >= axis._scale._max ) - showGraf = false; - - return showGraf; - } - - /// - /// Calculate the based on the . - /// - /// The ChartRect - /// is the plot area bounded by the axes, and the rect is the total area as - /// specified by the client application. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The calculated chart rect, in pixel coordinates. - public RectangleF CalcChartRect( Graphics g ) - { - // Calculate the chart rect, deducting the area for the scales, titles, legend, etc. - //int hStack; - //float legendWidth, legendHeight; - - return CalcChartRect( g, CalcScaleFactor() ); - } - - /// - /// Calculate the based on the . - /// - /// The ChartRect - /// is the plot area bounded by the axes, and the rect is the total area as - /// specified by the client application. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - /// The calculated chart rect, in pixel coordinates. - - public RectangleF CalcChartRect( Graphics g, float scaleFactor ) - { - // chart rect starts out at the full pane rect less the margins - // and less space for the Pane title - RectangleF clientRect = this.CalcClientRect( g, scaleFactor ); - - //float minSpaceX = 0; - //float minSpaceY = 0; - //float minSpaceY2 = 0; - float totSpaceY = 0; - //float spaceY2 = 0; - - // actual minimum axis space for the left side of the chart rect - float minSpaceL = 0; - // actual minimum axis space for the right side of the chart rect - float minSpaceR = 0; - // actual minimum axis space for the bottom side of the chart rect - float minSpaceB = 0; - // actual minimum axis space for the top side of the chart rect - float minSpaceT = 0; - - _xAxis.CalcSpace( g, this, scaleFactor, out minSpaceB ); - _x2Axis.CalcSpace( g, this, scaleFactor, out minSpaceT ); - - //minSpaceB = _xAxis.tmpMinSpace; - - foreach ( Axis axis in _yAxisList ) - { - float fixedSpace; - float tmp = axis.CalcSpace( g, this, scaleFactor, out fixedSpace ); - //if ( !axis.CrossAuto || axis.Cross < _xAxis.Min ) - if ( axis.IsCrossShifted( this ) ) - totSpaceY += tmp; - - minSpaceL += fixedSpace; - } - foreach ( Axis axis in _y2AxisList ) - { - float fixedSpace; - float tmp = axis.CalcSpace( g, this, scaleFactor, out fixedSpace ); - //if ( !axis.CrossAuto || axis.Cross < _xAxis.Min ) - if ( axis.IsCrossShifted( this ) ) - totSpaceY += tmp; - - minSpaceR += fixedSpace; - } - - float spaceB = 0, spaceT = 0, spaceL = 0, spaceR = 0; - - SetSpace( _xAxis, clientRect.Height - _xAxis._tmpSpace, ref spaceB, ref spaceT ); -// minSpaceT = Math.Max( minSpaceT, spaceT ); - SetSpace( _x2Axis, clientRect.Height - _x2Axis._tmpSpace, ref spaceT, ref spaceB ); - _xAxis._tmpSpace = spaceB; - _x2Axis._tmpSpace = spaceT; - - float totSpaceL = 0; - float totSpaceR = 0; - - foreach ( Axis axis in _yAxisList ) - { - SetSpace( axis, clientRect.Width - totSpaceY, ref spaceL, ref spaceR ); - minSpaceR = Math.Max( minSpaceR, spaceR ); - totSpaceL += spaceL; - axis._tmpSpace = spaceL; - } - foreach ( Axis axis in _y2AxisList ) - { - SetSpace( axis, clientRect.Width - totSpaceY, ref spaceR, ref spaceL ); - minSpaceL = Math.Max( minSpaceL, spaceL ); - totSpaceR += spaceR; - axis._tmpSpace = spaceR; - } - - RectangleF tmpRect = clientRect; - - totSpaceL = Math.Max( totSpaceL, minSpaceL ); - totSpaceR = Math.Max( totSpaceR, minSpaceR ); - spaceB = Math.Max( spaceB, minSpaceB ); - spaceT = Math.Max( spaceT, minSpaceT ); - - tmpRect.X += totSpaceL; - tmpRect.Width -= totSpaceL + totSpaceR; - tmpRect.Height -= spaceT + spaceB; - tmpRect.Y += spaceT; - - _legend.CalcRect( g, this, scaleFactor, ref tmpRect ); - - return tmpRect; - } - - private void SetSpace( Axis axis, float clientSize, ref float spaceNorm, ref float spaceAlt ) - { - //spaceNorm = 0; - //spaceAlt = 0; - - float crossFrac = axis.CalcCrossFraction( this ); - float crossPix = crossFrac * ( 1 + crossFrac ) * ( 1 + crossFrac * crossFrac ) * clientSize; - - if ( !axis.IsPrimary( this ) && axis.IsCrossShifted( this ) ) - axis._tmpSpace = 0; - - if ( axis._tmpSpace < crossPix ) - axis._tmpSpace = 0; - else if ( crossPix > 0 ) - axis._tmpSpace -= crossPix; - - if ( axis._scale._isLabelsInside && ( axis.IsPrimary( this ) || ( crossFrac != 0.0 && crossFrac != 1.0 ) ) ) - spaceAlt = axis._tmpSpace; - else - spaceNorm = axis._tmpSpace; - } - - /// - /// This method will set the property for all three axes; - /// , , and . - /// - /// The - /// is calculated using the currently required space multiplied by a fraction - /// (bufferFraction). - /// The currently required space is calculated using , and is - /// based on current data ranges, font sizes, etc. The "space" is actually the amount of space - /// required to fit the tic marks, scale labels, and axis title. - /// The calculation is done by calling the method for - /// each . - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// The amount of space to allocate for the axis, expressed - /// as a fraction of the currently required space. For example, a value of 1.2 would - /// allow for 20% extra above the currently required space. - /// If true, then this method will only modify the - /// property if the calculated result is more than the current value. - public void SetMinSpaceBuffer( Graphics g, float bufferFraction, bool isGrowOnly ) - { - _xAxis.SetMinSpaceBuffer( g, this, bufferFraction, isGrowOnly ); - _x2Axis.SetMinSpaceBuffer( g, this, bufferFraction, isGrowOnly ); - foreach ( Axis axis in _yAxisList ) - axis.SetMinSpaceBuffer( g, this, bufferFraction, isGrowOnly ); - foreach ( Axis axis in _y2AxisList ) - axis.SetMinSpaceBuffer( g, this, bufferFraction, isGrowOnly ); - } - - #endregion - - #region AddCurve Methods - - /// - /// Add a curve ( object) to the plot with - /// the given data points (double arrays) and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// An array of double precision X values (the - /// independent values) that define the curve. - /// An array of double precision Y values (the - /// dependent values) that define the curve. - /// The color to used for the curve line, - /// symbols, etc. - /// A class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public LineItem AddCurve( string label, double[] x, double[] y, Color color ) - { - LineItem curve = new LineItem( label, x, y, color, SymbolType.Default ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a curve ( object) to the plot with - /// the given data points () and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// The color to used for the curve line, - /// symbols, etc. - /// A class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public LineItem AddCurve( string label, IPointList points, Color color ) - { - LineItem curve = new LineItem( label, points, color, SymbolType.Default ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a curve ( object) to the plot with - /// the given data points (double arrays) and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// An array of double precision X values (the - /// independent values) that define the curve. - /// An array of double precision Y values (the - /// dependent values) that define the curve. - /// The color to used for the curve line, - /// symbols, etc. - /// A symbol type () - /// that will be used for this curve. - /// A class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public LineItem AddCurve( string label, double[] x, double[] y, - Color color, SymbolType symbolType ) - { - LineItem curve = new LineItem( label, x, y, color, symbolType ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a curve ( object) to the plot with - /// the given data points () and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// The color to used for the curve line, - /// symbols, etc. - /// A symbol type () - /// that will be used for this curve. - /// A class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public LineItem AddCurve( string label, IPointList points, - Color color, SymbolType symbolType ) - { - LineItem curve = new LineItem( label, points, color, symbolType ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a stick graph ( object) to the plot with - /// the given data points (double arrays) and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// An array of double precision X values (the - /// independent values) that define the curve. - /// An array of double precision Y values (the - /// dependent values) that define the curve. - /// The color to used for the curve line, - /// symbols, etc. - /// A class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public StickItem AddStick( string label, double[] x, double[] y, Color color ) - { - StickItem curve = new StickItem( label, x, y, color ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a stick graph ( object) to the plot with - /// the given data points () and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// The color to used for the curve line, - /// symbols, etc. - /// A class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public StickItem AddStick( string label, IPointList points, Color color ) - { - StickItem curve = new StickItem( label, points, color ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a candlestick graph ( object) to the plot with - /// the given data points () and properties. - /// - /// - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// Note that the - /// should contain objects instead of - /// objects in order to contain all the data values required for this curve type. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// The color to used for the curve line, - /// symbols, etc. - /// A class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public OHLCBarItem AddOHLCBar( string label, IPointList points, Color color ) - { - OHLCBarItem curve = new OHLCBarItem( label, points, color ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a japanesecandlestick graph ( object) to the plot with - /// the given data points () and properties. - /// - /// - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// Note that the - /// should contain objects instead of - /// objects in order to contain all the data values required for this curve type. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// A class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public JapaneseCandleStickItem AddJapaneseCandleStick( string label, IPointList points ) - { - JapaneseCandleStickItem curve = new JapaneseCandleStickItem( label, points ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add an error bar set ( object) to the plot with - /// the given data points () and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// An array of double precision X values (the - /// independent values) that define the curve. - /// An array of double precision Y values (the - /// dependent values) that define the curve. - /// An array of double precision values that define the - /// base value (the bottom) of the bars for this curve. - /// - /// The color to used for the curve line, - /// symbols, etc. - /// An class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public ErrorBarItem AddErrorBar( string label, double[] x, double[] y, - double[] baseValue, Color color ) - { - ErrorBarItem curve = new ErrorBarItem( label, new PointPairList( x, y, baseValue ), - color ); - _curveList.Add( curve ); - - return curve; - } - /// - /// Add an error bar set ( object) to the plot with - /// the given data points () and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// The color to used for the curve line, - /// symbols, etc. - /// An class for the newly created curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public ErrorBarItem AddErrorBar( string label, IPointList points, Color color ) - { - ErrorBarItem curve = new ErrorBarItem( label, points, color ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a bar type curve ( object) to the plot with - /// the given data points () and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// The color to used to fill the bars - /// A class for the newly created bar curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public BarItem AddBar( string label, IPointList points, Color color ) - { - BarItem curve = new BarItem( label, points, color ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a bar type curve ( object) to the plot with - /// the given data points (double arrays) and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// An array of double precision X values (the - /// independent values) that define the curve. - /// An array of double precision Y values (the - /// dependent values) that define the curve. - /// The color to used for the bars - /// A class for the newly created bar curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public BarItem AddBar( string label, double[] x, double[] y, Color color ) - { - BarItem curve = new BarItem( label, x, y, color ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a "High-Low" bar type curve ( object) to the plot with - /// the given data points (double arrays) and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// An array of double precision X values (the - /// independent values) that define the curve. - /// An array of double precision Y values (the - /// dependent values) that define the curve. - /// An array of double precision values that define the - /// base value (the bottom) of the bars for this curve. - /// - /// The color to used for the bars - /// A class for the newly created bar curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public HiLowBarItem AddHiLowBar( string label, double[] x, double[] y, - double[] baseVal, Color color ) - { - HiLowBarItem curve = new HiLowBarItem( label, x, y, baseVal, color ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a hi-low bar type curve ( object) to the plot with - /// the given data points () and properties. - /// This is simplified way to add curves without knowledge of the - /// class. An alternative is to use - /// the Add() method. - /// - /// The text label (string) for the curve that will be - /// used as a entry. - /// A of double precision value Trio's that define - /// the X, Y, and lower dependent values for this curve - /// The color to used to fill the bars - /// A class for the newly created bar curve. - /// This can then be used to access all of the curve properties that - /// are not defined as arguments to the - /// method. - public HiLowBarItem AddHiLowBar( string label, IPointList points, Color color ) - { - HiLowBarItem curve = new HiLowBarItem( label, points, color ); - _curveList.Add( curve ); - - return curve; - } - - /// - /// Add a to the display. - /// - /// The value associated with this item. - /// The display color for this item. - /// The amount this item will be - /// displaced from the center of the . - /// Text label for this - /// a reference to the constructed - public PieItem AddPieSlice( double value, Color color, double displacement, string label ) - { - PieItem slice = new PieItem( value, color, displacement, label ); - this.CurveList.Add( slice ); - return slice; - } - - /// - /// Add a to the display, providing a gradient fill for the pie color. - /// - /// The value associated with this instance. - /// The starting display color for the gradient for this - /// instance. - /// The ending display color for the gradient for this - /// instance. - /// The angle for the gradient . - /// The amount this instance will be - /// displaced from the center point. - /// Text label for this instance. - public PieItem AddPieSlice( double value, Color color1, Color color2, float fillAngle, - double displacement, string label ) - { - PieItem slice = new PieItem( value, color1, color2, fillAngle, displacement, label ); - this.CurveList.Add( slice ); - return slice; - } - - /// - ///Creates all the s for a single Pie Chart. - /// - /// double array containing all s - /// for a single PieChart. - /// - /// string array containing all s - /// for a single PieChart. - /// - /// an array containing references to all s comprising - /// the Pie Chart. - public PieItem[] AddPieSlices( double[] values, string[] labels ) - { - PieItem[] slices = new PieItem[values.Length]; - for ( int x = 0; x < values.Length; x++ ) - { - slices[x] = new PieItem( values[x], labels[x] ); - this.CurveList.Add( slices[x] ); - } - return slices; - } - - #endregion - - #region General Utility Methods - /// - /// Transform a data point from the specified coordinate type - /// () to screen coordinates (pixels). - /// - /// This method implicitly assumes that - /// has already been calculated via or - /// methods, or the is - /// set manually (see ). - /// The X,Y pair that defines the point in user - /// coordinates. - /// A type that defines the - /// coordinate system in which the X,Y pair is defined. - /// A point in screen coordinates that corresponds to the - /// specified user point. - public PointF GeneralTransform( PointF ptF, CoordType coord ) - { - // Setup the scaling data based on the chart rect - _xAxis.Scale.SetupScaleData( this, _xAxis ); - foreach ( Axis axis in _yAxisList ) - axis.Scale.SetupScaleData( this, axis ); - foreach ( Axis axis in _y2AxisList ) - axis.Scale.SetupScaleData( this, axis ); - - return this.TransformCoord( ptF.X, ptF.Y, coord ); - } - - /// - /// Transform a data point from the specified coordinate type - /// () to screen coordinates (pixels). - /// - /// This method implicitly assumes that - /// has already been calculated via or - /// methods, or the is - /// set manually (see ). - /// Note that this method is more accurate than the - /// overload, since it uses double types. This would typically only be significant for - /// coordinates. - /// - /// The x coordinate that defines the location in user space - /// The y coordinate that defines the location in user space - /// A type that defines the - /// coordinate system in which the X,Y pair is defined. - /// A point in screen coordinates that corresponds to the - /// specified user point. - public PointF GeneralTransform( double x, double y, CoordType coord ) - { - // Setup the scaling data based on the chart rect - _xAxis.Scale.SetupScaleData( this, _xAxis ); - foreach ( Axis axis in _yAxisList ) - axis.Scale.SetupScaleData( this, axis ); - foreach ( Axis axis in _y2AxisList ) - axis.Scale.SetupScaleData( this, axis ); - - return this.TransformCoord( x, y, coord ); - } - - /// - /// Return the user scale values that correspond to the specified screen - /// coordinate position (pixels). This overload assumes the default - /// and . - /// - /// This method implicitly assumes that - /// has already been calculated via or - /// methods, or the is - /// set manually (see ). - /// The X,Y pair that defines the screen coordinate - /// point of interest - /// The resultant value in user coordinates from the - /// - /// The resultant value in user coordinates from the - /// primary - public void ReverseTransform( PointF ptF, out double x, out double y ) - { - // Setup the scaling data based on the chart rect - _xAxis.Scale.SetupScaleData( this, _xAxis ); - this.YAxis.Scale.SetupScaleData( this, this.YAxis ); - - x = this.XAxis.Scale.ReverseTransform( ptF.X ); - y = this.YAxis.Scale.ReverseTransform( ptF.Y ); - } - - /// - /// Return the user scale values that correspond to the specified screen - /// coordinate position (pixels). - /// - /// This method implicitly assumes that - /// has already been calculated via or - /// methods, or the is - /// set manually (see ). - /// The X,Y pair that defines the screen coordinate - /// point of interest - /// The resultant value in user coordinates from the - /// - /// The resultant value in user coordinates from the - /// - /// The resultant value in user coordinates from the - /// primary - /// The resultant value in user coordinates from the - /// primary - public void ReverseTransform( PointF ptF, out double x, out double x2, out double y, - out double y2 ) - { - // Setup the scaling data based on the chart rect - _xAxis.Scale.SetupScaleData( this, _xAxis ); - _x2Axis.Scale.SetupScaleData( this, _x2Axis ); - this.YAxis.Scale.SetupScaleData( this, this.YAxis ); - this.Y2Axis.Scale.SetupScaleData( this, this.Y2Axis ); - - x = this.XAxis.Scale.ReverseTransform( ptF.X ); - x2 = this.X2Axis.Scale.ReverseTransform( ptF.X ); - y = this.YAxis.Scale.ReverseTransform( ptF.Y ); - y2 = this.Y2Axis.Scale.ReverseTransform( ptF.Y ); - } - - /// - /// Return the user scale values that correspond to the specified screen - /// coordinate position (pixels). - /// - /// This method implicitly assumes that - /// has already been calculated via or - /// methods, or the is - /// set manually (see ). - /// The X,Y pair that defines the screen coordinate - /// point of interest - /// true to return data that corresponds to an - /// , false for an . - /// true to return data that corresponds to a - /// , false for a . - /// The ordinal index of the Y or Y2 axis from which - /// to return data (see , ) - /// - /// The resultant value in user coordinates from the - /// - /// The resultant value in user coordinates from the - /// primary - public void ReverseTransform( PointF ptF, bool isX2Axis, bool isY2Axis, int yAxisIndex, - out double x, out double y ) - { - // Setup the scaling data based on the chart rect - Axis xAxis = _xAxis; - if ( isX2Axis ) - xAxis = _x2Axis; - - xAxis.Scale.SetupScaleData( this, xAxis ); - x = xAxis.Scale.ReverseTransform( ptF.X ); - - Axis yAxis = null; - if ( isY2Axis && Y2AxisList.Count > yAxisIndex ) - yAxis = Y2AxisList[yAxisIndex]; - else if ( !isY2Axis && YAxisList.Count > yAxisIndex ) - yAxis = YAxisList[yAxisIndex]; - - if ( yAxis != null ) - { - yAxis.Scale.SetupScaleData( this, yAxis ); - y = yAxis.Scale.ReverseTransform( ptF.Y ); - } - else - y = PointPair.Missing; - } - - /// - /// Return the user scale values that correspond to the specified screen - /// coordinate position (pixels) for all y axes. - /// - /// This method implicitly assumes that - /// has already been calculated via or - /// methods, or the is - /// set manually (see ). - /// The X,Y pair that defines the screen coordinate - /// point of interest - /// The resultant value in user coordinates from the - /// - /// The resultant value in user coordinates from the - /// - /// An array of resultant values in user coordinates from the - /// list of instances. This method allocates the - /// array for you, according to the number of objects - /// in the list. - /// An array of resultant values in user coordinates from the - /// list of instances. This method allocates the - /// array for you, according to the number of objects - /// in the list. - public void ReverseTransform( PointF ptF, out double x, out double x2, out double[] y, - out double[] y2 ) - { - // Setup the scaling data based on the chart rect - _xAxis.Scale.SetupScaleData( this, _xAxis ); - x = this.XAxis.Scale.ReverseTransform( ptF.X ); - _x2Axis.Scale.SetupScaleData( this, _x2Axis ); - x2 = this.X2Axis.Scale.ReverseTransform( ptF.X ); - - y = new double[_yAxisList.Count]; - y2 = new double[_y2AxisList.Count]; - - for ( int i = 0; i < _yAxisList.Count; i++ ) - { - Axis axis = _yAxisList[i]; - axis.Scale.SetupScaleData( this, axis ); - y[i] = axis.Scale.ReverseTransform( ptF.Y ); - } - for ( int i = 0; i < _y2AxisList.Count; i++ ) - { - Axis axis = _y2AxisList[i]; - axis.Scale.SetupScaleData( this, axis ); - y2[i] = axis.Scale.ReverseTransform( ptF.Y ); - } - } - - /// - /// Add a secondary (left side) to the list of axes - /// in the Graph. - /// - /// - /// Note that the primary is always included by default. - /// This method turns off the and - /// and - /// properties by default. - /// - /// The title for the . - /// the ordinal position (index) in the . - public int AddYAxis( string title ) - { - YAxis axis = new YAxis( title ); - axis.MajorTic.IsOpposite = false; - axis.MinorTic.IsOpposite = false; - axis.MajorTic.IsInside = false; - axis.MinorTic.IsInside = false; - _yAxisList.Add( axis ); - return _yAxisList.Count - 1; - } - - /// - /// Add a secondary (right side) to the list of axes - /// in the Graph. - /// - /// - /// Note that the primary is always included by default. - /// This method turns off the and - /// and - /// properties by default. - /// - /// The title for the . - /// the ordinal position (index) in the . - public int AddY2Axis( string title ) - { - Y2Axis axis = new Y2Axis( title ); - axis.MajorTic.IsOpposite = false; - axis.MinorTic.IsOpposite = false; - axis.MajorTic.IsInside = false; - axis.MinorTic.IsInside = false; - _y2AxisList.Add( axis ); - return _y2AxisList.Count - 1; - } - - /// - /// Find the object that lies closest to the specified mouse (screen) point. - /// - /// - /// This method will search through all of the graph objects, such as - /// , , , - /// , and . - /// If the mouse point is within the bounding box of the items (or in the case - /// of and , within - /// pixels), then the object will be returned. - /// You must check the type of the object to determine what object was - /// selected (for example, "if ( object is Legend ) ..."). The - /// parameter returns the index number of the item - /// within the selected object (such as the point number within a - /// object. - /// - /// The screen point, in pixel coordinates. - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// A reference to the nearest object to the - /// specified screen point. This can be any of , - /// , , - /// , , or . - /// Note: If the pane title is selected, then the object - /// will be returned. - /// - /// The index number of the item within the selected object - /// (where applicable). For example, for a object, - /// will be the index number of the nearest data point, - /// accessible via CurveItem.Points[index]. - /// index will be -1 if no data points are available. - /// true if an object was found, false otherwise. - /// - public bool FindNearestObject( PointF mousePt, Graphics g, - out object nearestObj, out int index ) - { - nearestObj = null; - index = -1; - - // Make sure that the axes & data are being drawn - if ( AxisRangesValid() ) - { - float scaleFactor = CalcScaleFactor(); - //int hStack; - //float legendWidth, legendHeight; - RectangleF tmpRect; - GraphObj saveGraphItem = null; - int saveIndex = -1; - ZOrder saveZOrder = ZOrder.H_BehindAll; - - // Calculate the chart rect, deducting the area for the scales, titles, legend, etc. - RectangleF tmpChartRect = CalcChartRect( g, scaleFactor ); - - // See if the point is in a GraphObj - // If so, just save the object and index so we can see if other overlying objects were - // intersected as well. - if ( this.GraphObjList.FindPoint( mousePt, this, g, scaleFactor, out index ) ) - { - saveGraphItem = this.GraphObjList[index]; - saveIndex = index; - saveZOrder = saveGraphItem.ZOrder; - } - - // See if the point is in the legend - if ( saveZOrder <= ZOrder.B_BehindLegend && - this.Legend.FindPoint( mousePt, this, scaleFactor, out index ) ) - { - nearestObj = this.Legend; - return true; - } - - // See if the point is in the Pane Title - SizeF paneTitleBox = _title._fontSpec.BoundingBox( g, _title._text, scaleFactor ); - if ( saveZOrder <= ZOrder.H_BehindAll && _title._isVisible ) - { - tmpRect = new RectangleF( ( _rect.Left + _rect.Right - paneTitleBox.Width ) / 2, - _rect.Top + _margin.Top * scaleFactor, - paneTitleBox.Width, paneTitleBox.Height ); - if ( tmpRect.Contains( mousePt ) ) - { - nearestObj = this; - return true; - } - } - - float left = tmpChartRect.Left; - - // See if the point is in one of the Y Axes - for ( int yIndex = 0; yIndex < _yAxisList.Count; yIndex++ ) - { - Axis yAxis = _yAxisList[yIndex]; - float width = yAxis._tmpSpace; - if ( width > 0 ) - { - tmpRect = new RectangleF( left - width, tmpChartRect.Top, - width, tmpChartRect.Height ); - if ( saveZOrder <= ZOrder.D_BehindAxis && tmpRect.Contains( mousePt ) ) - { - nearestObj = yAxis; - index = yIndex; - return true; - } - - left -= width; - } - } - - left = tmpChartRect.Right; - - // See if the point is in one of the Y2 Axes - for ( int yIndex = 0; yIndex < _y2AxisList.Count; yIndex++ ) - { - Axis y2Axis = _y2AxisList[yIndex]; - float width = y2Axis._tmpSpace; - if ( width > 0 ) - { - tmpRect = new RectangleF( left, tmpChartRect.Top, - width, tmpChartRect.Height ); - if ( saveZOrder <= ZOrder.D_BehindAxis && tmpRect.Contains( mousePt ) ) - { - nearestObj = y2Axis; - index = yIndex; - return true; - } - - left += width; - } - } - - // See if the point is in the X Axis - float height = _xAxis._tmpSpace; - - tmpRect = new RectangleF( tmpChartRect.Left, tmpChartRect.Bottom, - tmpChartRect.Width, height ); //_rect.Bottom - tmpChartRect.Bottom ); - - if ( saveZOrder <= ZOrder.D_BehindAxis && tmpRect.Contains( mousePt ) ) - { - nearestObj = this.XAxis; - return true; - } - - // See if the point is in the X2 Axis - height = _x2Axis._tmpSpace; - - tmpRect = new RectangleF( tmpChartRect.Left, - tmpChartRect.Top - height, - tmpChartRect.Width, - height ); - if ( saveZOrder <= ZOrder.D_BehindAxis && tmpRect.Contains( mousePt ) ) - { - nearestObj = this.X2Axis; - return true; - } - - CurveItem curve; - // See if it's a data point - if ( saveZOrder <= ZOrder.E_BehindCurves && FindNearestPoint( mousePt, out curve, out index ) ) - { - nearestObj = curve; - return true; - } - - if ( saveGraphItem != null ) - { - index = saveIndex; - nearestObj = saveGraphItem; - return true; - } - } - - return false; - } - - /// - /// Find the data point that lies closest to the specified mouse (screen) - /// point for the specified curve. - /// - /// - /// This method will search only through the points for the specified - /// curve to determine which point is - /// nearest the mouse point. It will only consider points that are within - /// pixels of the screen point. - /// - /// The screen point, in pixel coordinates. - /// A reference to the - /// instance that contains the closest point. nearestCurve will be null if - /// no data points are available. - /// A object containing - /// the data points to be searched. - /// The index number of the closest point. The - /// actual data vpoint will then be CurveItem.Points[iNearest] - /// . iNearest will - /// be -1 if no data points are available. - /// true if a point was found and that point lies within - /// pixels - /// of the screen point, false otherwise. - public bool FindNearestPoint( PointF mousePt, CurveItem targetCurve, - out CurveItem nearestCurve, out int iNearest ) - { - CurveList targetCurveList = new CurveList(); - targetCurveList.Add( targetCurve ); - return FindNearestPoint( mousePt, targetCurveList, - out nearestCurve, out iNearest ); - } - - /// - /// Find the data point that lies closest to the specified mouse (screen) - /// point. - /// - /// - /// This method will search through all curves in - /// to find which point is - /// nearest. It will only consider points that are within - /// pixels of the screen point. - /// - /// The screen point, in pixel coordinates. - /// A reference to the - /// instance that contains the closest point. nearestCurve will be null if - /// no data points are available. - /// The index number of the closest point. The - /// actual data vpoint will then be CurveItem.Points[iNearest] - /// . iNearest will - /// be -1 if no data points are available. - /// true if a point was found and that point lies within - /// pixels - /// of the screen point, false otherwise. - public bool FindNearestPoint( PointF mousePt, - out CurveItem nearestCurve, out int iNearest ) - { - return FindNearestPoint( mousePt, _curveList, - out nearestCurve, out iNearest ); - } - - /// - /// Find the data point that lies closest to the specified mouse (screen) - /// point. - /// - /// - /// This method will search through the specified list of curves to find which point is - /// nearest. It will only consider points that are within - /// pixels of the screen point, and it will - /// only consider 's that are in - /// . - /// - /// The screen point, in pixel coordinates. - /// A object containing - /// a subset of 's to be searched. - /// A reference to the - /// instance that contains the closest point. nearestCurve will be null if - /// no data points are available. - /// The index number of the closest point. The - /// actual data vpoint will then be CurveItem.Points[iNearest] - /// . iNearest will - /// be -1 if no data points are available. - /// true if a point was found and that point lies within - /// pixels - /// of the screen point, false otherwise. - public bool FindNearestPoint( PointF mousePt, CurveList targetCurveList, - out CurveItem nearestCurve, out int iNearest ) - { - CurveItem nearestBar = null; - int iNearestBar = -1; - nearestCurve = null; - iNearest = -1; - - // If the point is outside the ChartRect, always return false - if ( !_chart._rect.Contains( mousePt ) ) - return false; - - double x, x2; - double[] y; - double[] y2; - - //ReverseTransform( mousePt, out x, out y, out y2 ); - ReverseTransform( mousePt, out x, out x2, out y, out y2 ); - - if ( !AxisRangesValid() ) - return false; - - ValueHandler valueHandler = new ValueHandler( this, false ); - - //double yPixPerUnit = chartRect.Height / ( yAxis.Max - yAxis.Min ); - //double y2PixPerUnit; // = chartRect.Height / ( y2Axis.Max - y2Axis.Min ); - - double yPixPerUnitAct, yAct, yMinAct, yMaxAct, xAct; - double minDist = 1e20; - double xVal, yVal, dist = 99999, distX, distY; - double tolSquared = Default.NearestTol * Default.NearestTol; - - int iBar = 0; - - foreach ( CurveItem curve in targetCurveList ) - { - //test for pie first...if it's a pie rest of method superfluous - if ( curve is PieItem && curve.IsVisible ) - { - if ( ( (PieItem)curve ).SlicePath != null && - ( (PieItem)curve ).SlicePath.IsVisible( mousePt ) ) - { - nearestBar = curve; - iNearestBar = 0; - } - - continue; - } - else if ( curve.IsVisible ) - { - int yIndex = curve.GetYAxisIndex( this ); - Axis yAxis = curve.GetYAxis( this ); - Axis xAxis = curve.GetXAxis( this ); - - if ( curve.IsY2Axis ) - { - yAct = y2[yIndex]; - yMinAct = _y2AxisList[yIndex]._scale._min; - yMaxAct = _y2AxisList[yIndex]._scale._max; - } - else - { - yAct = y[yIndex]; - yMinAct = _yAxisList[yIndex]._scale._min; - yMaxAct = _yAxisList[yIndex]._scale._max; - } - - yPixPerUnitAct = _chart._rect.Height / ( yMaxAct - yMinAct ); - - double xPixPerUnit = _chart._rect.Width / ( xAxis._scale._max - xAxis._scale._min ); - xAct = xAxis is XAxis ? x : x2; - - IPointList points = curve.Points; - float barWidth = curve.GetBarWidth( this ); - double barWidthUserHalf; - Axis baseAxis = curve.BaseAxis( this ); - bool isXBaseAxis = ( baseAxis is XAxis || baseAxis is X2Axis ); - if ( isXBaseAxis ) - barWidthUserHalf = barWidth / xPixPerUnit / 2.0; - else - barWidthUserHalf = barWidth / yPixPerUnitAct / 2.0; - - if ( points != null ) - { - for ( int iPt = 0; iPt < curve.NPts; iPt++ ) - { - // xVal is the user scale X value of the current point - if ( xAxis._scale.IsAnyOrdinal && !curve.IsOverrideOrdinal ) - xVal = (double)iPt + 1.0; - else - xVal = points[iPt].X; - - // yVal is the user scale Y value of the current point - if ( yAxis._scale.IsAnyOrdinal && !curve.IsOverrideOrdinal ) - yVal = (double)iPt + 1.0; - else - yVal = points[iPt].Y; - - if ( xVal != PointPair.Missing && - yVal != PointPair.Missing ) - { - - if ( curve.IsBar || curve is ErrorBarItem || - curve is HiLowBarItem || curve is OHLCBarItem || - curve is JapaneseCandleStickItem ) - { - double baseVal, lowVal, hiVal; - valueHandler.GetValues( curve, iPt, out baseVal, - out lowVal, out hiVal ); - - if ( lowVal > hiVal ) - { - double tmpVal = lowVal; - lowVal = hiVal; - hiVal = tmpVal; - } - - if ( isXBaseAxis ) - { - - double centerVal = valueHandler.BarCenterValue( curve, barWidth, iPt, xVal, iBar ); - - if ( xAct < centerVal - barWidthUserHalf || - xAct > centerVal + barWidthUserHalf || - yAct < lowVal || yAct > hiVal ) - continue; - } - else - { - double centerVal = valueHandler.BarCenterValue( curve, barWidth, iPt, yVal, iBar ); - - if ( yAct < centerVal - barWidthUserHalf || - yAct > centerVal + barWidthUserHalf || - xAct < lowVal || xAct > hiVal ) - continue; - } - - if ( nearestBar == null ) - { - iNearestBar = iPt; - nearestBar = curve; - } - } - else if ( xVal >= xAxis._scale._min && xVal <= xAxis._scale._max && - yVal >= yMinAct && yVal <= yMaxAct ) - { - if ( curve is LineItem && _lineType == LineType.Stack ) - { - double zVal; - valueHandler.GetValues( curve, iPt, out xVal, out zVal, out yVal ); - } - - distX = ( xVal - xAct ) * xPixPerUnit; - distY = ( yVal - yAct ) * yPixPerUnitAct; - dist = distX * distX + distY * distY; - - if ( dist >= minDist ) - continue; - - minDist = dist; - iNearest = iPt; - nearestCurve = curve; - } - - } - } - - if ( curve.IsBar ) - iBar++; - } - } - } - - if ( nearestCurve is LineItem ) - { - float halfSymbol = (float)( ( (LineItem)nearestCurve ).Symbol.Size * - CalcScaleFactor() / 2 ); - minDist -= halfSymbol * halfSymbol; - if ( minDist < 0 ) - minDist = 0; - } - - if ( minDist >= tolSquared && nearestBar != null ) - { - // if no point met the tolerance, but a bar was found, use it - nearestCurve = nearestBar; - iNearest = iNearestBar; - return true; - } - else if ( minDist < tolSquared ) - { - // Did we find a close point, and is it within the tolerance? - // (minDist is the square of the distance in pixel units) - return true; - } - else // otherwise, no valid point found - return false; - } - - /// - /// Search through the and for - /// items that contain active objects. - /// - /// The mouse location where the click occurred - /// An appropriate instance - /// The current scaling factor for drawing operations. - /// The clickable object that was found. Typically a type of - /// or a type of . - /// The instance that is contained within - /// the object. - /// An index value, indicating which point was clicked for - /// type objects. - /// returns true if a clickable link was found under the - /// , or false otherwise. - /// - public bool FindLinkableObject( PointF mousePt, Graphics g, float scaleFactor, - out object source, out Link link, out int index ) - { - index = -1; - - // First look for graph objects that lie in front of the data points - foreach ( GraphObj graphObj in _graphObjList ) - { - link = graphObj._link; - bool inFront = graphObj.IsInFrontOfData; - - if ( link.IsActive ) - { - if ( graphObj.PointInBox( mousePt, this, g, scaleFactor ) ) - { - source = graphObj; - return true; - } - } - } - - // Second, look at the curve data points - foreach ( CurveItem curve in _curveList ) - { - link = curve._link; - - if ( link.IsActive ) - { - CurveItem nearestCurve; - - if ( FindNearestPoint( mousePt, curve, out nearestCurve, out index ) ) - { - source = curve; - return true; - } - } - } - - // Third, look for graph objects that lie behind the data points - foreach ( GraphObj graphObj in _graphObjList ) - { - link = graphObj._link; - bool inFront = graphObj.IsInFrontOfData; - - if ( link.IsActive ) - { - if ( graphObj.PointInBox( mousePt, this, g, scaleFactor ) ) - { - source = graphObj; - return true; - } - } - } - - source = null; - link = null; - index = -1; - return false; - - } - - // Revision: JCarpenter 10/06 - /// - /// Find any objects that exist within the specified (screen) rectangle. - /// This method will search through all of the graph objects, such as - /// , , , - /// , and . - /// and see if the objects' bounding boxes are within the specified (screen) rectangle - /// This method returns true if any are found. - /// - public bool FindContainedObjects( RectangleF rectF, Graphics g, - out CurveList containedObjs ) - { - containedObjs = new CurveList(); - - foreach ( CurveItem ci in this.CurveList ) - { - for ( int i = 0; i < ci.Points.Count; i++ ) - { - if ( ci.Points[i].X > rectF.Left && - ci.Points[i].X < rectF.Right && - ci.Points[i].Y > rectF.Bottom && - ci.Points[i].Y < rectF.Top ) - { - containedObjs.Add( ci ); - } - } - } - return ( containedObjs.Count > 0 ); - } - - #endregion - - } -} - diff --git a/SDK/ZedGraphs/ZedGraph/HSBColor.cs b/SDK/ZedGraphs/ZedGraph/HSBColor.cs deleted file mode 100644 index 8d6d15f..0000000 --- a/SDK/ZedGraphs/ZedGraph/HSBColor.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System; -using System.Text; -using System.Drawing; -using System.Drawing.Drawing2D; - -namespace ZedGraph -{ - /// - /// Hue-Saturation-Brightness Color class to store a color value, and to manage conversions - /// to and from RGB colors in the struct. - /// - /// - /// This class is based on code from http://www.cs.rit.edu/~ncs/color/ by Eugene Vishnevsky. - /// This struct stores the hue, saturation, brightness, and alpha values internally as - /// values from 0 to 255. The hue represents a fraction of the 360 degrees - /// of color space available. The saturation is the color intensity, where 0 represents gray scale - /// and 255 is the most colored. For the brightness, 0 represents black and 255 - /// represents white. - /// - [Serializable] - public struct HSBColor - { - /// - /// The color hue value, ranging from 0 to 255. - /// - /// - /// This property is actually a rescaling of the 360 degrees on the color wheel to 255 - /// possible values. Therefore, every 42.5 units is a new sector, with the following - /// convention: red=0, yellow=42.5, green=85, cyan=127.5, blue=170, magenta=212.5 - /// - public byte H; - /// - /// The color saturation (intensity) value, ranging from 0 (gray scale) to 255 (most colored). - /// - public byte S; - /// - /// The brightness value, ranging from 0 (black) to 255 (white). - /// - public byte B; - /// - /// The alpha value (opacity), ranging from 0 (transparent) to 255 (opaque). - /// - public byte A; - - /// - /// Constructor to load an struct from hue, saturation and - /// brightness values - /// - /// The color hue value, ranging from 0 to 255 - /// The color saturation (intensity) value, ranging from 0 (gray scale) - /// to 255 (most colored) - /// The brightness value, ranging from 0 (black) to 255 (white) - public HSBColor( int h, int s, int b ) - { - this.H = (byte)h; - this.S = (byte)s; - this.B = (byte)b; - this.A = 255; - } - - /// - /// Constructor to load an struct from hue, saturation, - /// brightness, and alpha values - /// - /// The color hue value, ranging from 0 to 255 - /// The color saturation (intensity) value, ranging from 0 (gray scale) - /// to 255 (most colored) - /// The brightness value, ranging from 0 (black) to 255 (white) - /// The alpha value (opacity), ranging from 0 (transparent) to - /// 255 (opaque) - public HSBColor( int a, int h, int s, int b ) - : this( h, s, b ) - { - this.A = (byte)a; - } - - /// - /// Constructor to load an struct from a system - /// struct. - /// - /// An rgb struct containing the equivalent - /// color you want to generate - public HSBColor( Color color ) - { - this = FromRGB( color ); - } - - - /// - /// Implicit conversion operator to convert directly from an to - /// a struct. - /// - /// The struct to be converted - /// An equivalent struct that can be used in the GDI+ - /// graphics library - public static implicit operator Color( HSBColor hsbColor ) - { - return ToRGB( hsbColor ); - } - - /// - /// Convert an value to an equivalent value. - /// - /// - /// This method is based on code from http://www.cs.rit.edu/~ncs/color/ by Eugene Vishnevsky. - /// - /// The struct to be converted - /// An equivalent struct, compatible with the GDI+ library - public static Color ToRGB( HSBColor hsbColor ) - { - Color rgbColor = Color.Black; - - // Determine which sector of the color wheel contains this hue - // hsbColor.H ranges from 0 to 255, and there are 6 sectors, so 42.5 per sector - int sector = (int) Math.Floor( (double) hsbColor.H / 42.5 ); - // Calculate where the hue lies within the sector for interpolation purpose - double fraction = (double) hsbColor.H / 42.5 - (double) sector; - - double sFrac = (double) hsbColor.S / 255.0; - byte p = (byte) (( (double) hsbColor.B * ( 1.0 - sFrac ) ) + 0.5); - byte q = (byte) (( (double) hsbColor.B * ( 1.0 - sFrac * fraction ) ) + 0.5); - byte t = (byte) (( (double) hsbColor.B * ( 1.0 - sFrac * ( 1.0 - fraction ) ) ) + 0.5); - - - switch( sector ) - { - case 0: // red - yellow - rgbColor = Color.FromArgb( hsbColor.A, hsbColor.B, t, p ); - break; - case 1: // yellow - green - rgbColor = Color.FromArgb( hsbColor.A, q, hsbColor.B, p ); - break; - case 2: // green - cyan - rgbColor = Color.FromArgb( hsbColor.A, p, hsbColor.B, t ); - break; - case 3: // cyan - blue - rgbColor = Color.FromArgb( hsbColor.A, p, q, hsbColor.B ); - break; - case 4: // blue - magenta - rgbColor = Color.FromArgb( hsbColor.A, t, p, hsbColor.B ); - break; - case 5: - default: // magenta - red - rgbColor = Color.FromArgb( hsbColor.A, hsbColor.B, p, q ); - break; - } - - return rgbColor; - } - - /// - /// Convert this value to an equivalent value. - /// - /// - /// This method is based on code from http://www.cs.rit.edu/~ncs/color/ by Eugene Vishnevsky. - /// - /// An equivalent struct, compatible with the GDI+ library - public Color ToRGB() - { - return ToRGB( this ); - } - - /// - /// Convert a value to an equivalent value. - /// - /// - /// This method is based on code from http://www.cs.rit.edu/~ncs/color/ by Eugene Vishnevsky. - /// - /// An equivalent struct - public HSBColor FromRGB() - { - return FromRGB( this ); - } - - /// - /// Convert a value to an equivalent value. - /// - /// - /// This method is based on code from http://www.cs.rit.edu/~ncs/color/ by Eugene Vishnevsky. - /// - /// The struct to be converted - /// An equivalent struct - public static HSBColor FromRGB( Color rgbColor ) - { - double r = (double) rgbColor.R / 255.0; - double g = (double) rgbColor.G / 255.0; - double b = (double) rgbColor.B / 255.0; - - double min = Math.Min( Math.Min( r, g ), b ); - double max = Math.Max( Math.Max( r, g ), b ); - - HSBColor hsbColor = new HSBColor( rgbColor.A, 0, 0, 0 ); - - hsbColor.B = (byte) ( max * 255.0 + 0.5 ); - - double delta = max - min; - - if ( max != 0.0 ) - { - hsbColor.S = (byte) ( delta / max * 255.0 + 0.5 ); - } - else - { - hsbColor.S = 0; - hsbColor.H = 0; - return hsbColor; - } - - double h; - if ( r == max ) - h = ( g - b ) / delta; // between yellow & magenta - else if ( g == max ) - h = 2 + ( b - r ) / delta; // between cyan & yellow - else - h = 4 + ( r - g ) / delta; // between magenta & cyan - - hsbColor.H = (byte) ( h * 42.5 ); - if ( hsbColor.H < 0 ) - hsbColor.H += 255; - - return hsbColor; - } - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/HiLowBar.cs b/SDK/ZedGraphs/ZedGraph/HiLowBar.cs deleted file mode 100644 index ce6a28e..0000000 --- a/SDK/ZedGraphs/ZedGraph/HiLowBar.cs +++ /dev/null @@ -1,378 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// This class handles the drawing of the curve objects. - /// The Hi-Low Bars are the "floating" bars that have a lower and upper value and - /// appear at each defined point. - /// - /// - /// John Champion - /// $Revision: 3.18 $ $Date: 2007-10-26 08:19:49 $ - [Serializable] - public class HiLowBar : Bar, ICloneable, ISerializable - { - - #region Fields - /// - /// Private field that stores the size (width) of this - /// in points (1/72 inch). Use the public - /// property to access this value. - /// - private float _size; - - /// - /// Private field that determines whether the bar width will be based on - /// the value, or it will be based on available - /// space similar to objects. Use the public property - /// to access this value. - /// - private bool _isAutoSize; - - /// - /// The result of the autosize calculation, which is the size of the bars in - /// user scale units. This is converted to pixels at draw time. - /// - internal double _userScaleSize = 1.0; - - #endregion - - #region Default - /// - /// A simple struct that defines the - /// default property values for the class. - /// - new public struct Default - { - // Default HiLowBar properties - /// - /// The default size (width) for the bars ( property), - /// in units of points. - /// - public static float Size = 7; - - /// - /// Default value for the property. - /// - public static bool IsAutoSize = true; - } - #endregion - - #region Constructors - /// - /// Default constructor that sets all properties to default - /// values as defined in the class. - /// - public HiLowBar() : this( Color.Empty ) - { - } - - /// - /// Default constructor that sets the - /// as specified, and the remaining - /// properties to default - /// values as defined in the class. - /// The specified color is only applied to the - /// , and the - /// will be defaulted. - /// - /// A value indicating - /// the - /// of the Bar. - /// - public HiLowBar( Color color ) : this( color, Default.Size ) - { - } - - /// - /// Default constructor that sets the - /// and as specified, and the remaining - /// properties to default - /// values as defined in the class. - /// The specified color is only applied to the - /// , and the - /// will be defaulted. - /// - /// A value indicating - /// the - /// of the Bar. - /// - /// The size (width) of the 's, in points - /// (1/72nd inch) - public HiLowBar( Color color, float size ) : base( color ) - { - _size = size; - _isAutoSize = Default.IsAutoSize; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public HiLowBar( HiLowBar rhs ) : base( rhs ) - { - _size = rhs._size; - _isAutoSize = rhs._isAutoSize; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - new public HiLowBar Clone() - { - return new HiLowBar( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected HiLowBar( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _size = info.GetSingle( "size" ); - _isAutoSize = info.GetBoolean( "isAutoSize" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "size", _size ); - info.AddValue( "isAutoSize", _isAutoSize ); - } - #endregion - - #region Properties - /// - /// Gets or sets the size of the - /// - /// The size of the bars can be set by this value, which - /// is then scaled according to the scaleFactor (see - /// ). Alternatively, - /// if is true, the bar width will - /// be set according to the maximum available cluster width less - /// the cluster gap (see - /// and ). That is, if - /// is true, then the value of - /// will be ignored. If you modify the value of Size, - /// then will be automatically set to false. - /// - /// Size in points (1/72 inch) - /// - public float Size - { - get { return _size; } - set { _size = value; _isAutoSize = false; } - } - - /// - /// Determines whether the bar width will be based on - /// the value, or it will be based on available - /// space similar to objects. - /// - /// If true, then the value of is ignored. - /// If this value is true, then will be used to - /// determine the total space between each bar. If the base axis is non-ordinal, then - /// will be active. In this case, you may - /// want to make sure that is true. - /// - public bool IsAutoSize - { - get { return _isAutoSize; } - set { _isAutoSize = value; } - } - #endregion - - #region Methods - /* - /// - /// Protected internal routine that draws the specified single bar (an individual "point") - /// of this series to the specified device. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A object representing the - /// 's to be drawn. - /// - /// The zero-based index number for the single bar to be drawn. - /// - /// - /// The ordinal position of the this bar series (0=first bar, 1=second bar, etc.) - /// in the cluster of bars. - /// - /// The class instance that defines the base (independent) - /// axis for the - /// The class instance that defines the value (dependent) - /// axis for the - /// - /// The width of each bar, in pixels. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override protected void DrawSingleBar( Graphics g, GraphPane pane, - CurveItem curve, - int index, int pos, Axis baseAxis, Axis valueAxis, - float barWidth, float scaleFactor ) - { - //float scaledSize = GetBarWidth( pane, baseAxis, scaleFactor ); - - // pixBase = pixel value for the bar center on the base axis - // pixValue = pixel value for the bar top on the value axis - // pixLow = pixel value for the bar bottom on the value axis - float pixBase, pixHiVal, pixLowVal; - - // curBase = the scale value on the base axis of the current bar - // curValue = the scale value on the value axis of the current bar - - double curBase, curLowVal, curHiVal; - ValueHandler valueHandler = new ValueHandler( pane, false ); - valueHandler.GetValues( curve, index, out curBase, - out curLowVal, out curHiVal ); - - barWidth = GetBarWidth( pane, baseAxis, scaleFactor ); - - // curLow = the scale value on the value axis for the bottom of the current bar - // Get a "low" value for the bottom of the bar and verify validity - - if ( curLowVal == PointPair.Missing || - System.Double.IsNaN( curLowVal ) || - System.Double.IsInfinity( curLowVal ) ) - curLowVal = 0; - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - - if ( !curve.Points[index].IsInvalid ) - { - // calculate a pixel value for the top of the bar on value axis - pixHiVal = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, index, curHiVal ); - // calculate a pixel value for the center of the bar on the base axis - pixBase = baseAxis.Scale.Transform( curve.IsOverrideOrdinal, index, curBase ); - - pixLowVal = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, index, curLowVal ); - - // Calculate the pixel location for the side of the bar (on the base axis) - float pixSide = pixBase - barWidth / 2.0F; - - // Calculate the pixel location for the side of the bar (on the base axis) - float pixSide = pixBase - clusterWidth / 2.0F + clusterGap / 2.0F + - pos * ( barWidth + barGap ); - - // Draw the bar - if ( baseAxis is XAxis || baseAxis is X2Axis ) - this.Draw( g, pane, pixSide, pixSide + barWidth, pixLowVal, - pixHiVal, scaleFactor, true, curve.IsSelected, - curve.Points[index] ); - else - this.Draw( g, pane, pixLowVal, pixHiVal, pixSide, pixSide + barWidth, - scaleFactor, true, curve.IsSelected, - curve.Points[index] ); - } - } - */ - - /// - /// Returns the width of the bar, in pixels, based on the settings for - /// and . - /// - /// The parent object. - /// The object that - /// represents the bar base (independent axis). - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The width of each bar, in pixel units - public float GetBarWidth( GraphPane pane, Axis baseAxis, float scaleFactor ) - { - float width; - - if ( _isAutoSize ) - width = baseAxis._scale.GetClusterWidth( _userScaleSize ) / - ( 1.0F + pane._barSettings.MinClusterGap ); - else - width = (float) ( _size * scaleFactor ); - - // use integral size - return (int)( width + 0.5f ); - } - - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/HiLowBarItem.cs b/SDK/ZedGraphs/ZedGraph/HiLowBarItem.cs deleted file mode 100644 index 7e039d8..0000000 --- a/SDK/ZedGraphs/ZedGraph/HiLowBarItem.cs +++ /dev/null @@ -1,149 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// Encapsulates an "High-Low" Bar curve type that displays a bar in which both - /// the bottom and the top of the bar are set by data valuesfrom the - /// struct. - /// - /// The type is intended for displaying - /// bars that cover a band of data, such as a confidence interval, "waterfall" - /// chart, etc. The position of each bar is set - /// according to the values. The independent axis - /// is assigned with , and is a - /// enum type. If - /// is set to or , then - /// the bars will actually be horizontal, since the X axis becomes the - /// value axis and the Y or Y2 axis becomes the independent axis. - /// John Champion - /// $Revision: 3.18 $ $Date: 2007-11-03 04:41:28 $ - [Serializable] - public class HiLowBarItem : BarItem, ICloneable, ISerializable - { - - #region Constructors - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// An array of double precision values that define - /// the independent (X axis) values for this curve - /// An array of double precision values that define - /// the dependent (Y axis) values for this curve - /// An array of double precision values that define the - /// base value (the bottom) of the bars for this curve. - /// - /// A value that will be applied to - /// the and properties. - /// - public HiLowBarItem( string label, double[] x, double[] y, double[] baseVal, Color color ) : - this( label, new PointPairList( x, y, baseVal ), color ) - { - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// A of double precision value trio's that define - /// the X, Y, and lower dependent values for this curve - /// A value that will be applied to - /// the and properties. - /// - public HiLowBarItem( string label, IPointList points, Color color ) - : base( label, points, color ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public HiLowBarItem( HiLowBarItem rhs ) : base( rhs ) - { - _bar = rhs._bar.Clone(); // new HiLowBar( rhs.Bar ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - new public HiLowBarItem Clone() - { - return new HiLowBarItem( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected HiLowBarItem( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema3" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/IPointList.cs b/SDK/ZedGraphs/ZedGraph/IPointList.cs deleted file mode 100644 index faf8800..0000000 --- a/SDK/ZedGraphs/ZedGraph/IPointList.cs +++ /dev/null @@ -1,57 +0,0 @@ -//============================================================================ -//IPointList interface -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= -using System; -using System.Text; - -namespace ZedGraph -{ - /// - /// An interface to a collection class containing data - /// that define the set of points to be displayed on the curve. - /// - /// - /// This interface is designed to allow customized data abstraction. The default data - /// collection class is , however, you can define your own - /// data collection class using the interface. - /// - /// - /// - /// - /// John Champion - /// $Revision: 1.6 $ $Date: 2007-11-11 07:29:43 $ - public interface IPointList : ICloneable - { - /// - /// Indexer to access a data point by its ordinal position in the collection. - /// - /// - /// This is the standard interface that ZedGraph uses to access the data. Although - /// you must pass a here, your internal data storage format - /// can be anything. - /// - /// The ordinal position (zero-based) of the - /// data point to be accessed. - /// A object instance. - PointPair this[ int index ] { get; } - /// - /// Gets the number of points available in the list. - /// - int Count { get; } - } -} diff --git a/SDK/ZedGraphs/ZedGraph/IPointListEdit.cs b/SDK/ZedGraphs/ZedGraph/IPointListEdit.cs deleted file mode 100644 index fa1bbbf..0000000 --- a/SDK/ZedGraphs/ZedGraph/IPointListEdit.cs +++ /dev/null @@ -1,88 +0,0 @@ -//============================================================================ -//IPointListEdit interface -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= -using System; -using System.Text; - -namespace ZedGraph -{ - /// - /// An interface to a collection class containing data - /// that define the set of points to be displayed on the curve. - /// - /// - /// This interface is designed to allow customized data abstraction. The default data - /// collection class is , however, you can define your own - /// data collection class using the interface. This - /// interface adds the ability to remove and add points - /// to the list, and so is used by the class for the - /// , , and - /// methods. - /// - /// - /// - /// - /// - /// - /// John Champion - /// $Revision: 3.6 $ $Date: 2006-10-19 04:40:14 $ - public interface IPointListEdit : IPointList - { - /// - /// Indexer to access a data point by its ordinal position in the collection. - /// - /// - /// This is the standard interface that ZedGraph uses to access the data. Although - /// you must pass a here, your internal data storage format - /// can be anything. - /// - /// The ordinal position (zero-based) of the - /// data point to be accessed. - /// A object instance. - new PointPair this[int index] { get; set; } - - /// - /// Appends a point to the end of the list. The data are passed in as a - /// object. - /// - /// The object containing the data to be added. - void Add( PointPair point ); - - /// - /// Appends a point to the end of the list. The data are passed in as two - /// types. - /// - /// The value containing the X data to be added. - /// The value containing the Y data to be added. - /// The ordinal position (zero-based), at which the new point was added. - void Add( double x, double y ); - - /// - /// Removes a single data point from the list at the specified ordinal location - /// (zero based). - /// - void RemoveAt( int index ); - - /// - /// Clears all data points from the list. After calling this method, - /// will be zero. - /// - void Clear(); - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ImageObj.cs b/SDK/ZedGraphs/ZedGraph/ImageObj.cs deleted file mode 100644 index e52a028..0000000 --- a/SDK/ZedGraphs/ZedGraph/ImageObj.cs +++ /dev/null @@ -1,342 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// A class that represents an image object on the graph. A list of - /// objects is maintained by the - /// collection class. - /// - /// - /// John Champion - /// $Revision: 3.2 $ $Date: 2006-09-09 17:32:01 $ - [Serializable] - public class ImageObj : GraphObj, ICloneable, ISerializable - { - #region Fields - /// - /// Private field that stores the image. Use the public property - /// to access this value. - /// - private Image _image; - /// - /// Private field that determines if the image will be scaled to the output rectangle. - /// - /// true to scale the image, false to draw the image unscaled, but clipped - /// to the destination rectangle - private bool _isScaled; - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - new public struct Default - { - // Default text item properties - /// - /// Default value for the - /// property. - /// - public static bool IsScaled = true; - } - #endregion - - #region Properties - /// - /// The object. - /// - /// A class reference. - public Image Image - { - get { return _image; } - set { _image = value; } - } - /// - /// Gets or sets a property that determines if the image will be scaled to the - /// output rectangle (see ). - /// - /// true to scale the image, false to draw the image unscaled, but clipped - /// to the destination rectangle - public bool IsScaled - { - get { return _isScaled; } - set { _isScaled = value; } - } - #endregion - - #region Constructors - /// Constructors for the object - /// - /// A default constructor that places a null at a - /// default of (0,0,1,1) - /// - public ImageObj() : - this( null, 0, 0, 1, 1 ) - { - } - - /// - /// A constructor that allows the and - /// location for the - /// to be pre-specified. - /// - /// A class that defines - /// the image - /// A struct that defines the - /// image location, specifed in units based on the - /// property. - public ImageObj( Image image, RectangleF rect ) : - this( image, rect.X, rect.Y, rect.Width, rect.Height ) - { - } - - /// Constructors for the object - /// - /// A constructor that allows the and - /// location for the - /// to be pre-specified. - /// - /// A class that defines - /// the image - /// A struct that defines the - /// image location, specifed in units based on the - /// property. - /// The enum value that - /// indicates what type of coordinate system the x and y parameters are - /// referenced to. - /// The enum that specifies - /// the horizontal alignment of the object with respect to the (x,y) location - /// The enum that specifies - /// the vertical alignment of the object with respect to the (x,y) location - public ImageObj( Image image, RectangleF rect, CoordType coordType, - AlignH alignH, AlignV alignV ) : - base( rect.X, rect.Y, rect.Width, rect.Height, coordType, - alignH, alignV ) - { - _image = image; - _isScaled = Default.IsScaled; - } - - /// Constructors for the object - /// - /// A constructor that allows the and - /// individual coordinate locations for the - /// to be pre-specified. - /// - /// A class that defines - /// the image - /// The position of the left side of the rectangle that defines the - /// location. The units of this position are specified by the - /// property. - /// The position of the top side of the rectangle that defines the - /// location. The units of this position are specified by the - /// property. - /// The width of the rectangle that defines the - /// location. The units of this position are specified by the - /// property. - /// The height of the rectangle that defines the - /// location. The units of this position are specified by the - /// property. - public ImageObj( Image image, double left, double top, - double width, double height ) : - base( left, top, width, height ) - { - _image = image; - _isScaled = Default.IsScaled; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ImageObj( ImageObj rhs ) : base( rhs ) - { - _image = rhs._image; - _isScaled = rhs.IsScaled; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public ImageObj Clone() - { - return new ImageObj( this ); - } - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected ImageObj( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _image = (Image) info.GetValue( "image", typeof(Image) ); - _isScaled = info.GetBoolean( "isScaled" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "image", _image ); - info.AddValue( "isScaled", _isScaled ); - } - #endregion - - #region Rendering Methods - /// - /// Render this object to the specified device - /// This method is normally only called by the Draw method - /// of the parent collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) - { - if ( _image != null ) - { - // Convert the rectangle coordinates from the user coordinate system - // to the screen coordinate system - RectangleF tmpRect = _location.TransformRect( pane ); - - if ( _isScaled ) - g.DrawImage( _image, tmpRect ); - else - { - Region clip = g.Clip; - g.SetClip( tmpRect ); - g.DrawImageUnscaled( _image, Rectangle.Round( tmpRect ) ); - g.SetClip( clip, CombineMode.Replace ); - //g.DrawImageUnscaledAndClipped( image, Rectangle.Round( tmpRect ) ); - } - } - - } - - /// - /// Determine if the specified screen point lies inside the bounding box of this - /// . The bounding box is calculated assuming a distance - /// of pixels around the arrow segment. - /// - /// The screen point, in pixels - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// true if the point lies in the bounding box, false otherwise - override public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) - { - if ( _image != null ) - { - if ( ! base.PointInBox(pt, pane, g, scaleFactor ) ) - return false; - - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - RectangleF tmpRect = _location.TransformRect( pane ); - - return tmpRect.Contains( pt ); - } - else - return false; - } - - /// - /// Determines the shape type and Coords values for this GraphObj - /// - override public void GetCoords( PaneBase pane, Graphics g, float scaleFactor, - out string shape, out string coords ) - { - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - RectangleF pixRect = _location.TransformRect( pane ); - - shape = "rect"; - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixRect.Left, pixRect.Top, pixRect.Right, pixRect.Bottom ); - } - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/JapaneseCandleStick.cs b/SDK/ZedGraphs/ZedGraph/JapaneseCandleStick.cs deleted file mode 100644 index da62f49..0000000 --- a/SDK/ZedGraphs/ZedGraph/JapaneseCandleStick.cs +++ /dev/null @@ -1,485 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// This class handles the drawing of the curve objects. - /// - /// - /// John Champion - /// $Revision: 3.10 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - public class JapaneseCandleStick : OHLCBar, ICloneable, ISerializable - { - #region Fields - - /// - /// Private field to store the class to be used for filling the - /// candlestick "bars" when the value is greater than - /// the value. See the public property - /// to access this value. - /// - private Fill _risingFill; - /// - /// Private field to store the class to be used for filling the - /// candlestick "bars" when the value is less than - /// the value. See the public property - /// to access this value. - /// - private Fill _fallingFill; - - /// - /// Private field to store the class to be used for drawing the - /// candlestick "bars" when the value is greater than - /// the value. See the public property - /// to access this value. - /// - private Border _risingBorder; - /// - /// Private field to store the class to be used for drawing the - /// candlestick "bars" when the value is less than - /// the value. See the public property - /// to access this value. - /// - private Border _fallingBorder; - - /// - /// Private field that stores the CandleStick color when the - /// value is less than the value. Use the public - /// property to access this value. - /// - protected Color _fallingColor; - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public new struct Default - { - /// - /// The default fillcolor for drawing the rising case CandleSticks - /// ( property). - /// - public static Color RisingColor = Color.White; - /// - /// The default fillcolor for drawing the falling case CandleSticks - /// ( property). - /// - public static Color FallingColor = Color.Black; - - /// - /// The default color for the border of the rising CandleSticks - /// ( property). - /// - public static Color RisingBorder = Color.Black; - /// - /// The default color for the border of the falling CandleSticks - /// ( property). - /// - public static Color FallingBorder = Color.Black; - } - - #endregion - - #region Properties - - /// - /// Gets or sets the class that is used to fill the candlestick - /// "bars" when the value is greater than the - /// value. - /// - public Fill RisingFill - { - get { return _risingFill; } - set { _risingFill = value; } - } - /// - /// Gets or sets the class that is used to fill the candlestick - /// "bars" when the value is less than the - /// value. - /// - public Fill FallingFill - { - get { return _fallingFill; } - set { _fallingFill = value; } - } - - /// - /// The instance to be used for drawing the border frame of - /// the candlestick "bars" when the value is greater than the - /// value. - /// - public Border RisingBorder - { - get { return _risingBorder; } - set { _risingBorder = value; } - } - /// - /// The instance to be used for drawing the border frame of - /// the candlestick "bars" when the value is less than the - /// value. - /// - public Border FallingBorder - { - get { return _fallingBorder; } - set { _fallingBorder = value; } - } - - /// - /// Gets or sets the data for this - /// when the value of the candlestick is - /// falling. - /// - /// This property only controls the color of - /// the vertical line when the value is falling. The rising color is controlled - /// by the property. - /// - public Color FallingColor - { - get { return _fallingColor; } - set { _fallingColor = value; } - } - - #endregion - - #region Constructors - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class. - /// - public JapaneseCandleStick() : base() - { - _risingFill = new Fill( Default.RisingColor ); - _fallingFill = new Fill( Default.FallingColor ); - - _risingBorder = new Border( Default.RisingBorder, LineBase.Default.Width ); - _fallingBorder = new Border( Default.FallingBorder, LineBase.Default.Width ); - - _fallingColor = Default.FallingColor; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public JapaneseCandleStick( JapaneseCandleStick rhs ) : base( rhs ) - { - _risingFill = rhs._risingFill.Clone(); - _fallingFill = rhs._fallingFill.Clone(); - - _risingBorder = rhs._risingBorder.Clone(); - _fallingBorder = rhs._fallingBorder.Clone(); - - _fallingColor = rhs._fallingColor; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new JapaneseCandleStick Clone() - { - return new JapaneseCandleStick( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected JapaneseCandleStick( SerializationInfo info, StreamingContext context ) : - base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _risingFill = (Fill)info.GetValue( "risingFill", typeof( Fill ) ); - _fallingFill = (Fill)info.GetValue( "fallingFill", typeof( Fill ) ); - _risingBorder = (Border)info.GetValue( "risingBorder", typeof( Border ) ); - _fallingBorder = (Border)info.GetValue( "fallingBorder", typeof( Border ) ); - - if ( schema2 >= 11 ) - _fallingColor = (Color) info.GetValue( "fallingColor", typeof( Color ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema2", schema2 ); - info.AddValue( "risingFill", _risingFill ); - info.AddValue( "fallingFill", _fallingFill ); - info.AddValue( "risingBorder", _risingBorder ); - info.AddValue( "fallingBorder", _fallingBorder ); - info.AddValue( "fallingColor", _fallingColor ); - } - - #endregion - - #region Rendering Methods - - /// - /// Draw the to the specified - /// device at the specified location. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// boolean value that indicates if the "base" axis for this - /// is the X axis. True for an base, - /// false for a or base. - /// The independent axis position of the center of the candlestick in - /// pixel units - /// The high value position of the candlestick in - /// pixel units - /// The low value position of the candlestick in - /// pixel units - /// The opening value position of the candlestick in - /// pixel units - /// The closing value position of the candlestick in - /// pixel units - /// The scaled width of one-half of a bar, in pixels - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// A pen with the attribute for this - /// - /// - /// The instance to be used for filling this - /// - /// - /// The instance to be used for drawing the - /// border around the filled box - /// The to be used for determining the - /// , just in case it's a , - /// , or - /// - public void Draw( Graphics g, GraphPane pane, bool isXBase, - float pixBase, float pixHigh, float pixLow, - float pixOpen, float pixClose, float halfSize, - float scaleFactor, Pen pen, Fill fill, Border border, PointPair pt ) - { - //float halfSize = (int) ( _size * scaleFactor / 2.0f + 0.5f ); - - if ( pixBase != PointPair.Missing && Math.Abs( pixLow ) < 1000000 && - Math.Abs( pixHigh ) < 1000000) - { - RectangleF rect; - if ( isXBase ) - { - rect = new RectangleF( pixBase - halfSize, Math.Min( pixOpen, pixClose ), - halfSize * 2.0f, Math.Abs( pixOpen - pixClose ) ); - - g.DrawLine( pen, pixBase, pixHigh, pixBase, pixLow ); - } - else - { - rect = new RectangleF( Math.Min( pixOpen, pixClose ), pixBase - halfSize, - Math.Abs( pixOpen - pixClose ), halfSize * 2.0f ); - - g.DrawLine( pen, pixHigh, pixBase, pixLow, pixBase ); - } - - if ( _isOpenCloseVisible && Math.Abs( pixOpen ) < 1000000 && - Math.Abs( pixClose ) < 1000000 ) - { - if ( rect.Width == 0 ) - rect.Width = 1; - if ( rect.Height == 0 ) - rect.Height = 1; - - fill.Draw( g, rect, pt ); - border.Draw( g, pane, scaleFactor, rect ); - } - } - } - - - /// - /// Draw all the 's to the specified - /// device as a candlestick at each defined point. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A object representing the - /// 's to be drawn. - /// The class instance that defines the base (independent) - /// axis for the - /// The class instance that defines the value (dependent) - /// axis for the - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void Draw( Graphics g, GraphPane pane, JapaneseCandleStickItem curve, - Axis baseAxis, Axis valueAxis, float scaleFactor ) - { - //ValueHandler valueHandler = new ValueHandler( pane, false ); - - float pixBase, pixHigh, pixLow, pixOpen, pixClose; - - if ( curve.Points != null ) - { - //float halfSize = _size * scaleFactor; - float halfSize = GetBarWidth( pane, baseAxis, scaleFactor ); - - Color tColor = _color; - Color tFallingColor = _fallingColor; - float tPenWidth = _width; - Fill tRisingFill = _risingFill; - Fill tFallingFill = _fallingFill; - Border tRisingBorder = _risingBorder; - Border tFallingBorder = _fallingBorder; - if ( curve.IsSelected ) - { - tColor = Selection.Border.Color; - tFallingColor = Selection.Border.Color; - tPenWidth = Selection.Border.Width; - tRisingFill = Selection.Fill; - tFallingFill = Selection.Fill; - tRisingBorder = Selection.Border; - tFallingBorder = Selection.Border; - - } - - using ( Pen risingPen = new Pen( tColor, tPenWidth ) ) - using ( Pen fallingPen = new Pen( tFallingColor, tPenWidth ) ) - { - // Loop over each defined point - for ( int i = 0; i < curve.Points.Count; i++ ) - { - PointPair pt = curve.Points[i]; - double date = pt.X; - double high = pt.Y; - double low = pt.Z; - double open = PointPair.Missing; - double close = PointPair.Missing; - if ( pt is StockPt ) - { - open = ( pt as StockPt ).Open; - close = ( pt as StockPt ).Close; - } - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - - if ( !curve.Points[i].IsInvalid3D && - ( date > 0 || !baseAxis._scale.IsLog ) && - ( ( high > 0 && low > 0 ) || !valueAxis._scale.IsLog ) ) - { - pixBase = (int) ( baseAxis.Scale.Transform( curve.IsOverrideOrdinal, i, date ) + 0.5 ); - //pixBase = baseAxis.Scale.Transform( curve.IsOverrideOrdinal, i, date ); - pixHigh = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, high ); - pixLow = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, low ); - if ( PointPair.IsValueInvalid( open ) ) - pixOpen = Single.MaxValue; - else - pixOpen = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, open ); - - if ( PointPair.IsValueInvalid( close ) ) - pixClose = Single.MaxValue; - else - pixClose = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, close ); - - if ( !curve.IsSelected && this._gradientFill.IsGradientValueType ) - { - using ( Pen tPen = GetPen( pane, scaleFactor, pt ) ) - Draw( g, pane, baseAxis is XAxis || baseAxis is X2Axis, - pixBase, pixHigh, pixLow, pixOpen, - pixClose, halfSize, scaleFactor, - ( tPen ), - ( close > open ? tRisingFill : tFallingFill ), - ( close > open ? tRisingBorder : tFallingBorder ), pt ); - } - else - Draw( g, pane, baseAxis is XAxis || baseAxis is X2Axis, - pixBase, pixHigh, pixLow, pixOpen, - pixClose, halfSize, scaleFactor, - ( close > open ? risingPen : fallingPen ), - ( close > open ? tRisingFill : tFallingFill ), - ( close > open ? tRisingBorder : tFallingBorder ), pt ); - } - } - } - } - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/JapaneseCandleStickItem.cs b/SDK/ZedGraphs/ZedGraph/JapaneseCandleStickItem.cs deleted file mode 100644 index da7c99a..0000000 --- a/SDK/ZedGraphs/ZedGraph/JapaneseCandleStickItem.cs +++ /dev/null @@ -1,353 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// Encapsulates a Japanese CandleStick curve type that displays a vertical (or horizontal) - /// line displaying the range of data values at each sample point, plus a filled bar - /// signifying the opening and closing value for the sample. - /// - /// For this type to work properly, your must contain - /// objects, rather than ordinary types. - /// This is because the type actually displays 5 data values - /// but the only stores 3 data values. The - /// stores , , - /// , , and - /// members. - /// For a JapaneseCandleStick chart, the range between opening and closing values - /// is drawn as a filled bar, with the filled color different - /// () for the case of - /// - /// higher than , and - /// - /// for the reverse. The width of the bar is controlled - /// by the property, which is specified in - /// points (1/72nd inch), and scaled according to . - /// The candlesticks are drawn horizontally or vertically depending on the - /// value of , which is a - /// enum type. - /// John Champion - /// $Revision: 3.6 $ $Date: 2007-12-31 00:23:05 $ - [Serializable] - public class JapaneseCandleStickItem : CurveItem, ICloneable, ISerializable - { - #region Fields - - /// - /// Private field that stores a reference to the - /// class defined for this . Use the public - /// property to access this value. - /// - /// - private JapaneseCandleStick _stick; - - #endregion - - #region Properties - /// - /// Gets a reference to the class defined - /// for this . - /// - public JapaneseCandleStick Stick - { - get { return _stick; } - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return pane._barSettings.Base == BarBase.X; - } - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// - /// IsZIncluded is true for objects, since the Y and Z - /// values are defined as the High and Low values for the day. - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return true; - } - - #endregion - - #region Constructors - - /// - /// Create a new , specifying only the legend label. - /// - /// The label that will appear in the legend. - public JapaneseCandleStickItem( string label ) - : base( label ) - { - _stick = new JapaneseCandleStick(); - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// An of double precision values that define - /// the Date, Close, Open, High, and Low values for the curve. Note that this - /// should contain items rather - /// than items. - /// - public JapaneseCandleStickItem( string label, IPointList points ) - : base( label, points ) - { - _stick = new JapaneseCandleStick(); - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public JapaneseCandleStickItem( JapaneseCandleStickItem rhs ) - : base( rhs ) - { - _stick = rhs._stick.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public JapaneseCandleStickItem Clone() - { - return new JapaneseCandleStickItem( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected JapaneseCandleStickItem( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _stick = (JapaneseCandleStick) info.GetValue( "stick", - typeof( JapaneseCandleStick ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema2", schema2 ); - info.AddValue( "stick", _stick ); - } - - #endregion - - #region Methods - - /// - /// Do all rendering associated with this to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The ordinal position of the current - /// curve. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, GraphPane pane, int pos, float scaleFactor ) - { - if ( _isVisible ) - { - _stick.Draw( g, pane, this, this.BaseAxis( pane ), - this.ValueAxis( pane ), scaleFactor ); - } - } - - /// - /// Draw a legend key entry for this at the specified location - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The struct that specifies the - /// location for the legend key - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, - float scaleFactor ) - { - float pixBase, pixHigh, pixLow, pixOpen, pixClose; - - if ( pane._barSettings.Base == BarBase.X ) - { - pixBase = rect.Left + rect.Width / 2.0F; - pixHigh = rect.Top; - pixLow = rect.Bottom; - pixOpen = pixHigh + rect.Height / 3; - pixClose = pixLow - rect.Height / 3; - } - else - { - pixBase = rect.Top + rect.Height / 2.0F; - pixHigh = rect.Right; - pixLow = rect.Left; - pixOpen = pixHigh - rect.Width / 3; - pixClose = pixLow + rect.Width / 3; - } - - Axis baseAxis = BaseAxis( pane ); - //float halfSize = _stick.GetBarWidth( pane, baseAxis, scaleFactor ); - float halfSize = 2 * scaleFactor; - - using ( Pen pen = new Pen( _stick.Color, _stick._width ) ) - { - _stick.Draw( g, pane, pane._barSettings.Base == BarBase.X, pixBase, pixHigh, - pixLow, pixOpen, pixClose, halfSize, scaleFactor, pen, - _stick.RisingFill, - _stick.RisingBorder, null ); - } - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - override public bool GetCoords( GraphPane pane, int i, out string coords ) - { - coords = string.Empty; - - if ( i < 0 || i >= _points.Count ) - return false; - - Axis valueAxis = ValueAxis( pane ); - Axis baseAxis = BaseAxis( pane ); - - float halfSize = _stick.Size * pane.CalcScaleFactor(); - - PointPair pt = _points[i]; - double date = pt.X; - double high = pt.Y; - double low = pt.Z; - - if ( !pt.IsInvalid3D && - ( date > 0 || !baseAxis._scale.IsLog ) && - ( ( high > 0 && low > 0 ) || !valueAxis._scale.IsLog ) ) - { - float pixBase, pixHigh, pixLow; - pixBase = baseAxis.Scale.Transform( _isOverrideOrdinal, i, date ); - pixHigh = valueAxis.Scale.Transform( _isOverrideOrdinal, i, high ); - pixLow = valueAxis.Scale.Transform( _isOverrideOrdinal, i, low ); - - // Calculate the pixel location for the side of the bar (on the base axis) - float pixSide = pixBase - halfSize; - - // Draw the bar - if ( baseAxis is XAxis || baseAxis is X2Axis ) - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixSide, pixLow, - pixSide + halfSize * 2, pixHigh ); - else - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixLow, pixSide, - pixHigh, pixSide + halfSize * 2 ); - - return true; - } - - return false; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Label.cs b/SDK/ZedGraphs/ZedGraph/Label.cs deleted file mode 100644 index b59a00e..0000000 --- a/SDK/ZedGraphs/ZedGraph/Label.cs +++ /dev/null @@ -1,202 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that handles the data associated with text title and its associated font - /// properties - /// - /// - /// John Champion - /// $Revision: 3.2 $ $Date: 2007-03-11 02:08:16 $ - [Serializable] - public class Label : ICloneable, ISerializable - { - /// - /// private field that stores the text for this label - /// - internal string _text; - /// - /// private field that stores the font properties for this label - /// - internal FontSpec _fontSpec; - /// - /// private field that determines if this label will be displayed. - /// - internal bool _isVisible; - - #region Constructors - - /// - /// Constructor to build an from the text and the - /// associated font properties. - /// - /// The representing the text to be - /// displayed - /// The font family name - /// The size of the font in points and scaled according - /// to the logic. - /// The instance representing the color - /// of the font - /// true for a bold font face - /// true for an italic font face - /// true for an underline font face - public Label( string text, string fontFamily, float fontSize, Color color, bool isBold, - bool isItalic, bool isUnderline ) - { - _text = ( text == null ) ? string.Empty : text; - - _fontSpec = new FontSpec( fontFamily, fontSize, color, isBold, isItalic, isUnderline ); - _isVisible = true; - } - - /// - /// Constructor that builds a from a text - /// and a instance. - /// - /// - /// - public Label( string text, FontSpec fontSpec ) - { - _text = (text == null) ? string.Empty : text; - - _fontSpec = fontSpec; - _isVisible = true; - } - - /// - /// Copy constructor - /// - /// the instance to be copied. - public Label( Label rhs ) - { - if (rhs._text != null) - _text = (string)rhs._text.Clone(); - else - _text = string.Empty; - - _isVisible = rhs._isVisible; - if ( rhs._fontSpec != null ) - _fontSpec = rhs._fontSpec.Clone(); - else - _fontSpec = null; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Label Clone() - { - return new Label( this ); - } - - #endregion - - #region Properties - - /// - /// The text to be displayed - /// - public string Text - { - get { return _text; } - set { _text = value; } - } - - /// - /// A instance representing the font properties - /// for the displayed text. - /// - public FontSpec FontSpec - { - get { return _fontSpec; } - set { _fontSpec = value; } - } - - /// - /// Gets or sets a boolean value that determines whether or not this label will be displayed. - /// - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Label( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _text = info.GetString( "text" ); - _isVisible = info.GetBoolean( "isVisible" ); - _fontSpec = (FontSpec) info.GetValue( "fontSpec", typeof( FontSpec ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "text", _text ); - info.AddValue( "isVisible", _isVisible ); - info.AddValue( "fontSpec", _fontSpec ); - } - #endregion - - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Legend.cs b/SDK/ZedGraphs/ZedGraph/Legend.cs deleted file mode 100644 index 387fb88..0000000 --- a/SDK/ZedGraphs/ZedGraph/Legend.cs +++ /dev/null @@ -1,1038 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// This class encapsulates the chart that is displayed - /// in the - /// - /// - /// John Champion - /// $Revision: 3.41 $ $Date: 2007-08-11 19:24:55 $ - [Serializable] - public class Legend : ICloneable, ISerializable - { - #region private Fields - - /// Private field to hold the bounding rectangle around the legend. - /// This bounding rectangle varies with the number of legend entries, font sizes, - /// etc., and is re-calculated by at each redraw. - /// Use the public readonly property to access this - /// rectangle. - /// - private RectangleF _rect; - /// Private field to hold the legend location setting. This field - /// contains the enum type to specify the area of - /// the graph where the legend will be positioned. Use the public property - /// to access this value. - /// - /// - private LegendPos _position; - /// - /// Private field to enable/disable horizontal stacking of the legend entries. - /// If this value is false, then the legend entries will always be a single column. - /// Use the public property to access this value. - /// - /// - private bool _isHStack; - /// - /// Private field to enable/disable drawing of the entire legend. - /// If this value is false, then the legend will not be drawn. - /// Use the public property to access this value. - /// - private bool _isVisible; - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Fill _fill; - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Border _border; - /// - /// Private field to maintain the class that - /// maintains font attributes for the entries in this legend. Use - /// the property to access this class. - /// - private FontSpec _fontSpec; - /// - /// Private field to maintain the location. This object - /// is only applicable if the property is set to - /// . - /// - private Location _location; - - /// - /// Private temporary field to maintain the number of columns (horizontal stacking) to be used - /// for drawing the . This value is only valid during a draw operation. - /// - private int _hStack; - /// - /// Private temporary field to maintain the width of each column in the - /// . This value is only valid during a draw operation. - /// - private float _legendItemWidth; - /// - /// Private temporary field to maintain the height of each row in the - /// . This value is only valid during a draw operation. - /// - private float _legendItemHeight; - - /// - /// Private field to store the gap between the legend and the chart rectangle. - /// - private float _gap; - - // CJBL - /// - /// Private field to select output order of legend entries. - /// - private bool _isReverse; - - /// - /// Private temporary field to maintain the characteristic "gap" for the legend. - /// This is normal the height of the largest font in the legend. - /// This value is only valid during a draw operation. - /// - private float _tmpSize; - - /// - /// Private field to enable/diable drawing the line and symbol samples in the - /// legend. - /// - private bool _isShowLegendSymbols; - - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - // Default Legend properties - /// - /// The default pen width for the border border. - /// ( property). Units are in pixels. - /// - public static float BorderWidth = 1; - /// - /// The default color for the border border. - /// ( property). - /// - public static Color BorderColor = Color.Black; - /// - /// The default color for the background. - /// ( property). Use of this - /// color depends on the status of the - /// property. - /// - public static Color FillColor = Color.White; - /// - /// The default custom brush for filling in this . - /// - public static Brush FillBrush = null; - /// - /// The default fill mode for the background. - /// - public static FillType FillType = FillType.Brush; - /// - /// The default location for the on the graph - /// ( property). This property is - /// defined as a enumeration. - /// - public static LegendPos Position = LegendPos.Top; - /// - /// The default border mode for the . - /// ( property). true - /// to draw a border around the , - /// false otherwise. - /// - public static bool IsBorderVisible = true; - /// - /// The default display mode for the . - /// ( property). true - /// to show the legend, - /// false to hide it. - /// - public static bool IsVisible = true; - /// - /// The default fill mode for the background - /// ( property). - /// true to fill-in the background with color, - /// false to leave the background transparent. - /// - public static bool IsFilled = true; - /// - /// The default horizontal stacking mode for the - /// ( property). - /// true to allow horizontal legend item stacking, false to allow - /// only vertical legend orientation. - /// - public static bool IsHStack = true; - - /// - /// The default font family for the entries - /// ( property). - /// - public static string FontFamily = "Arial"; - /// - /// The default font size for the entries - /// ( property). Units are - /// in points (1/72 inch). - /// - public static float FontSize = 12; - /// - /// The default font color for the entries - /// ( property). - /// - public static Color FontColor = Color.Black; - /// - /// The default font bold mode for the entries - /// ( property). true - /// for a bold typeface, false otherwise. - /// - public static bool FontBold = false; - /// - /// The default font italic mode for the entries - /// ( property). true - /// for an italic typeface, false otherwise. - /// - public static bool FontItalic = false; - /// - /// The default font underline mode for the entries - /// ( property). true - /// for an underlined typeface, false otherwise. - /// - public static bool FontUnderline = false; - /// - /// The default color for filling in the scale text background - /// (see property). - /// - public static Color FontFillColor = Color.White; - /// - /// The default custom brush for filling in the scale text background - /// (see property). - /// - public static Brush FontFillBrush = null; - /// - /// The default fill mode for filling in the scale text background - /// (see property). - /// - public static FillType FontFillType = FillType.None; - - /// - /// The default gap size between the legend and the . - /// This is the default value of . - /// - public static float Gap = 0.5f; - - /// - /// Default value for the property. - /// - public static bool IsReverse = false; - - /// - /// Default value for the property. - /// - public static bool IsShowLegendSymbols = true; - } - #endregion - - #region Properties - /// - /// Get the bounding rectangle for the in screen coordinates - /// - /// A screen rectangle in pixel units - public RectangleF Rect - { - get { return _rect; } - } - /// - /// Access to the class used to render - /// the entries - /// - /// A reference to a object - /// - /// - /// - /// - /// - /// - public FontSpec FontSpec - { - get { return _fontSpec; } - set - { - if ( value == null ) - throw new ArgumentNullException( "Uninitialized FontSpec in Legend" ); - _fontSpec = value; - } - } - /// - /// Gets or sets a property that shows or hides the entirely - /// - /// true to show the , false to hide it - /// - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - /// - /// The class used to draw the border border around this . - /// - public Border Border - { - get { return _border; } - set { _border = value; } - } - /// - /// Gets or sets the data for this - /// background. - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - - /// - /// Sets or gets a property that allows the items to - /// stack horizontally in addition to the vertical stacking - /// - /// true to allow horizontal stacking, false otherwise - /// - /// - public bool IsHStack - { - get { return _isHStack; } - set { _isHStack = value; } - } - /// - /// Sets or gets the location of the on the - /// using the enum type - /// - /// - public LegendPos Position - { - get { return _position; } - set { _position = value; } - } - /// - /// Gets or sets the data for the . - /// This property is only applicable if is set - /// to . - /// - public Location Location - { - get { return _location; } - set { _location = value; } - } - - /// - /// Gets or sets the gap size between the legend and the . - /// - /// - /// This is expressed as a fraction of the largest scaled character height for any - /// of the fonts used in the legend. Each in the legend can - /// optionally have its own specification. - /// - public float Gap - { - get { return _gap; } - set { _gap = value; } - } - - /// - /// Gets or sets a value that determines if the legend entries are displayed in normal order - /// (matching the order in the , or in reverse order. - /// - public bool IsReverse - { - get { return _isReverse; } - set { _isReverse = value; } - } - - /// - /// Gets or sets a value that determines whether the line and symbol keys will be displayed - /// in the legend. - /// - /// - /// Note: If this value is set to false (so that only the curve label text is displayed - /// with no legend keys), then the color of the font for the legend entry of each curve - /// will automatically be set to match the setting for that curve. - /// You can override this behavior by specifying a specific font to be used for each - /// individual curve with the CurveItem.Label.FontSpec - /// property. - /// - public bool IsShowLegendSymbols - { - get { return _isShowLegendSymbols; } - set { _isShowLegendSymbols = value; } - } - - #endregion - - #region Constructors - /// - /// Default constructor that sets all properties to default - /// values as defined in the class. - /// - public Legend() - { - _position = Default.Position; - _isHStack = Default.IsHStack; - _isVisible = Default.IsVisible; - this.Location = new Location( 0, 0, CoordType.PaneFraction ); - - _fontSpec = new FontSpec( Default.FontFamily, Default.FontSize, - Default.FontColor, Default.FontBold, - Default.FontItalic, Default.FontUnderline, - Default.FontFillColor, Default.FontFillBrush, - Default.FontFillType ); - _fontSpec.Border.IsVisible = false; - - _border = new Border( Default.IsBorderVisible, Default.BorderColor, Default.BorderWidth ); - _fill = new Fill( Default.FillColor, Default.FillBrush, Default.FillType ); - - _gap = Default.Gap; - - _isReverse = Default.IsReverse; - - _isShowLegendSymbols = Default.IsShowLegendSymbols; - } - - /// - /// The Copy Constructor - /// - /// The XAxis object from which to copy - public Legend( Legend rhs ) - { - _rect = rhs.Rect; - _position = rhs.Position; - _isHStack = rhs.IsHStack; - _isVisible = rhs.IsVisible; - - _location = rhs.Location; - _border = rhs.Border.Clone(); - _fill = rhs.Fill.Clone(); - - _fontSpec = rhs.FontSpec.Clone(); - - _gap = rhs._gap; - - _isReverse = rhs._isReverse; - - _isShowLegendSymbols = rhs._isShowLegendSymbols; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Legend Clone() - { - return new Legend( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 12; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Legend( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _position = (LegendPos)info.GetValue( "position", typeof( LegendPos ) ); - _isHStack = info.GetBoolean( "isHStack" ); - _isVisible = info.GetBoolean( "isVisible" ); - _fill = (Fill)info.GetValue( "fill", typeof( Fill ) ); - _border = (Border)info.GetValue( "border", typeof( Border ) ); - _fontSpec = (FontSpec)info.GetValue( "fontSpec", typeof( FontSpec ) ); - _location = (Location)info.GetValue( "location", typeof( Location ) ); - - _gap = info.GetSingle( "gap" ); - - if ( schema >= 11 ) - _isReverse = info.GetBoolean( "isReverse" ); - - if ( schema >= 12 ) - _isShowLegendSymbols = info.GetBoolean( "isShowLegendSymbols" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "position", _position ); - info.AddValue( "isHStack", _isHStack ); - info.AddValue( "isVisible", _isVisible ); - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - info.AddValue( "fontSpec", _fontSpec ); - info.AddValue( "location", _location ); - - info.AddValue( "gap", _gap ); - info.AddValue( "isReverse", _isReverse ); - info.AddValue( "isShowLegendSymbols", _isShowLegendSymbols ); - } - #endregion - - #region Rendering Methods - - /// - /// Render the to the specified device. - /// - /// - /// This method is normally only called by the Draw method - /// of the parent object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void Draw( Graphics g, PaneBase pane, float scaleFactor ) - { - // if the legend is not visible, do nothing - if ( !_isVisible ) - return; - - // Fill the background with the specified color if required - _fill.Draw( g, _rect ); - - PaneList paneList = GetPaneList( pane ); - - float halfGap = _tmpSize / 2.0F; - - // Check for bad data values - if ( _hStack <= 0 ) - _hStack = 1; - if ( _legendItemWidth <= 0 ) - _legendItemWidth = 100; - if ( _legendItemHeight <= 0 ) - _legendItemHeight = _tmpSize; - - //float gap = pane.ScaledGap( scaleFactor ); - - int iEntry = 0; - float x, y; - - // Get a brush for the legend label text - using ( SolidBrush brushB = new SolidBrush( Color.Black ) ) - { - foreach ( GraphPane tmpPane in paneList ) - { - // Loop for each curve in the CurveList collection - //foreach ( CurveItem curve in tmpPane.CurveList ) - int count = tmpPane.CurveList.Count; - for ( int i = 0; i < count; i++ ) - { - CurveItem curve = tmpPane.CurveList[_isReverse ? count - i - 1 : i]; - - if ( curve._label._text != "" && curve._label._isVisible ) - { - // Calculate the x,y (TopLeft) location of the current - // curve legend label - // assuming: - // charHeight/2 for the left margin, plus legendWidth for each - // horizontal column - // legendHeight is the line spacing, with no extra margin above - - x = _rect.Left + halfGap / 2.0F + - ( iEntry % _hStack ) * _legendItemWidth; - y = _rect.Top + (int)( iEntry / _hStack ) * _legendItemHeight; - - // Draw the legend label for the current curve - FontSpec tmpFont = ( curve._label._fontSpec != null ) ? - curve._label._fontSpec : this.FontSpec; - - // This is required because, for long labels, the centering can affect the - // position in GDI+. - tmpFont.StringAlignment = StringAlignment.Near; - - if ( _isShowLegendSymbols ) - { - tmpFont.Draw( g, pane, curve._label._text, - x + 2.5F * _tmpSize, y + _legendItemHeight / 2.0F, - AlignH.Left, AlignV.Center, scaleFactor ); - - RectangleF rect = new RectangleF( x, y + _legendItemHeight / 4.0F, - 2 * _tmpSize, _legendItemHeight / 2.0F ); - curve.DrawLegendKey( g, tmpPane, rect, scaleFactor ); - } - else - { - if ( curve._label._fontSpec == null ) - tmpFont.FontColor = curve.Color; - - tmpFont.Draw(g, pane, curve._label._text, - x + 0.0F * _tmpSize, y + _legendItemHeight / 2.0F, - AlignH.Left, AlignV.Center, scaleFactor); - } - - // maintain a curve count for positioning - iEntry++; - } - } - if ( pane is MasterPane && ( (MasterPane)pane ).IsUniformLegendEntries ) - break; - } - - // Draw a border around the legend if required - if ( iEntry > 0 ) - this.Border.Draw( g, pane, scaleFactor, _rect ); - } - } - - private float GetMaxHeight( PaneList paneList, Graphics g, float scaleFactor ) - { - // Set up some scaled dimensions for calculating sizes and locations - float defaultCharHeight = this.FontSpec.GetHeight( scaleFactor ); - float maxCharHeight = defaultCharHeight; - - // Find the largest charHeight, just in case the curves have individual fonts defined - foreach ( GraphPane tmpPane in paneList ) - { - foreach ( CurveItem curve in tmpPane.CurveList ) - { - if ( curve._label._text != string.Empty && curve._label._isVisible ) - { - float tmpHeight = defaultCharHeight; - if ( curve._label._fontSpec != null ) - tmpHeight = curve._label._fontSpec.GetHeight( scaleFactor ); - - // Account for multiline legend entries - tmpHeight *= curve._label._text.Split( '\n' ).Length; - - if ( tmpHeight > maxCharHeight ) - maxCharHeight = tmpHeight; - } - } - } - - return maxCharHeight; - } - - /// - /// Determine if a mouse point is within the legend, and if so, which legend - /// entry () is nearest. - /// - /// The screen point, in pixel coordinates. - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The index number of the legend - /// entry that is under the mouse point. The object is - /// accessible via CurveList[index]. - /// - /// true if the mouse point is within the bounding - /// box, false otherwise. - /// - public bool FindPoint( PointF mousePt, PaneBase pane, float scaleFactor, out int index ) - { - index = -1; - - if ( _rect.Contains( mousePt ) ) - { - int j = (int)( ( mousePt.Y - _rect.Top ) / _legendItemHeight ); - int i = (int)( ( mousePt.X - _rect.Left - _tmpSize / 2.0f ) / _legendItemWidth ); - if ( i < 0 ) - i = 0; - if ( i >= _hStack ) - i = _hStack - 1; - - int pos = i + j * _hStack; - index = 0; - - PaneList paneList = GetPaneList( pane ); - - foreach ( GraphPane tmpPane in paneList ) - { - foreach ( CurveItem curve in tmpPane.CurveList ) - { - if ( curve._label._isVisible && curve._label._text != string.Empty ) - { - if ( pos == 0 ) - return true; - pos--; - } - index++; - } - } - - return true; - } - else - return false; - } - - private PaneList GetPaneList( PaneBase pane ) - { - // For a single GraphPane, create a PaneList to contain it - // Otherwise, just use the paneList from the MasterPane - PaneList paneList; - - if ( pane is GraphPane ) - { - paneList = new PaneList(); - paneList.Add( (GraphPane)pane ); - } - else - paneList = ( (MasterPane)pane ).PaneList; - - return paneList; - } - - /// - /// Calculate the rectangle (), - /// taking into account the number of required legend - /// entries, and the legend drawing preferences. - /// - /// Adjust the size of the - /// for the parent to accomodate the - /// space required by the legend. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// The rectangle that contains the area bounded by the axes, in pixel units. - /// - /// - public void CalcRect( Graphics g, PaneBase pane, float scaleFactor, - ref RectangleF tChartRect ) - { - // Start with an empty rectangle - _rect = Rectangle.Empty; - _hStack = 1; - _legendItemWidth = 1; - _legendItemHeight = 0; - - RectangleF clientRect = pane.CalcClientRect( g, scaleFactor ); - - // If the legend is invisible, don't do anything - if ( !_isVisible ) - return; - - int nCurve = 0; - - PaneList paneList = GetPaneList( pane ); - _tmpSize = GetMaxHeight( paneList, g, scaleFactor ); - - float halfGap = _tmpSize / 2.0F, - maxWidth = 0, - tmpWidth, - gapPix = _gap * _tmpSize; - - foreach ( GraphPane tmpPane in paneList ) - { - // Loop through each curve in the curve list - // Find the maximum width of the legend labels - //foreach ( CurveItem curve in tmpPane.CurveList ) - //foreach ( CurveItem curve in GetIterator( tmpPane.CurveList, _isReverse ) ) - int count = tmpPane.CurveList.Count; - for ( int i = 0; i < count; i++ ) - { - CurveItem curve = tmpPane.CurveList[_isReverse ? count - i - 1 : i]; - if ( curve._label._text != string.Empty && curve._label._isVisible ) - { - // Calculate the width of the label save the max width - FontSpec tmpFont = ( curve._label._fontSpec != null ) ? - curve._label._fontSpec : this.FontSpec; - - tmpWidth = tmpFont.GetWidth( g, curve._label._text, scaleFactor ); - - if ( tmpWidth > maxWidth ) - maxWidth = tmpWidth; - - // Save the maximum symbol height for line-type curves - if ( curve is LineItem && ( (LineItem)curve ).Symbol.Size > _legendItemHeight ) - _legendItemHeight = ( (LineItem)curve ).Symbol.Size; - - nCurve++; - } - } - - if ( pane is MasterPane && ( (MasterPane)pane ).IsUniformLegendEntries ) - break; - } - - float widthAvail; - - // Is this legend horizontally stacked? - - if ( _isHStack ) - { - // Determine the available space for horizontal stacking - switch ( _position ) - { - // Never stack if the legend is to the right or left - case LegendPos.Right: - case LegendPos.Left: - widthAvail = 0; - break; - - // for the top & bottom, the axis border width is available - case LegendPos.Top: - case LegendPos.TopCenter: - case LegendPos.Bottom: - case LegendPos.BottomCenter: - widthAvail = tChartRect.Width; - break; - - // for the top & bottom flush left, the panerect less margins is available - case LegendPos.TopFlushLeft: - case LegendPos.BottomFlushLeft: - widthAvail = clientRect.Width; - break; - - // for inside the axis area or Float, use 1/2 of the axis border width - case LegendPos.InsideTopRight: - case LegendPos.InsideTopLeft: - case LegendPos.InsideBotRight: - case LegendPos.InsideBotLeft: - case LegendPos.Float: - widthAvail = tChartRect.Width / 2; - break; - - // shouldn't ever happen - default: - widthAvail = 0; - break; - } - - // width of one legend entry - if ( _isShowLegendSymbols ) - _legendItemWidth = 3.0f * _tmpSize + maxWidth; - else - _legendItemWidth = 0.5f * _tmpSize + maxWidth; - - // Calculate the number of columns in the legend - // Normally, the legend is: - // available width / ( max width of any entry + space for line&symbol ) - if ( maxWidth > 0 ) - _hStack = (int)( ( widthAvail - halfGap ) / _legendItemWidth ); - - // You can never have more columns than legend entries - if ( _hStack > nCurve ) - _hStack = nCurve; - - // a saftey check - if ( _hStack == 0 ) - _hStack = 1; - } - else - { - if ( _isShowLegendSymbols ) - _legendItemWidth = 3.0F * _tmpSize + maxWidth; - else - _legendItemWidth = 0.5F * _tmpSize + maxWidth; - } - - // legend is: - // item: space line space text space - // width: wid 4*wid wid maxWid wid - // The symbol is centered on the line - // - // legend begins 3 * wid to the right of the plot rect - // - // The height of the legend is the actual height of the lines of text - // (nCurve * hite) plus wid on top and wid on the bottom - - // total legend width - float totLegWidth = _hStack * _legendItemWidth; - - // The total legend height - _legendItemHeight = _legendItemHeight * (float)scaleFactor + halfGap; - if ( _tmpSize > _legendItemHeight ) - _legendItemHeight = _tmpSize; - float totLegHeight = (float)Math.Ceiling( (double)nCurve / (double)_hStack ) - * _legendItemHeight; - - RectangleF newRect = new RectangleF(); - - // Now calculate the legend rect based on the above determined parameters - // Also, adjust the ChartRect to reflect the space for the legend - if ( nCurve > 0 ) - { - newRect = new RectangleF( 0, 0, totLegWidth, totLegHeight ); - - // The switch statement assigns the left and top edges, and adjusts the ChartRect - // as required. The right and bottom edges are calculated at the bottom of the switch. - switch ( _position ) - { - case LegendPos.Right: - newRect.X = clientRect.Right - totLegWidth; - newRect.Y = tChartRect.Top; - - tChartRect.Width -= totLegWidth + gapPix; - break; - case LegendPos.Top: - newRect.X = tChartRect.Left; - newRect.Y = clientRect.Top; - - tChartRect.Y += totLegHeight + gapPix; - tChartRect.Height -= totLegHeight + gapPix; - break; - case LegendPos.TopFlushLeft: - newRect.X = clientRect.Left; - newRect.Y = clientRect.Top; - - tChartRect.Y += totLegHeight + gapPix * 1.5f; - tChartRect.Height -= totLegHeight + gapPix * 1.5f; - break; - case LegendPos.TopCenter: - newRect.X = tChartRect.Left + ( tChartRect.Width - totLegWidth ) / 2; - newRect.Y = tChartRect.Top; - - tChartRect.Y += totLegHeight + gapPix; - tChartRect.Height -= totLegHeight + gapPix; - break; - case LegendPos.Bottom: - newRect.X = tChartRect.Left; - newRect.Y = clientRect.Bottom - totLegHeight; - - tChartRect.Height -= totLegHeight + gapPix; - break; - case LegendPos.BottomFlushLeft: - newRect.X = clientRect.Left; - newRect.Y = clientRect.Bottom - totLegHeight; - - tChartRect.Height -= totLegHeight + gapPix; - break; - case LegendPos.BottomCenter: - newRect.X = tChartRect.Left + ( tChartRect.Width - totLegWidth ) / 2; - newRect.Y = clientRect.Bottom - totLegHeight; - - tChartRect.Height -= totLegHeight + gapPix; - break; - case LegendPos.Left: - newRect.X = clientRect.Left; - newRect.Y = tChartRect.Top; - - tChartRect.X += totLegWidth + halfGap; - tChartRect.Width -= totLegWidth + gapPix; - break; - case LegendPos.InsideTopRight: - newRect.X = tChartRect.Right - totLegWidth; - newRect.Y = tChartRect.Top; - break; - case LegendPos.InsideTopLeft: - newRect.X = tChartRect.Left; - newRect.Y = tChartRect.Top; - break; - case LegendPos.InsideBotRight: - newRect.X = tChartRect.Right - totLegWidth; - newRect.Y = tChartRect.Bottom - totLegHeight; - break; - case LegendPos.InsideBotLeft: - newRect.X = tChartRect.Left; - newRect.Y = tChartRect.Bottom - totLegHeight; - break; - case LegendPos.Float: - newRect.Location = this.Location.TransformTopLeft( pane, totLegWidth, totLegHeight ); - break; - } - } - - _rect = newRect; - } - - // /// - // /// Private method to the render region that gives the iterator depending on the attribute - // /// - // /// - // /// - // /// - // private IEnumerable GetIterator(CurveList c, bool forward) - // { - // return forward ? c.Forward : c.Backward; - // } - - #endregion - } -} - diff --git a/SDK/ZedGraphs/ZedGraph/Line.cs b/SDK/ZedGraphs/ZedGraph/Line.cs deleted file mode 100644 index 238139d..0000000 --- a/SDK/ZedGraphs/ZedGraph/Line.cs +++ /dev/null @@ -1,1455 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class representing all the characteristics of the Line - /// segments that make up a curve on the graph. - /// - /// - /// John Champion - /// $Revision: 3.50 $ $Date: 2007-12-30 23:27:39 $ - [Serializable] - public class Line : LineBase, ICloneable, ISerializable - { - - #region Fields - - /// - /// Private field that stores the smoothing flag for this - /// . Use the public - /// property to access this value. - /// - private bool _isSmooth; - /// - /// Private field that stores the smoothing tension - /// for this . Use the public property - /// to access this value. - /// - /// A floating point value indicating the level of smoothing. - /// 0.0F for no smoothing, 1.0F for lots of smoothing, >1.0 for odd - /// smoothing. - /// - /// - /// - private float _smoothTension; - /// - /// Private field that stores the for this - /// . Use the public - /// property to access this value. - /// - private StepType _stepType; - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Fill _fill; - /// - /// Private field that determines if this will be drawn with - /// optimizations enabled. Use the public - /// property to access this value. - /// - private bool _isOptimizedDraw; - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - new public struct Default - { - // Default Line properties - /// - /// The default color for curves (line segments connecting the points). - /// This is the default value for the property. - /// - public static Color Color = Color.Red; - /// - /// The default color for filling in the area under the curve - /// ( property). - /// - public static Color FillColor = Color.Red; - /// - /// The default custom brush for filling in the area under the curve - /// ( property). - /// - public static Brush FillBrush = null; - /// - /// The default fill mode for the curve ( property). - /// - public static FillType FillType = FillType.None; - - /// - /// The default value for the - /// property. - /// - public static bool IsSmooth = false; - /// - /// The default value for the property. - /// - public static float SmoothTension = 0.5F; - /// - /// The default value for the property. - /// - public static bool IsOptimizedDraw = false; - - /// - /// Default value for the curve type property - /// (). This determines if the curve - /// will be drawn by directly connecting the points from the - /// data collection, - /// or if the curve will be a "stair-step" in which the points are - /// connected by a series of horizontal and vertical lines that - /// represent discrete, staticant values. Note that the values can - /// be forward oriented ForwardStep () or - /// rearward oriented RearwardStep. - /// That is, the points are defined at the beginning or end - /// of the staticant value for which they apply, respectively. - /// - /// enum value - public static StepType StepType = StepType.NonStep; - } - - #endregion - - #region Properties - - /// - /// Gets or sets a property that determines if this - /// will be drawn smooth. The "smoothness" is controlled by - /// the property. - /// - /// true to smooth the line, false to just connect the dots - /// with linear segments - /// - /// - /// - public bool IsSmooth - { - get { return _isSmooth; } - set { _isSmooth = value; } - } - /// - /// Gets or sets a property that determines the smoothing tension - /// for this . This property is only used if - /// is true. A tension value 0.0 will just - /// draw ordinary line segments like an unsmoothed line. A tension - /// value of 1.0 will be smooth. Values greater than 1.0 will generally - /// give odd results. - /// - /// A floating point value indicating the level of smoothing. - /// 0.0F for no smoothing, 1.0F for lots of smoothing, >1.0 for odd - /// smoothing. - /// - /// - /// - public float SmoothTension - { - get { return _smoothTension; } - set { _smoothTension = value; } - } - /// - /// Determines if the will be drawn by directly connecting the - /// points from the data collection, - /// or if the curve will be a "stair-step" in which the points are - /// connected by a series of horizontal and vertical lines that - /// represent discrete, constant values. Note that the values can - /// be forward oriented ForwardStep () or - /// rearward oriented RearwardStep. - /// That is, the points are defined at the beginning or end - /// of the constant value for which they apply, respectively. - /// The property is ignored for lines - /// that have set to true. - /// - /// enum value - /// - public StepType StepType - { - get { return _stepType; } - set { _stepType = value; } - } - - /// - /// Gets or sets the data for this - /// . - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - - /// - /// Gets or sets a boolean value that determines if this will be drawn with - /// optimizations enabled. - /// - /// - /// Normally, the optimizations can be used without a problem, especially if the data - /// are sorted. The optimizations are particularly helpful with very large datasets. - /// However, if the data are very discontinuous (for example, a curve that doubles back - /// on itself), then the optimizations can cause drawing artifacts in the form of - /// missing line segments. The default option for this mode is false, so you must - /// explicitly enable it for each LineItem.Line. - /// Also note that, even if the optimizations are enabled explicitly, no actual - /// optimization will be done for datasets of less than 1000 points. - /// - public bool IsOptimizedDraw - { - get { return _isOptimizedDraw; } - set { _isOptimizedDraw = value; } - } - - #endregion - - #region Constructors - - /// - /// Default constructor that sets all properties to default - /// values as defined in the class. - /// - public Line() - : this( Color.Empty ) - { - } - - /// - /// Constructor that sets the color property to the specified value, and sets - /// the remaining properties to default - /// values as defined in the class. - /// - /// The color to assign to this new Line object - public Line( Color color ) - { - _color = color.IsEmpty ? Default.Color : color; - _stepType = Default.StepType; - _isSmooth = Default.IsSmooth; - _smoothTension = Default.SmoothTension; - _fill = new Fill( Default.FillColor, Default.FillBrush, Default.FillType ); - _isOptimizedDraw = Default.IsOptimizedDraw; - } - - /// - /// The Copy Constructor - /// - /// The Line object from which to copy - public Line( Line rhs ) : base( rhs ) - { - _color = rhs._color; - _stepType = rhs._stepType; - _isSmooth = rhs._isSmooth; - _smoothTension = rhs._smoothTension; - _fill = rhs._fill.Clone(); - _isOptimizedDraw = rhs._isOptimizedDraw; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Line Clone() - { - return new Line( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 14; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Line( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - //if ( sch >= 14 ) - // _color = (Color) info.GetValue( "color", typeof( Color ) ); - _stepType = (StepType)info.GetValue( "stepType", typeof( StepType ) ); - _isSmooth = info.GetBoolean( "isSmooth" ); - _smoothTension = info.GetSingle( "smoothTension" ); - _fill = (Fill)info.GetValue( "fill", typeof( Fill ) ); - - if ( sch >= 13 ) - _isOptimizedDraw = info.GetBoolean( "isOptimizedDraw" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema", schema ); - //info.AddValue( "color", _color ); - info.AddValue( "stepType", _stepType ); - info.AddValue( "isSmooth", _isSmooth ); - info.AddValue( "smoothTension", _smoothTension ); - info.AddValue( "fill", _fill ); - - info.AddValue( "isOptimizedDraw", _isOptimizedDraw ); - } - - #endregion - - #region Rendering Methods - - /// - /// Do all rendering associated with this to the specified - /// device. This method is normally only - /// called by the Draw method of the parent object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A representing this - /// curve. - public void Draw( Graphics g, GraphPane pane, CurveItem curve, float scaleFactor ) - { - // If the line is being shown, draw it - if ( this.IsVisible ) - { - //How to handle fill vs nofill? - //if ( isSelected ) - // GraphPane.Default.SelectedLine. - - SmoothingMode sModeSave = g.SmoothingMode; - if ( _isAntiAlias ) - g.SmoothingMode = SmoothingMode.HighQuality; - - if ( curve is StickItem ) - DrawSticks( g, pane, curve, scaleFactor ); - else if ( this.IsSmooth || this.Fill.IsVisible ) - DrawSmoothFilledCurve( g, pane, curve, scaleFactor ); - else - DrawCurve( g, pane, curve, scaleFactor ); - - g.SmoothingMode = sModeSave; - } - } - - /// - /// Render a single segment to the specified - /// device. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The x position of the starting point that defines the - /// line segment in screen pixel units - /// The y position of the starting point that defines the - /// line segment in screen pixel units - /// The x position of the ending point that defines the - /// line segment in screen pixel units - /// The y position of the ending point that defines the - /// line segment in screen pixel units - public void DrawSegment( Graphics g, GraphPane pane, float x1, float y1, - float x2, float y2, float scaleFactor ) - { - if ( _isVisible && !this.Color.IsEmpty ) - { - using ( Pen pen = GetPen( pane, scaleFactor ) ) - { - g.DrawLine( pen, x1, y1, x2, y2 ); - } - } - } - - /// - /// Render the 's as vertical sticks (from a ) to - /// the specified device. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A representing this - /// curve. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void DrawSticks( Graphics g, GraphPane pane, CurveItem curve, float scaleFactor ) - { - Line source = this; - if ( curve.IsSelected ) - source = Selection.Line; - - Axis yAxis = curve.GetYAxis( pane ); - Axis xAxis = curve.GetXAxis( pane ); - - float basePix = yAxis.Scale.Transform( 0.0 ); - using ( Pen pen = source.GetPen( pane, scaleFactor ) ) - { - for ( int i = 0; i < curve.Points.Count; i++ ) - { - PointPair pt = curve.Points[i]; - - if ( pt.X != PointPair.Missing && - pt.Y != PointPair.Missing && - !System.Double.IsNaN( pt.X ) && - !System.Double.IsNaN( pt.Y ) && - !System.Double.IsInfinity( pt.X ) && - !System.Double.IsInfinity( pt.Y ) && - ( !xAxis._scale.IsLog || pt.X > 0.0 ) && - ( !yAxis._scale.IsLog || pt.Y > 0.0 ) ) - { - float pixY = yAxis.Scale.Transform( curve.IsOverrideOrdinal, i, pt.Y ); - float pixX = xAxis.Scale.Transform( curve.IsOverrideOrdinal, i, pt.X ); - - if ( pixX >= pane.Chart._rect.Left && pixX <= pane.Chart._rect.Right ) - { - if ( pixY > pane.Chart._rect.Bottom ) - pixY = pane.Chart._rect.Bottom; - if ( pixY < pane.Chart._rect.Top ) - pixY = pane.Chart._rect.Top; - - if ( !curve.IsSelected && this._gradientFill.IsGradientValueType ) - { - using ( Pen tPen = GetPen( pane, scaleFactor, pt ) ) - g.DrawLine( tPen, pixX, pixY, pixX, basePix ); - } - else - g.DrawLine( pen, pixX, pixY, pixX, basePix ); - - } - } - } - } - } - - /// - /// Draw the this to the specified - /// device using the specified smoothing property (). - /// The routine draws the line segments and the area fill (if any, see ; - /// the symbols are drawn by the method. This method - /// is normally only called by the Draw method of the - /// object. Note that the property - /// is ignored for smooth lines (e.g., when is true). - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A representing this - /// curve. - public void DrawSmoothFilledCurve( Graphics g, GraphPane pane, - CurveItem curve, float scaleFactor ) - { - Line source = this; - if ( curve.IsSelected ) - source = Selection.Line; - - PointF[] arrPoints; - int count; - IPointList points = curve.Points; - - if ( this.IsVisible && !this.Color.IsEmpty && points != null && - BuildPointsArray( pane, curve, out arrPoints, out count ) && - count > 2 ) - { - float tension = _isSmooth ? _smoothTension : 0f; - - // Fill the curve if needed - if ( this.Fill.IsVisible ) - { - Axis yAxis = curve.GetYAxis( pane ); - - using ( GraphicsPath path = new GraphicsPath( FillMode.Winding ) ) - { - path.AddCurve( arrPoints, 0, count - 2, tension ); - - double yMin = yAxis._scale._min < 0 ? 0.0 : yAxis._scale._min; - CloseCurve( pane, curve, arrPoints, count, yMin, path ); - - RectangleF rect = path.GetBounds(); - using ( Brush brush = source._fill.MakeBrush( rect ) ) - { - if ( pane.LineType == LineType.Stack && yAxis.Scale._min < 0 && - this.IsFirstLine( pane, curve ) ) - { - float zeroPix = yAxis.Scale.Transform( 0 ); - RectangleF tRect = pane.Chart._rect; - tRect.Height = zeroPix - tRect.Top; - if ( tRect.Height > 0 ) - { - Region reg = g.Clip; - g.SetClip( tRect ); - g.FillPath( brush, path ); - g.SetClip( pane.Chart._rect ); - } - } - else - g.FillPath( brush, path ); - //brush.Dispose(); - } - - // restore the zero line if needed (since the fill tends to cover it up) - yAxis.FixZeroLine( g, pane, scaleFactor, rect.Left, rect.Right ); - } - } - - // If it's a smooth curve, go ahead and render the path. Otherwise, use the - // standard drawcurve method just in case there are missing values. - if ( _isSmooth ) - { - using ( Pen pen = GetPen( pane, scaleFactor ) ) - { - // Stroke the curve - g.DrawCurve( pen, arrPoints, 0, count - 2, tension ); - - //pen.Dispose(); - } - } - else - DrawCurve( g, pane, curve, scaleFactor ); - } - } - - private bool IsFirstLine( GraphPane pane, CurveItem curve ) - { - CurveList curveList = pane.CurveList; - - for ( int j = 0; j < curveList.Count; j++ ) - { - CurveItem tCurve = curveList[j]; - - if ( tCurve is LineItem && tCurve.IsY2Axis == curve.IsY2Axis && - tCurve.YAxisIndex == curve.YAxisIndex ) - { - return tCurve == curve; - } - } - - return false; - } - - /// - /// Draw the this to the specified - /// device. The format (stair-step or line) of the curve is - /// defined by the property. The routine - /// only draws the line segments; the symbols are drawn by the - /// method. This method - /// is normally only called by the Draw method of the - /// object - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A representing this - /// curve. - public void DrawCurve( Graphics g, GraphPane pane, - CurveItem curve, float scaleFactor ) - { - Line source = this; - if ( curve.IsSelected ) - source = Selection.Line; - - // switch to int to optimize drawing speed (per Dale-a-b) - int tmpX, tmpY, - lastX = int.MaxValue, - lastY = int.MaxValue; - - double curX, curY, lowVal; - PointPair curPt, lastPt = new PointPair(); - - bool lastBad = true; - IPointList points = curve.Points; - ValueHandler valueHandler = new ValueHandler( pane, false ); - Axis yAxis = curve.GetYAxis( pane ); - Axis xAxis = curve.GetXAxis( pane ); - - bool xIsLog = xAxis._scale.IsLog; - bool yIsLog = yAxis._scale.IsLog; - - // switch to int to optimize drawing speed (per Dale-a-b) - int minX = (int)pane.Chart.Rect.Left; - int maxX = (int)pane.Chart.Rect.Right; - int minY = (int)pane.Chart.Rect.Top; - int maxY = (int)pane.Chart.Rect.Bottom; - - using ( Pen pen = source.GetPen( pane, scaleFactor ) ) - { - if ( points != null && !_color.IsEmpty && this.IsVisible ) - { - //bool lastOut = false; - bool isOut; - - bool isOptDraw = _isOptimizedDraw && points.Count > 1000; - - // (Dale-a-b) we'll set an element to true when it has been drawn - bool[,] isPixelDrawn = null; - - if ( isOptDraw ) - isPixelDrawn = new bool[maxX + 1, maxY + 1]; - - // Loop over each point in the curve - for ( int i = 0; i < points.Count; i++ ) - { - curPt = points[i]; - if ( pane.LineType == LineType.Stack ) - { - if ( !valueHandler.GetValues( curve, i, out curX, out lowVal, out curY ) ) - { - curX = PointPair.Missing; - curY = PointPair.Missing; - } - } - else - { - curX = curPt.X; - curY = curPt.Y; - } - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - if ( curX == PointPair.Missing || - curY == PointPair.Missing || - System.Double.IsNaN( curX ) || - System.Double.IsNaN( curY ) || - System.Double.IsInfinity( curX ) || - System.Double.IsInfinity( curY ) || - ( xIsLog && curX <= 0.0 ) || - ( yIsLog && curY <= 0.0 ) ) - { - // If the point is invalid, then make a linebreak only if IsIgnoreMissing is false - // LastX and LastY are always the last valid point, so this works out - lastBad = lastBad || !pane.IsIgnoreMissing; - isOut = true; - } - else - { - // Transform the current point from user scale units to - // screen coordinates - tmpX = (int) xAxis.Scale.Transform( curve.IsOverrideOrdinal, i, curX ); - tmpY = (int) yAxis.Scale.Transform( curve.IsOverrideOrdinal, i, curY ); - - // Maintain an array of "used" pixel locations to avoid duplicate drawing operations - // contributed by Dale-a-b - if ( isOptDraw && tmpX >= minX && tmpX <= maxX && - tmpY >= minY && tmpY <= maxY ) // guard against the zoom-in case - { - if ( isPixelDrawn[tmpX, tmpY] ) - continue; - isPixelDrawn[tmpX, tmpY] = true; - } - - isOut = ( tmpX < minX && lastX < minX ) || ( tmpX > maxX && lastX > maxX ) || - ( tmpY < minY && lastY < minY ) || ( tmpY > maxY && lastY > maxY ); - - if ( !lastBad ) - { - try - { - // GDI+ plots the data wrong and/or throws an exception for - // outrageous coordinates, so we do a sanity check here - if ( lastX > 5000000 || lastX < -5000000 || - lastY > 5000000 || lastY < -5000000 || - tmpX > 5000000 || tmpX < -5000000 || - tmpY > 5000000 || tmpY < -5000000 ) - InterpolatePoint( g, pane, curve, lastPt, scaleFactor, pen, - lastX, lastY, tmpX, tmpY ); - else if ( !isOut ) - { - if ( !curve.IsSelected && this._gradientFill.IsGradientValueType ) - { - using ( Pen tPen = GetPen( pane, scaleFactor, lastPt ) ) - { - if ( this.StepType == StepType.NonStep ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardStep ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, lastY ); - g.DrawLine( tPen, tmpX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.RearwardStep ) - { - g.DrawLine( tPen, lastX, lastY, lastX, tmpY ); - g.DrawLine( tPen, lastX, tmpY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardSegment ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, lastY ); - } - else - { - g.DrawLine( tPen, lastX, tmpY, tmpX, tmpY ); - } - } - } - else - { - if ( this.StepType == StepType.NonStep ) - { - g.DrawLine( pen, lastX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardStep ) - { - g.DrawLine( pen, lastX, lastY, tmpX, lastY ); - g.DrawLine( pen, tmpX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.RearwardStep ) - { - g.DrawLine( pen, lastX, lastY, lastX, tmpY ); - g.DrawLine( pen, lastX, tmpY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardSegment ) - { - g.DrawLine( pen, lastX, lastY, tmpX, lastY ); - } - else if ( this.StepType == StepType.RearwardSegment ) - { - g.DrawLine( pen, lastX, tmpY, tmpX, tmpY ); - } - } - } - - } - catch - { - InterpolatePoint( g, pane, curve, lastPt, scaleFactor, pen, - lastX, lastY, tmpX, tmpY ); - } - - } - - lastPt = curPt; - lastX = tmpX; - lastY = tmpY; - lastBad = false; - //lastOut = isOut; - } - } - } - } - } - - /// - /// Draw the this to the specified - /// device. The format (stair-step or line) of the curve is - /// defined by the property. The routine - /// only draws the line segments; the symbols are drawn by the - /// method. This method - /// is normally only called by the Draw method of the - /// object - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A representing this - /// curve. - public void DrawCurveOriginal( Graphics g, GraphPane pane, - CurveItem curve, float scaleFactor ) - { - Line source = this; - if ( curve.IsSelected ) - source = Selection.Line; - - float tmpX, tmpY, - lastX = float.MaxValue, - lastY = float.MaxValue; - double curX, curY, lowVal; - PointPair curPt, lastPt = new PointPair(); - - bool lastBad = true; - IPointList points = curve.Points; - ValueHandler valueHandler = new ValueHandler( pane, false ); - Axis yAxis = curve.GetYAxis( pane ); - Axis xAxis = curve.GetXAxis( pane ); - - bool xIsLog = xAxis._scale.IsLog; - bool yIsLog = yAxis._scale.IsLog; - - float minX = pane.Chart.Rect.Left; - float maxX = pane.Chart.Rect.Right; - float minY = pane.Chart.Rect.Top; - float maxY = pane.Chart.Rect.Bottom; - - using ( Pen pen = source.GetPen( pane, scaleFactor ) ) - { - if ( points != null && !_color.IsEmpty && this.IsVisible ) - { - //bool lastOut = false; - bool isOut; - - // Loop over each point in the curve - for ( int i = 0; i < points.Count; i++ ) - { - curPt = points[i]; - if ( pane.LineType == LineType.Stack ) - { - if ( !valueHandler.GetValues( curve, i, out curX, out lowVal, out curY ) ) - { - curX = PointPair.Missing; - curY = PointPair.Missing; - } - } - else - { - curX = curPt.X; - curY = curPt.Y; - } - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - if ( curX == PointPair.Missing || - curY == PointPair.Missing || - System.Double.IsNaN( curX ) || - System.Double.IsNaN( curY ) || - System.Double.IsInfinity( curX ) || - System.Double.IsInfinity( curY ) || - ( xIsLog && curX <= 0.0 ) || - ( yIsLog && curY <= 0.0 ) ) - { - // If the point is invalid, then make a linebreak only if IsIgnoreMissing is false - // LastX and LastY are always the last valid point, so this works out - lastBad = lastBad || !pane.IsIgnoreMissing; - isOut = true; - } - else - { - // Transform the current point from user scale units to - // screen coordinates - tmpX = xAxis.Scale.Transform( curve.IsOverrideOrdinal, i, curX ); - tmpY = yAxis.Scale.Transform( curve.IsOverrideOrdinal, i, curY ); - isOut = ( tmpX < minX && lastX < minX ) || ( tmpX > maxX && lastX > maxX ) || - ( tmpY < minY && lastY < minY ) || ( tmpY > maxY && lastY > maxY ); - - if ( !lastBad ) - { - try - { - // GDI+ plots the data wrong and/or throws an exception for - // outrageous coordinates, so we do a sanity check here - if ( lastX > 5000000 || lastX < -5000000 || - lastY > 5000000 || lastY < -5000000 || - tmpX > 5000000 || tmpX < -5000000 || - tmpY > 5000000 || tmpY < -5000000 ) - InterpolatePoint( g, pane, curve, lastPt, scaleFactor, pen, - lastX, lastY, tmpX, tmpY ); - else if ( !isOut ) - { - if ( !curve.IsSelected && this._gradientFill.IsGradientValueType ) - { - using ( Pen tPen = GetPen( pane, scaleFactor, lastPt ) ) - { - if ( this.StepType == StepType.NonStep ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardStep ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, lastY ); - g.DrawLine( tPen, tmpX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.RearwardStep ) - { - g.DrawLine( tPen, lastX, lastY, lastX, tmpY ); - g.DrawLine( tPen, lastX, tmpY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardSegment ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, lastY ); - } - else - { - g.DrawLine( tPen, lastX, tmpY, tmpX, tmpY ); - } - } - } - else - { - if ( this.StepType == StepType.NonStep ) - { - g.DrawLine( pen, lastX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardStep ) - { - g.DrawLine( pen, lastX, lastY, tmpX, lastY ); - g.DrawLine( pen, tmpX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.RearwardStep ) - { - g.DrawLine( pen, lastX, lastY, lastX, tmpY ); - g.DrawLine( pen, lastX, tmpY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardSegment ) - { - g.DrawLine( pen, lastX, lastY, tmpX, lastY ); - } - else if ( this.StepType == StepType.RearwardSegment ) - { - g.DrawLine( pen, lastX, tmpY, tmpX, tmpY ); - } - } - } - - } - catch - { - InterpolatePoint( g, pane, curve, lastPt, scaleFactor, pen, - lastX, lastY, tmpX, tmpY ); - } - - } - - lastPt = curPt; - lastX = tmpX; - lastY = tmpY; - lastBad = false; - //lastOut = isOut; - } - } - } - } - } - - /// - /// This method just handles the case where one or more of the coordinates are outrageous, - /// or GDI+ threw an exception. This method attempts to correct the outrageous coordinates by - /// interpolating them to a point (along the original line) that lies at the edge of the ChartRect - /// so that GDI+ will handle it properly. GDI+ will throw an exception, or just plot the data - /// incorrectly if the coordinates are too large (empirically, this appears to be when the - /// coordinate value is greater than 5,000,000 or less than -5,000,000). Although you typically - /// would not see coordinates like this, if you repeatedly zoom in on a ZedGraphControl, eventually - /// all your points will be way outside the bounds of the plot. - /// - private void InterpolatePoint( Graphics g, GraphPane pane, CurveItem curve, PointPair lastPt, - float scaleFactor, Pen pen, float lastX, float lastY, float tmpX, float tmpY ) - { - try - { - RectangleF chartRect = pane.Chart._rect; - // try to interpolate values - bool lastIn = chartRect.Contains( lastX, lastY ); - bool curIn = chartRect.Contains( tmpX, tmpY ); - - // If both points are outside the ChartRect, make a new point that is on the LastX/Y - // side of the ChartRect, and fall through to the code that handles lastIn == true - if ( !lastIn ) - { - float newX, newY; - - if ( Math.Abs( lastX ) > Math.Abs( lastY ) ) - { - newX = lastX < 0 ? chartRect.Left : chartRect.Right; - newY = lastY + ( tmpY - lastY ) * ( newX - lastX ) / ( tmpX - lastX ); - } - else - { - newY = lastY < 0 ? chartRect.Top : chartRect.Bottom; - newX = lastX + ( tmpX - lastX ) * ( newY - lastY ) / ( tmpY - lastY ); - } - - lastX = newX; - lastY = newY; - } - - if ( !curIn ) - { - float newX, newY; - - if ( Math.Abs( tmpX ) > Math.Abs( tmpY ) ) - { - newX = tmpX < 0 ? chartRect.Left : chartRect.Right; - newY = tmpY + ( lastY - tmpY ) * ( newX - tmpX ) / ( lastX - tmpX ); - } - else - { - newY = tmpY < 0 ? chartRect.Top : chartRect.Bottom; - newX = tmpX + ( lastX - tmpX ) * ( newY - tmpY ) / ( lastY - tmpY ); - } - - tmpX = newX; - tmpY = newY; - } - - /* - if ( this.StepType == StepType.ForwardStep ) - { - g.DrawLine( pen, lastX, lastY, tmpX, lastY ); - g.DrawLine( pen, tmpX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.RearwardStep ) - { - g.DrawLine( pen, lastX, lastY, lastX, tmpY ); - g.DrawLine( pen, lastX, tmpY, tmpX, tmpY ); - } - else // non-step - g.DrawLine( pen, lastX, lastY, tmpX, tmpY ); - */ - if ( !curve.IsSelected && this._gradientFill.IsGradientValueType ) - { - using ( Pen tPen = GetPen( pane, scaleFactor, lastPt ) ) - { - if ( this.StepType == StepType.NonStep ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardStep ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, lastY ); - g.DrawLine( tPen, tmpX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.RearwardStep ) - { - g.DrawLine( tPen, lastX, lastY, lastX, tmpY ); - g.DrawLine( tPen, lastX, tmpY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardSegment ) - { - g.DrawLine( tPen, lastX, lastY, tmpX, lastY ); - } - else - { - g.DrawLine( tPen, lastX, tmpY, tmpX, tmpY ); - } - } - } - else - { - if ( this.StepType == StepType.NonStep ) - { - g.DrawLine( pen, lastX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardStep ) - { - g.DrawLine( pen, lastX, lastY, tmpX, lastY ); - g.DrawLine( pen, tmpX, lastY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.RearwardStep ) - { - g.DrawLine( pen, lastX, lastY, lastX, tmpY ); - g.DrawLine( pen, lastX, tmpY, tmpX, tmpY ); - } - else if ( this.StepType == StepType.ForwardSegment ) - { - g.DrawLine( pen, lastX, lastY, tmpX, lastY ); - } - else if ( this.StepType == StepType.RearwardSegment ) - { - g.DrawLine( pen, lastX, tmpY, tmpX, tmpY ); - } - } - - } - - catch { } - } - - /// - /// Build an array of values (pixel coordinates) that represents - /// the current curve. Note that this drawing routine ignores - /// values, but it does not "break" the line to indicate values are missing. - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// A representing this - /// curve. - /// An array of values in pixel - /// coordinates representing the current curve. - /// The number of points contained in the "arrPoints" - /// parameter. - /// true for a successful points array build, false for data problems - public bool BuildPointsArray( GraphPane pane, CurveItem curve, - out PointF[] arrPoints, out int count ) - { - arrPoints = null; - count = 0; - IPointList points = curve.Points; - - if ( this.IsVisible && !this.Color.IsEmpty && points != null ) - { - int index = 0; - float curX, curY, - lastX = 0, - lastY = 0; - double x, y, lowVal; - ValueHandler valueHandler = new ValueHandler( pane, false ); - - // Step type plots get twice as many points. Always add three points so there is - // room to close out the curve for area fills. - arrPoints = new PointF[( _stepType == ZedGraph.StepType.NonStep ? 1 : 2 ) * - points.Count + 1]; - - // Loop over all points in the curve - for ( int i = 0; i < points.Count; i++ ) - { - // make sure that the current point is valid - if ( !points[i].IsInvalid ) - { - // Get the user scale values for the current point - // use the valueHandler only for stacked types - if ( pane.LineType == LineType.Stack ) - { - valueHandler.GetValues( curve, i, out x, out lowVal, out y ); - } - // otherwise, just access the values directly. Avoiding the valueHandler for - // non-stacked types is an optimization to minimize overhead in case there are - // a large number of points. - else - { - x = points[i].X; - y = points[i].Y; - } - - if ( x == PointPair.Missing || y == PointPair.Missing ) - continue; - - // Transform the user scale values to pixel locations - Axis xAxis = curve.GetXAxis( pane ); - curX = xAxis.Scale.Transform( curve.IsOverrideOrdinal, i, x ); - Axis yAxis = curve.GetYAxis( pane ); - curY = yAxis.Scale.Transform( curve.IsOverrideOrdinal, i, y ); - - if ( curX < -1000000 || curY < -1000000 || curX > 1000000 || curY > 1000000 ) - continue; - - // Add the pixel value pair into the points array - // Two points are added for step type curves - // ignore step-type setting for smooth curves - if ( _isSmooth || index == 0 || this.StepType == StepType.NonStep ) - { - arrPoints[index].X = curX; - arrPoints[index].Y = curY; - } - else if ( this.StepType == StepType.ForwardStep || - this.StepType == StepType.ForwardSegment ) - { - arrPoints[index].X = curX; - arrPoints[index].Y = lastY; - index++; - arrPoints[index].X = curX; - arrPoints[index].Y = curY; - } - else if ( this.StepType == StepType.RearwardStep || - this.StepType == StepType.RearwardSegment ) - { - arrPoints[index].X = lastX; - arrPoints[index].Y = curY; - index++; - arrPoints[index].X = curX; - arrPoints[index].Y = curY; - } - - lastX = curX; - lastY = curY; - index++; - - } - - } - - // Make sure there is at least one valid point - if ( index == 0 ) - return false; - - // Add an extra point at the end, since the smoothing algorithm requires it - arrPoints[index] = arrPoints[index - 1]; - index++; - - count = index; - return true; - } - else - { - return false; - } - } - - /// - /// Build an array of values (pixel coordinates) that represents - /// the low values for the current curve. - /// - /// Note that this drawing routine ignores - /// values, but it does not "break" the line to indicate values are missing. - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// A representing this - /// curve. - /// An array of values in pixel - /// coordinates representing the current curve. - /// The number of points contained in the "arrPoints" - /// parameter. - /// true for a successful points array build, false for data problems - public bool BuildLowPointsArray( GraphPane pane, CurveItem curve, - out PointF[] arrPoints, out int count ) - { - arrPoints = null; - count = 0; - IPointList points = curve.Points; - - if ( this.IsVisible && !this.Color.IsEmpty && points != null ) - { - int index = 0; - float curX, curY, - lastX = 0, - lastY = 0; - double x, y, hiVal; - ValueHandler valueHandler = new ValueHandler( pane, false ); - - // Step type plots get twice as many points. Always add three points so there is - // room to close out the curve for area fills. - arrPoints = new PointF[( _stepType == ZedGraph.StepType.NonStep ? 1 : 2 ) * - ( pane.LineType == LineType.Stack ? 2 : 1 ) * - points.Count + 1]; - - // Loop backwards over all points in the curve - // In this case an array of points was already built forward by BuildPointsArray(). - // This time we build backwards to complete a loop around the area between two curves. - for ( int i = points.Count - 1; i >= 0; i-- ) - { - // Make sure the current point is valid - if ( !points[i].IsInvalid ) - { - // Get the user scale values for the current point - valueHandler.GetValues( curve, i, out x, out y, out hiVal ); - - if ( x == PointPair.Missing || y == PointPair.Missing ) - continue; - - // Transform the user scale values to pixel locations - Axis xAxis = curve.GetXAxis( pane ); - curX = xAxis.Scale.Transform( curve.IsOverrideOrdinal, i, x ); - Axis yAxis = curve.GetYAxis( pane ); - curY = yAxis.Scale.Transform( curve.IsOverrideOrdinal, i, y ); - - // Add the pixel value pair into the points array - // Two points are added for step type curves - // ignore step-type setting for smooth curves - if ( _isSmooth || index == 0 || this.StepType == StepType.NonStep ) - { - arrPoints[index].X = curX; - arrPoints[index].Y = curY; - } - else if ( this.StepType == StepType.ForwardStep ) - { - arrPoints[index].X = curX; - arrPoints[index].Y = lastY; - index++; - arrPoints[index].X = curX; - arrPoints[index].Y = curY; - } - else if ( this.StepType == StepType.RearwardStep ) - { - arrPoints[index].X = lastX; - arrPoints[index].Y = curY; - index++; - arrPoints[index].X = curX; - arrPoints[index].Y = curY; - } - - lastX = curX; - lastY = curY; - index++; - - } - - } - - // Make sure there is at least one valid point - if ( index == 0 ) - return false; - - // Add an extra point at the end, since the smoothing algorithm requires it - arrPoints[index] = arrPoints[index - 1]; - index++; - - count = index; - return true; - } - else - { - return false; - } - } - - /// - /// Close off a that defines a curve - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// A representing this - /// curve. - /// An array of values in screen pixel - /// coordinates representing the current curve. - /// The number of points contained in the "arrPoints" - /// parameter. - /// The Y axis value location where the X axis crosses. - /// The class that represents the curve. - public void CloseCurve( GraphPane pane, CurveItem curve, PointF[] arrPoints, - int count, double yMin, GraphicsPath path ) - { - // For non-stacked lines, the fill area is just the area between the curve and the X axis - if ( pane.LineType != LineType.Stack ) - { - // Determine the current value for the bottom of the curve (usually the Y value where - // the X axis crosses) - float yBase; - Axis yAxis = curve.GetYAxis( pane ); - yBase = yAxis.Scale.Transform( yMin ); - - // Add three points to the path to move from the end of the curve (as defined by - // arrPoints) to the X axis, from there to the start of the curve at the X axis, - // and from there back up to the beginning of the curve. - path.AddLine( arrPoints[count - 1].X, arrPoints[count - 1].Y, arrPoints[count - 1].X, yBase ); - path.AddLine( arrPoints[count - 1].X, yBase, arrPoints[0].X, yBase ); - path.AddLine( arrPoints[0].X, yBase, arrPoints[0].X, arrPoints[0].Y ); - } - // For stacked line types, the fill area is the area between this curve and the curve below it - else - { - PointF[] arrPoints2; - int count2; - - float tension = _isSmooth ? _smoothTension : 0f; - - // Find the next lower curve in the curveList that is also a LineItem type, and use - // its smoothing properties for the lower side of the filled area. - int index = pane.CurveList.IndexOf( curve ); - if ( index > 0 ) - { - CurveItem tmpCurve; - for ( int i = index - 1; i >= 0; i-- ) - { - tmpCurve = pane.CurveList[i]; - if ( tmpCurve is LineItem ) - { - tension = ( (LineItem)tmpCurve ).Line.IsSmooth ? ( (LineItem)tmpCurve ).Line.SmoothTension : 0f; - break; - } - } - } - - // Build another points array consisting of the low points (which are actually the points for - // the curve below the current curve) - BuildLowPointsArray( pane, curve, out arrPoints2, out count2 ); - - // Add the new points to the GraphicsPath - path.AddCurve( arrPoints2, 0, count2 - 2, tension ); - } - - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/LineBase.cs b/SDK/ZedGraphs/ZedGraph/LineBase.cs deleted file mode 100644 index d5b2c63..0000000 --- a/SDK/ZedGraphs/ZedGraph/LineBase.cs +++ /dev/null @@ -1,474 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2007 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that handles the basic attributes of a line segment. - /// - /// - /// This is the base class for and classes. - /// - /// John Champion - /// $Revision: 3.2 $ $Date: 2007-03-17 18:43:44 $ - [Serializable] - public class LineBase : ICloneable, ISerializable - { - - #region Fields - - /// - /// Private field that stores the pen width for this line. - /// Use the public property to access this value. - /// - internal float _width; - /// - /// Private field that stores the for this - /// line. Use the public - /// property to access this value. - /// - internal DashStyle _style; - /// - /// private field that stores the "Dash On" length for drawing the line. Use the - /// public property to access this value. - /// - internal float _dashOn; - /// - /// private field that stores the "Dash Off" length for drawing the line. Use the - /// public property to access this value. - /// - internal float _dashOff; - - /// - /// Private field that stores the visibility of this line. Use the public - /// property to access this value. - /// - internal bool _isVisible; - - /// - /// private field that determines if the line is drawn using - /// Anti-Aliasing capabilities from the class. - /// Use the public property to access - /// this value. - /// - internal bool _isAntiAlias; - /// - /// Private field that stores the color of this line. Use the public - /// property to access this value. If this value is - /// false, the line will not be shown (but the may - /// still be shown). - /// - internal Color _color; - - /// - /// Internal field that stores a custom class. This - /// fill is used strictly for , - /// , , - /// and calculations to determine - /// the color of the line. - /// - internal Fill _gradientFill; - - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default mode for displaying line segments ( - /// property). True to show the line segments, false to hide them. - /// - public static bool IsVisible = true; - /// - /// The default width for line segments ( property). - /// Units are points (1/72 inch). - /// - public static float Width = 1; - /// - /// The default value for the - /// property. - /// - public static bool IsAntiAlias = false; - - /// - /// The default drawing style for line segments ( property). - /// This is defined with the enumeration. - /// - public static DashStyle Style = DashStyle.Solid; - /// - /// The default "dash on" size for drawing the line - /// ( property). Units are in points (1/72 inch). - /// - public static float DashOn = 1.0F; - /// - /// The default "dash off" size for drawing the the line - /// ( property). Units are in points (1/72 inch). - /// - public static float DashOff = 1.0F; - - /// - /// The default color for the line. - /// This is the default value for the property. - /// - public static Color Color = Color.Black; - } - - #endregion - - #region Properties - - /// - /// The color of the . Note that this color value can be - /// overridden if the GradientFill.Type is one of the - /// , - /// , , - /// and types. - /// - /// - public Color Color - { - get { return _color; } - set { _color = value; } - } - /// - /// The style of the , defined as a enum. - /// This allows the line to be solid, dashed, or dotted. - /// - /// - /// - /// - public DashStyle Style - { - get { return _style; } - set { _style = value; } - } - - /// - /// The "Dash On" mode for drawing the line. - /// - /// - /// This is the distance, in points (1/72 inch), of the dash segments that make up - /// the dashed grid lines. This setting is only valid if - /// is set to . - /// - /// The dash on length is defined in points (1/72 inch) - /// - /// - /// . - public float DashOn - { - get { return _dashOn; } - set { _dashOn = value; } - } - /// - /// The "Dash Off" mode for drawing the line. - /// - /// - /// This is the distance, in points (1/72 inch), of the spaces between the dash - /// segments that make up the dashed grid lines. This setting is only valid if - /// is set to . - /// - /// The dash off length is defined in points (1/72 inch) - /// - /// - /// . - public float DashOff - { - get { return _dashOff; } - set { _dashOff = value; } - } - - /// - /// The pen width used to draw the , in points (1/72 inch) - /// - /// - public float Width - { - get { return _width; } - set { _width = value; } - } - /// - /// Gets or sets a property that shows or hides the . - /// - /// true to show the line, false to hide it - /// - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - /// - /// Gets or sets a value that determines if the lines are drawn using - /// Anti-Aliasing capabilities from the class. - /// - /// - /// If this value is set to true, then the - /// property will be set to only while - /// this is drawn. A value of false will leave the value of - /// unchanged. - /// - public bool IsAntiAlias - { - get { return _isAntiAlias; } - set { _isAntiAlias = value; } - } - - /// - /// Gets or sets a custom class. - /// - /// This fill is used strictly for , - /// , , - /// and calculations to determine - /// the color of the line. It overrides the property if - /// one of the above values are selected. - /// - /// - public Fill GradientFill - { - get { return _gradientFill; } - set { _gradientFill = value; } - } - - #endregion - - #region Constructors - - /// - /// Default constructor that sets all properties to default - /// values as defined in the class. - /// - public LineBase() - : this( Color.Empty ) - { - } - - /// - /// Constructor that sets the color property to the specified value, and sets - /// the remaining properties to default - /// values as defined in the class. - /// - /// The color to assign to this new Line object - public LineBase( Color color ) - { - _width = Default.Width; - _style = Default.Style; - _dashOn = Default.DashOn; - _dashOff = Default.DashOff; - _isVisible = Default.IsVisible; - _color = color.IsEmpty ? Default.Color : color; - _isAntiAlias = Default.IsAntiAlias; - _gradientFill = new Fill( Color.Red, Color.White ); - _gradientFill.Type = FillType.None; - } - - /// - /// The Copy Constructor - /// - /// The LineBase object from which to copy - public LineBase( LineBase rhs ) - { - _width = rhs._width; - _style = rhs._style; - _dashOn = rhs._dashOn; - _dashOff = rhs._dashOff; - - _isVisible = rhs._isVisible; - _color = rhs._color; - - _isAntiAlias = rhs._isAntiAlias; - _gradientFill = new Fill( rhs._gradientFill ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of Clone. - /// - /// - /// Note that this method must be called with an explicit cast to ICloneable, and - /// that it is inherently virtual. For example: - /// - /// ParentClass foo = new ChildClass(); - /// ChildClass bar = (ChildClass) ((ICloneable)foo).Clone(); - /// - /// Assume that ChildClass is inherited from ParentClass. Even though foo is declared with - /// ParentClass, it is actually an instance of ChildClass. Calling the ICloneable implementation - /// of Clone() on foo actually calls ChildClass.Clone() as if it were a virtual function. - /// - /// A deep copy of this object - object ICloneable.Clone() - { - throw new NotImplementedException( "Can't clone an abstract base type -- child types must implement ICloneable" ); - //return new PaneBase( this ); - } - - // /// - // /// Typesafe, deep-copy clone method. - // /// - // /// A new, independent copy of this class - //public LineBase Clone() - //{ - // return new LineBase( this ); - //} - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema0 = 12; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the - /// serialized data - /// - /// A instance that contains - /// the serialized data - /// - protected LineBase( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema0" ); - - _width = info.GetSingle( "width" ); - _style = (DashStyle)info.GetValue( "style", typeof( DashStyle ) ); - _dashOn = info.GetSingle( "dashOn" ); - _dashOff = info.GetSingle( "dashOff" ); - _isVisible = info.GetBoolean( "isVisible" ); - _isAntiAlias = info.GetBoolean( "isAntiAlias" ); - _color = (Color)info.GetValue( "color", typeof( Color ) ); - _gradientFill = (Fill)info.GetValue( "gradientFill", typeof( Fill ) ); - } - /// - /// Populates a instance with the data needed to serialize - /// the target object - /// - /// A instance that defines the - /// serialized data - /// A instance that contains the - /// serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema0", schema0 ); - - info.AddValue( "width", _width ); - info.AddValue( "style", _style ); - info.AddValue( "dashOn", _dashOn ); - info.AddValue( "dashOff", _dashOff ); - info.AddValue( "isVisible", _isVisible ); - info.AddValue( "isAntiAlias", _isAntiAlias ); - info.AddValue( "color", _color ); - info.AddValue( "gradientFill", _gradientFill ); - } - - #endregion - - #region Methods - - /// - /// Create a object based on the properties of this - /// . - /// - /// The owner of this - /// . - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// A object with the properties of this - /// - public Pen GetPen( PaneBase pane, float scaleFactor ) - { - return GetPen( pane, scaleFactor, null ); - } - - /// - /// Create a object based on the properties of this - /// . - /// - /// The owner of this - /// . - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The data value to be used for a value-based - /// color gradient. This is only applicable if GradientFill.Type - /// is one of , - /// , , - /// or . - /// - /// A object with the properties of this - /// - public Pen GetPen( PaneBase pane, float scaleFactor, PointPair dataValue ) - { - Color color = _color; - if ( _gradientFill.IsGradientValueType ) - color = _gradientFill.GetGradientColor( dataValue ); - - Pen pen = new Pen( color, - pane.ScaledPenWidth( _width, scaleFactor ) ); - - pen.DashStyle = _style; - - if ( _style == DashStyle.Custom ) - { - if ( _dashOff > 1e-10 && _dashOn > 1e-10 ) - { - pen.DashStyle = DashStyle.Custom; - float[] pattern = new float[2]; - pattern[0] = _dashOn; - pattern[1] = _dashOff; - pen.DashPattern = pattern; - } - else - pen.DashStyle = DashStyle.Solid; - } - - return pen; - } - - #endregion - - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/LineItem.cs b/SDK/ZedGraphs/ZedGraph/LineItem.cs deleted file mode 100644 index 776aa4e..0000000 --- a/SDK/ZedGraphs/ZedGraph/LineItem.cs +++ /dev/null @@ -1,394 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Encapsulates a curve type that is displayed as a line and/or a set of - /// symbols at each point. - /// - /// - /// John Champion - /// $Revision: 3.22 $ $Date: 2007-08-10 16:22:54 $ - [Serializable] - public class LineItem : CurveItem, ICloneable, ISerializable - { - #region Fields - - /// - /// Private field that stores a reference to the - /// class defined for this . Use the public - /// property to access this value. - /// - protected Symbol _symbol; - /// - /// Private field that stores a reference to the - /// class defined for this . Use the public - /// property to access this value. - /// - protected Line _line; - - #endregion - - #region Properties - - /// - /// Gets or sets the class instance defined - /// for this . - /// - public Symbol Symbol - { - get { return _symbol; } - set { _symbol = value; } - } - /// - /// Gets or sets the class instance defined - /// for this . - /// - public Line Line - { - get { return _line; } - set { _line = value; } - } - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return false; - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return true; - } - - #endregion - - #region Constructors - /// - /// Create a new , specifying only the legend . - /// - /// The _label that will appear in the legend. - public LineItem( string label ) : base( label ) - { - _symbol = new Symbol(); - _line = new Line(); - } - - /// - /// Create a new using the specified properties. - /// - /// The _label that will appear in the legend. - /// An array of double precision values that define - /// the independent (X axis) values for this curve - /// An array of double precision values that define - /// the dependent (Y axis) values for this curve - /// A value that will be applied to - /// the and properties. - /// - /// A enum specifying the - /// type of symbol to use for this . Use - /// to hide the symbols. - /// The width (in points) to be used for the . This - /// width is scaled based on . Use a value of zero to - /// hide the line (see ). - public LineItem( string label, double[] x, double[] y, Color color, SymbolType symbolType, float lineWidth ) - : this( label, new PointPairList( x, y ), color, symbolType, lineWidth ) - { - } - - /// - /// Create a new using the specified properties. - /// - /// The _label that will appear in the legend. - /// An array of double precision values that define - /// the independent (X axis) values for this curve - /// An array of double precision values that define - /// the dependent (Y axis) values for this curve - /// A value that will be applied to - /// the and properties. - /// - /// A enum specifying the - /// type of symbol to use for this . Use - /// to hide the symbols. - public LineItem( string label, double[] x, double[] y, Color color, SymbolType symbolType ) - : this( label, new PointPairList( x, y ), color, symbolType ) - { - } - - /// - /// Create a new using the specified properties. - /// - /// The _label that will appear in the legend. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// A value that will be applied to - /// the and properties. - /// - /// A enum specifying the - /// type of symbol to use for this . Use - /// to hide the symbols. - /// The width (in points) to be used for the . This - /// width is scaled based on . Use a value of zero to - /// hide the line (see ). - public LineItem( string label, IPointList points, Color color, SymbolType symbolType, float lineWidth ) - : base( label, points ) - { - _line = new Line( color ); - if ( lineWidth == 0 ) - _line.IsVisible = false; - else - _line.Width = lineWidth; - - _symbol = new Symbol( symbolType, color ); - } - - /// - /// Create a new using the specified properties. - /// - /// The _label that will appear in the legend. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// A value that will be applied to - /// the and properties. - /// - /// A enum specifying the - /// type of symbol to use for this . Use - /// to hide the symbols. - public LineItem( string label, IPointList points, Color color, SymbolType symbolType ) - : this( label, points, color, symbolType, ZedGraph.LineBase.Default.Width ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public LineItem( LineItem rhs ) : base( rhs ) - { - _symbol = new Symbol( rhs.Symbol ); - _line = new Line( rhs.Line ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public LineItem Clone() - { - return new LineItem( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected LineItem( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _symbol = (Symbol) info.GetValue( "symbol", typeof(Symbol) ); - _line = (Line) info.GetValue( "line", typeof(Line) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "symbol", _symbol ); - info.AddValue( "line", _line ); - } - #endregion - - #region Methods - /// - /// Do all rendering associated with this to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The ordinal position of the current - /// curve. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, GraphPane pane, int pos, float scaleFactor ) - { - if ( _isVisible ) - { - Line.Draw( g, pane, this, scaleFactor ); - - Symbol.Draw( g, pane, this, scaleFactor, IsSelected ); - } - } - - /// - /// Draw a legend key entry for this at the specified location - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The struct that specifies the - /// location for the legend key - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor ) - { - // Draw a sample curve to the left of the label text - int xMid = (int)( rect.Left + rect.Width / 2.0F ); - int yMid = (int) (rect.Top + rect.Height / 2.0F); - //RectangleF rect2 = rect; - //rect2.Y = yMid; - //rect2.Height = rect.Height / 2.0f; - - _line.Fill.Draw( g, rect ); - - _line.DrawSegment( g, pane, rect.Left, yMid, rect.Right, yMid, scaleFactor ); - - // Draw a sample symbol to the left of the label text - _symbol.DrawSymbol( g, pane, xMid, yMid, scaleFactor, false, null ); - - } - - /// - /// Loads some pseudo unique colors/symbols into this LineItem. This - /// is mainly useful for differentiating a set of new LineItems without - /// having to pick your own colors/symbols. - /// - /// - /// - /// The that is used to pick the color - /// and symbol for this method call. - /// - override public void MakeUnique( ColorSymbolRotator rotator ) - { - this.Color = rotator.NextColor; - this.Symbol.Type = rotator.NextSymbol; - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - override public bool GetCoords( GraphPane pane, int i, out string coords ) - { - coords = string.Empty; - - if ( i < 0 || i >= _points.Count ) - return false; - - PointPair pt = _points[i]; - if ( pt.IsInvalid ) - return false; - - double x, y, z; - ValueHandler valueHandler = new ValueHandler( pane, false ); - valueHandler.GetValues( this, i, out x, out z, out y ); - - Axis yAxis = GetYAxis( pane ); - Axis xAxis = GetXAxis( pane ); - - PointF pixPt = new PointF( xAxis.Scale.Transform( _isOverrideOrdinal, i, x ), - yAxis.Scale.Transform( _isOverrideOrdinal, i, y ) ); - - if ( !pane.Chart.Rect.Contains( pixPt ) ) - return false; - - float halfSize = _symbol.Size * pane.CalcScaleFactor(); - - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixPt.X - halfSize, pixPt.Y - halfSize, - pixPt.X + halfSize, pixPt.Y + halfSize ); - - return true; - } - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/LineObj.cs b/SDK/ZedGraphs/ZedGraph/LineObj.cs deleted file mode 100644 index 1fbb933..0000000 --- a/SDK/ZedGraphs/ZedGraph/LineObj.cs +++ /dev/null @@ -1,338 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that represents a line segment object on the graph. A list of - /// GraphObj objects is maintained by the collection class. - /// - /// - /// This should not be confused with the class, which represents - /// a set of points plotted together as a "curve". The class is - /// a single line segment, drawn as a "decoration" on the chart. - /// - /// John Champion - /// $Revision: 3.4 $ $Date: 2007-01-25 07:56:09 $ - [Serializable] - public class LineObj : GraphObj, ICloneable, ISerializable - { - #region Fields - - /// - /// protected field that maintains the attributes of the line using an - /// instance of the class. - /// - protected LineBase _line; - - #endregion - - #region Properties - - /// - /// A class that contains the attributes for drawing this - /// . - /// - public LineBase Line - { - get { return _line; } - set { _line = value; } - } - - #endregion - - - #region Constructors - - /// Constructors for the object - /// - /// A constructor that allows the position, color, and size of the - /// to be pre-specified. - /// - /// An arbitrary specification - /// for the arrow - /// The x position of the starting point that defines the - /// line. The units of this position are specified by the - /// property. - /// The y position of the starting point that defines the - /// line. The units of this position are specified by the - /// property. - /// The x position of the ending point that defines the - /// line. The units of this position are specified by the - /// property. - /// The y position of the ending point that defines the - /// line. The units of this position are specified by the - /// property. - public LineObj( Color color, double x1, double y1, double x2, double y2 ) - : base( x1, y1, x2 - x1, y2 - y1 ) - { - _line = new LineBase( color ); - this.Location.AlignH = AlignH.Left; - this.Location.AlignV = AlignV.Top; - } - - /// - /// A constructor that allows only the position of the - /// line to be pre-specified. All other properties are set to - /// default values - /// - /// The x position of the starting point that defines the - /// . The units of this position are specified by the - /// property. - /// The y position of the starting point that defines the - /// . The units of this position are specified by the - /// property. - /// The x position of the ending point that defines the - /// . The units of this position are specified by the - /// property. - /// The y position of the ending point that defines the - /// . The units of this position are specified by the - /// property. - public LineObj( double x1, double y1, double x2, double y2 ) - : this( LineBase.Default.Color, x1, y1, x2, y2 ) - { - } - - /// - /// Default constructor -- places the at location - /// (0,0) to (1,1). All other values are defaulted. - /// - public LineObj() : this( LineBase.Default.Color, 0, 0, 1, 1 ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public LineObj( LineObj rhs ) : base( rhs ) - { - _line = new LineBase( rhs._line ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public LineObj Clone() - { - return new LineObj( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - // changed to 2 with addition of Style property - public const int schema2 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected LineObj( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _line = (LineBase)info.GetValue( "line", typeof( LineBase ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema2", schema2 ); - - info.AddValue( "line", _line ); - } - #endregion - - #region Rendering Methods - /// - /// Render this object to the specified device. - /// - /// - /// This method is normally only called by the Draw method - /// of the parent collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) - { - // Convert the arrow coordinates from the user coordinate system - // to the screen coordinate system - PointF pix1 = this.Location.TransformTopLeft( pane ); - PointF pix2 = this.Location.TransformBottomRight( pane ); - - if ( pix1.X > -10000 && pix1.X < 100000 && pix1.Y > -100000 && pix1.Y < 100000 && - pix2.X > -10000 && pix2.X < 100000 && pix2.Y > -100000 && pix2.Y < 100000 ) - { - // calculate the length and the angle of the arrow "vector" - double dy = pix2.Y - pix1.Y; - double dx = pix2.X - pix1.X; - float angle = (float)Math.Atan2( dy, dx ) * 180.0F / (float)Math.PI; - float length = (float)Math.Sqrt( dx * dx + dy * dy ); - - // Save the old transform matrix - Matrix transform = g.Transform; - // Move the coordinate system so it is located at the starting point - // of this arrow - g.TranslateTransform( pix1.X, pix1.Y ); - // Rotate the coordinate system according to the angle of this arrow - // about the starting point - g.RotateTransform( angle ); - - // get a pen according to this arrow properties - using ( Pen pen = _line.GetPen( pane, scaleFactor ) ) - //new Pen( _line._color, pane.ScaledPenWidth( _line._width, scaleFactor ) ) ) - { - //pen.DashStyle = _style; - - g.DrawLine( pen, 0, 0, length, 0 ); - } - - // Restore the transform matrix back to its original state - g.Transform = transform; - } - } - - /// - /// Determine if the specified screen point lies inside the bounding box of this - /// . - /// - /// The bounding box is calculated assuming a distance - /// of pixels around the arrow segment. - /// - /// The screen point, in pixels - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// true if the point lies in the bounding box, false otherwise - override public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) - { - if ( ! base.PointInBox(pt, pane, g, scaleFactor ) ) - return false; - - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - PointF pix = _location.TransformTopLeft( pane ); - PointF pix2 = _location.TransformBottomRight( pane ); - - using ( Pen pen = new Pen( Color.Black, (float)GraphPane.Default.NearestTol * 2.0F ) ) - { - using ( GraphicsPath path = new GraphicsPath() ) - { - path.AddLine( pix, pix2 ); - return path.IsOutlineVisible( pt, pen ); - } - } - } - - /// - /// Determines the shape type and Coords values for this GraphObj - /// - override public void GetCoords( PaneBase pane, Graphics g, float scaleFactor, - out string shape, out string coords ) - { - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - RectangleF pixRect = _location.TransformRect( pane ); - - Matrix matrix = new Matrix(); - if ( pixRect.Right == 0 ) - pixRect.Width = 1; - float angle = (float) Math.Atan( ( pixRect.Top - pixRect.Bottom ) / - ( pixRect.Left - pixRect.Right ) ); - matrix.Rotate( angle, MatrixOrder.Prepend ); - - // Move the coordinate system to local coordinates - // of this text object (that is, at the specified - // x,y location) - matrix.Translate( -pixRect.Left, -pixRect.Top, MatrixOrder.Prepend ); - - PointF[] pts = new PointF[4]; - pts[0] = new PointF( 0, 3 ); - pts[1] = new PointF( pixRect.Width, 3 ); - pts[2] = new PointF( pixRect.Width, -3 ); - pts[3] = new PointF( 0, -3 ); - matrix.TransformPoints( pts ); - - shape = "poly"; - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0},{4:f0},{5:f0},{6:f0},{7:f0},", - pts[0].X, pts[0].Y, pts[1].X, pts[1].Y, - pts[2].X, pts[2].Y, pts[3].X, pts[3].Y ); - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/LinearAsOrdinalScale.cs b/SDK/ZedGraphs/ZedGraph/LinearAsOrdinalScale.cs deleted file mode 100644 index 192c041..0000000 --- a/SDK/ZedGraphs/ZedGraph/LinearAsOrdinalScale.cs +++ /dev/null @@ -1,244 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The LinearAsOrdinalScale class inherits from the class, and implements - /// the features specific to . - /// - /// - /// LinearAsOrdinal is an ordinal axis that will have labels formatted with values from the actual data - /// values of the first in the . - /// Although the tics are labeled with real data values, the actual points will be - /// evenly-spaced in spite of the data values. For example, if the X values of the first curve - /// are 1, 5, and 100, then the tic labels will show 1, 5, and 100, but they will be equal - /// distance from each other. - /// - /// - /// John Champion - /// $Revision: 1.10 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - class LinearAsOrdinalScale : Scale, ISerializable //, ICloneable - { - - #region constructors - - /// - /// Default constructor that defines the owner - /// (containing object) for this new object. - /// - /// The owner, or containing object, of this instance - public LinearAsOrdinalScale( Axis owner ) - : base( owner ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - /// The object that will own the - /// new instance of - public LinearAsOrdinalScale( Scale rhs, Axis owner ) - : base( rhs, owner ) - { - } - - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - public override Scale Clone( Axis owner ) - { - return new LinearAsOrdinalScale( this, owner ); - } - #endregion - - #region properties - - /// - /// Return the for this , which is - /// . - /// - public override AxisType Type - { - get { return AxisType.LinearAsOrdinal; } - } - - #endregion - - #region methods - - /// - /// Select a reasonable ordinal axis scale given a range of data values, with the expectation that - /// linear values will be displayed. - /// - /// - /// This method only applies to type axes, and it - /// is called by the general method. For this type, - /// the first curve is the "master", which contains the dates to be applied. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to scale minor step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// - override public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - // call the base class first - base.PickScale( pane, g, scaleFactor ); - - // First, get the date ranges from the first curve in the list - double xMin; // = Double.MaxValue; - double xMax; // = Double.MinValue; - double yMin; // = Double.MaxValue; - double yMax; // = Double.MinValue; - double tMin = 0; - double tMax = 1; - - foreach ( CurveItem curve in pane.CurveList ) - { - if ( ( _ownerAxis is Y2Axis && curve.IsY2Axis ) || - ( _ownerAxis is YAxis && !curve.IsY2Axis ) || - ( _ownerAxis is X2Axis && curve.IsX2Axis ) || - ( _ownerAxis is XAxis && !curve.IsX2Axis ) ) - { - curve.GetRange( out xMin, out xMax, out yMin, out yMax, false, false, pane ); - if ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) - { - tMin = xMin; - tMax = xMax; - } - else - { - tMin = yMin; - tMax = yMax; - } - } - } - - double range = Math.Abs( tMax - tMin ); - - // Now, set the axis range based on a ordinal scale - base.PickScale( pane, g, scaleFactor ); - OrdinalScale.PickScale( pane, g, scaleFactor, this ); - - SetScaleMag( tMin, tMax, range / Default.TargetXSteps ); - } - - /// - /// Make a value label for an . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log () - /// and text () type axes. - /// - /// The resulting value label as a - override internal string MakeLabel( GraphPane pane, int index, double dVal ) - { - if ( _format == null ) - _format = Scale.Default.Format; - - double val; - - int tmpIndex = (int) dVal - 1; - - if ( pane.CurveList.Count > 0 && pane.CurveList[0].Points.Count > tmpIndex ) - { - val = pane.CurveList[0].Points[tmpIndex].X; - double scaleMult = Math.Pow( (double) 10.0, _mag ); - return ( val / scaleMult ).ToString( _format ); - } - else - return string.Empty; - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected LinearAsOrdinalScale( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/LinearScale.cs b/SDK/ZedGraphs/ZedGraph/LinearScale.cs deleted file mode 100644 index 93e2dc4..0000000 --- a/SDK/ZedGraphs/ZedGraph/LinearScale.cs +++ /dev/null @@ -1,234 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The LinearScale class inherits from the class, and implements - /// the features specific to . - /// - /// - /// LinearScale is the normal, default cartesian axis. - /// - /// - /// John Champion - /// $Revision: 1.10 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - class LinearScale : Scale, ISerializable //, ICloneable - { - - #region constructors - - /// - /// Default constructor that defines the owner - /// (containing object) for this new object. - /// - /// The owner, or containing object, of this instance - public LinearScale( Axis owner ) - : base( owner ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - /// The object that will own the - /// new instance of - public LinearScale( Scale rhs, Axis owner ) - : base( rhs, owner ) - { - } - - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - public override Scale Clone( Axis owner ) - { - return new LinearScale( this, owner ); - } - #endregion - - #region properties - - /// - /// Return the for this , which is - /// . - /// - public override AxisType Type - { - get { return AxisType.Linear; } - } - - #endregion - - #region methods - - /// - /// Select a reasonable linear axis scale given a range of data values. - /// - /// - /// This method only applies to type axes, and it - /// is called by the general method. The scale range is chosen - /// based on increments of 1, 2, or 5 (because they are even divisors of 10). This - /// method honors the , , - /// and autorange settings. - /// In the event that any of the autorange settings are false, the - /// corresponding , , or - /// setting is explicitly honored, and the remaining autorange settings (if any) will - /// be calculated to accomodate the non-autoranged values. The basic defaults for - /// scale selection are defined using , - /// , and - /// from the default class. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to scale minor step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// - override public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - // call the base class first - base.PickScale( pane, g, scaleFactor ); - - // Test for trivial condition of range = 0 and pick a suitable default - if ( _max - _min < 1.0e-30 ) - { - if ( _maxAuto ) - _max = _max + 0.2 * ( _max == 0 ? 1.0 : Math.Abs( _max ) ); - if ( _minAuto ) - _min = _min - 0.2 * ( _min == 0 ? 1.0 : Math.Abs( _min ) ); - } - - // This is the zero-lever test. If minVal is within the zero lever fraction - // of the data range, then use zero. - - if ( _minAuto && _min > 0 && - _min / ( _max - _min ) < Default.ZeroLever ) - _min = 0; - - // Repeat the zero-lever test for cases where the maxVal is less than zero - if ( _maxAuto && _max < 0 && - Math.Abs( _max / ( _max - _min ) ) < - Default.ZeroLever ) - _max = 0; - - // Calculate the new step size - if ( _majorStepAuto ) - { - double targetSteps = ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) ? - Default.TargetXSteps : Default.TargetYSteps; - - // Calculate the step size based on target steps - _majorStep = CalcStepSize( _max - _min, targetSteps ); - - if ( _isPreventLabelOverlap ) - { - // Calculate the maximum number of labels - double maxLabels = (double) this.CalcMaxLabels( g, pane, scaleFactor ); - - if ( maxLabels < ( _max - _min ) / _majorStep ) - _majorStep = CalcBoundedStepSize( _max - _min, maxLabels ); - } - } - - // Calculate the new step size - if ( _minorStepAuto ) - _minorStep = CalcStepSize( _majorStep, - ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) ? - Default.TargetMinorXSteps : Default.TargetMinorYSteps ); - - // Calculate the scale minimum - if ( _minAuto ) - _min = _min - MyMod( _min, _majorStep ); - - // Calculate the scale maximum - if ( _maxAuto ) - _max = MyMod( _max, _majorStep ) == 0.0 ? _max : - _max + _majorStep - MyMod( _max, _majorStep ); - - SetScaleMag( _min, _max, _majorStep ); - } - - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected LinearScale( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Link.cs b/SDK/ZedGraphs/ZedGraph/Link.cs deleted file mode 100644 index 960b0b3..0000000 --- a/SDK/ZedGraphs/ZedGraph/Link.cs +++ /dev/null @@ -1,304 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that maintains hyperlink information for a clickable object on the graph. - /// - /// - /// John Champion - /// $Revision: 3.6 $ $Date: 2007-04-16 00:03:02 $ - // /// - [Serializable] - public class Link : ISerializable, ICloneable - { - - #region Fields - - /// - /// Internal field that stores the title string for this link. - /// - internal string _title; - - /// - /// Internal field that stores the url string for this link - /// - internal string _url; - - /// - /// Internal field that stores the target string for this link - /// - internal string _target; - - /// - /// Internal field that determines if this link is "live". - /// - internal bool _isEnabled; - - #endregion - - #region Properties - - /// - /// Gets or sets the title string for this link. - /// - /// - /// For web controls, this title will be shown as a tooltip when the mouse - /// hovers over the area of the object that owns this link. Set the value to - /// to have no title. - /// - public string Title - { - get { return _title; } - set { _title = value; } - } - - /// - /// Gets or sets the url string for this link. - /// - /// - /// Set this value to if you don't want to have - /// a hyperlink associated with the object to which this link belongs. - /// - public string Url - { - get { return _url; } - set { _url = value; } - } - - /// - /// Gets or sets the target string for this link. - /// - /// - /// This value should be set to a valid target associated with the "Target" - /// property of an html hyperlink. Typically, this would be "_blank" to open - /// a new browser window, or "_self" to open in the current browser. - /// - public string Target - { - get { return _target != string.Empty ? _target : "_self"; } - set { _target = value; } - } - - /// - /// A tag object for use by the user. This can be used to store additional - /// information associated with the . ZedGraph does - /// not use this value for any purpose. - /// - /// - /// Note that, if you are going to Serialize ZedGraph data, then any type - /// that you store in must be a serializable type (or - /// it will cause an exception). - /// - public object Tag; - - /// - /// Gets or sets a property that determines if this link is active. True to have - /// a clickable link, false to ignore the link. - /// - public bool IsEnabled - { - get { return _isEnabled; } - set { _isEnabled = value; } - } - - /// - /// Gets a value that indicates if this is enabled - /// (see ), and that either the - /// or the is non-null. - /// - public bool IsActive - { - get { return _isEnabled && ( _url != null || _title != null ); } - } - - #endregion - - #region Constructors - - /// - /// Default constructor. Set all properties to string.Empty, or null. - /// - public Link() - { - _title = string.Empty; - _url = string.Empty; - _target = string.Empty; - this.Tag = null; - _isEnabled = false; - } - - /// - /// Construct a Link instance from a specified title, url, and target. - /// - /// The title for the link (which shows up in the tooltip). - /// The URL destination for the link. - /// The target for the link (typically "_blank" or "_self"). - public Link( string title, string url, string target ) - { - _title = title; - _url = url; - _target = target; - Tag = null; - _isEnabled = true; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public Link( Link rhs ) - { - // Copy value types - _title = rhs._title; - _url = rhs._url; - _target = rhs._target; - _isEnabled = false; - - // copy reference types by cloning - if ( rhs.Tag is ICloneable ) - this.Tag = ((ICloneable) rhs.Tag).Clone(); - else - this.Tag = rhs.Tag; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Link Clone() - { - return new Link( this ); - } - - - #endregion - - #region methods - - /// - /// Create a URL for a that includes the index of the - /// point that was selected. - /// - /// - /// An "index" parameter is added to the property for this - /// link to indicate which point was selected. Further, if the - /// X or Y axes that correspond to this are of - /// , then an - /// additional parameter will be added containing the text value that - /// corresponds to the of the selected point. - /// The text parameter will be labeled "xtext", and - /// the text parameter will be labeled "ytext". - /// - /// The zero-based index of the selected point - /// The of interest - /// The for which to - /// make the url string. - /// A string containing the url with an index parameter added. - public virtual string MakeCurveItemUrl( GraphPane pane, CurveItem curve, int index ) - { - string url = _url; - - if ( url.IndexOf( '?' ) >= 0 ) - url += "&index=" + index.ToString(); - else - url += "?index=" + index.ToString(); - - Axis xAxis = curve.GetXAxis( pane ); - if ( xAxis.Type == AxisType.Text && index >= 0 && - xAxis.Scale.TextLabels != null && - index <= xAxis.Scale.TextLabels.Length ) - url += "&xtext=" + xAxis.Scale.TextLabels[index]; - - Axis yAxis = curve.GetYAxis( pane ); - if ( yAxis != null && yAxis.Type == AxisType.Text && index >= 0 && - yAxis.Scale.TextLabels != null && - index <= yAxis.Scale.TextLabels.Length ) - url += "&ytext=" + yAxis.Scale.TextLabels[index]; - - return url; - } - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - /// - /// schema started with 10 for ZedGraph version 5 - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Link( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _title = info.GetString( "title" ); - _url = info.GetString( "url" ); - _target = info.GetString( "target" ); - _isEnabled = info.GetBoolean( "isEnabled" ); - Tag = info.GetValue( "Tag", typeof(object) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "title", _title ); - info.AddValue( "url", _url ); - info.AddValue( "target", _target ); - info.AddValue( "isEnabled", _isEnabled ); - info.AddValue( "Tag", Tag ); - } - - #endregion - - } -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/Location.cs b/SDK/ZedGraphs/ZedGraph/Location.cs deleted file mode 100644 index d14a522..0000000 --- a/SDK/ZedGraphs/ZedGraph/Location.cs +++ /dev/null @@ -1,566 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class than contains information about the position of an object on the graph. - /// - /// - /// John Champion - /// $Revision: 3.14 $ $Date: 2006-06-24 20:26:43 $ - [Serializable] - public class Location : ICloneable, ISerializable - { - #region Private Fields - /// Private field to store the vertical alignment property for - /// this object. Use the public property - /// to access this value. The value of this field is a enum. - /// - private AlignV _alignV; - /// Private field to store the horizontal alignment property for - /// this object. Use the public property - /// to access this value. The value of this field is a enum. - /// - private AlignH _alignH; - - /// Private fields to store the X and Y coordinate positions for - /// this object. Use the public properties and - /// to access these values. The coordinate type stored here is - /// dependent upon the setting of . - /// - private double _x, - _y, - _width, - _height; - - /// - /// Private field to store the coordinate system to be used for defining the - /// object position. Use the public property - /// to access this value. The coordinate system - /// is defined with the enum. - /// - private CoordType _coordinateFrame; - #endregion - - #region Properties - /// - /// A horizontal alignment parameter for this object specified - /// using the enum type. - /// - public AlignH AlignH - { - get { return _alignH; } - set { _alignH = value; } - } - /// - /// A vertical alignment parameter for this object specified - /// using the enum type. - /// - public AlignV AlignV - { - get { return _alignV; } - set { _alignV = value; } - } - /// - /// The coordinate system to be used for defining the object position - /// - /// The coordinate system is defined with the - /// enum - public CoordType CoordinateFrame - { - get { return _coordinateFrame; } - set { _coordinateFrame = value; } - } - /// - /// The x position of the object. - /// - /// - /// The units of this position - /// are specified by the property. - /// The object will be aligned to this position based on the - /// property. - /// - public double X - { - get { return _x; } - set { _x = value; } - } - /// - /// The y position of the object. - /// - /// - /// The units of this position - /// are specified by the property. - /// The object will be aligned to this position based on the - /// property. - /// - public double Y - { - get { return _y; } - set { _y = value; } - } - /// - /// The x1 position of the object (an alias for the x position). - /// - /// - /// The units of this position - /// are specified by the property. - /// The object will be aligned to this position based on the - /// property. - /// - public double X1 - { - get { return _x; } - set { _x = value; } - } - /// - /// The y1 position of the object (an alias for the y position). - /// - /// - /// The units of this position - /// are specified by the property. - /// The object will be aligned to this position based on the - /// property. - /// - public double Y1 - { - get { return _y; } - set { _y = value; } - } - /// - /// The width of the object. - /// - /// - /// The units of this position are specified by the - /// property. - /// - public double Width - { - get { return _width; } - set { _width = value; } - } - /// - /// The height of the object. - /// - /// - /// The units of this position are specified by the - /// property. - /// - public double Height - { - get { return _height; } - set { _height = value; } - } - /// - /// The x2 position of the object. - /// - /// - /// The units of this position are specified by the - /// property. - /// The object will be aligned to this position based on the - /// property. This position is only used for - /// objects such as , where it makes sense - /// to have a second coordinate. Note that the X2 position is stored - /// internally as a offset from . - /// - public double X2 - { - get { return _x+_width; } - //set { width = value-x; } - } - /// - /// The y2 position of the object. - /// - /// - /// The units of this position - /// are specified by the property. - /// The object will be aligned to this position based on the - /// property. This position is only used for - /// objects such as , where it makes sense - /// to have a second coordinate. Note that the Y2 position is stored - /// internally as a offset from . - /// - public double Y2 - { - get { return _y+_height; } - //set { height = value-y; } - } - - /// - /// The for this object as defined by the - /// , , , and - /// properties. - /// - /// - /// Note that this method reduces the precision of the location coordinates from double - /// precision to single precision. In some cases, such as , it - /// may affect the resolution of the point location. - /// - /// A in - /// units. - public RectangleF Rect - { - get { return new RectangleF( (float)_x, (float)_y, (float)_width, (float)_height ); } - set - { - _x = value.X; - _y = value.Y; - _width = value.Width; - _height = value.Height; - } - } - - /// - /// The top-left for this . - /// - /// - /// Note that this method reduces the precision of the location coordinates from double - /// precision to single precision. In some cases, such as , it - /// may affect the resolution of the point location. - /// - /// A in units. - public PointF TopLeft - { - get { return new PointF( (float)_x, (float)_y ); } - set { _x = value.X; _y = value.Y; } - } - - /// - /// The bottom-right for this . - /// - /// - /// Note that this method reduces the precision of the location coordinates from double - /// precision to single precision. In some cases, such as , it - /// may affect the resolution of the point location. - /// - /// A in units. - public PointF BottomRight - { - get { return new PointF( (float)this.X2, (float)this.Y2 ); } - //set { this.X2 = value.X; this.Y2 = value.Y; } - } - #endregion - - #region Constructors - - /// - /// Default constructor for the class. - /// - public Location() : this( 0, 0, CoordType.ChartFraction ) - { - } - - /// - /// Constructor for the class that specifies the - /// x, y position and the . - /// - /// - /// The (x,y) position corresponds to the top-left corner; - /// - /// The x position, specified in units of . - /// - /// The y position, specified in units of . - /// - /// The enum that specifies the - /// units for and - public Location( double x, double y, CoordType coordType ) : - this( x, y, coordType, AlignH.Left, AlignV.Top ) - { - } - - /// - /// Constructor for the class that specifies the - /// x, y position and the . - /// - /// - /// The (x,y) position corresponds to the top-left corner; - /// - /// The x position, specified in units of . - /// - /// The y position, specified in units of . - /// - /// The enum that specifies the - /// units for and - /// The enum that specifies - /// the horizontal alignment of the object with respect to the (x,y) location - /// The enum that specifies - /// the vertical alignment of the object with respect to the (x,y) location - public Location( double x, double y, CoordType coordType, AlignH alignH, AlignV alignV ) - { - _x = x; - _y = y; - _width = 0; - _height = 0; - _coordinateFrame = coordType; - _alignH = alignH; - _alignV = alignV; - } - - /// - /// Constructor for the class that specifies the - /// (x, y), (width, height), and the . - /// - /// - /// The (x,y) position - /// corresponds to the starting position, the (x2, y2) coorresponds to the ending position - /// (typically used for 's). - /// - /// The x position, specified in units of . - /// - /// The y position, specified in units of . - /// - /// The width, specified in units of . - /// - /// The height, specified in units of . - /// - /// The enum that specifies the - /// units for and - /// The enum that specifies - /// the horizontal alignment of the object with respect to the (x,y) location - /// The enum that specifies - /// the vertical alignment of the object with respect to the (x,y) location - public Location( double x, double y, double width, double height, - CoordType coordType, AlignH alignH, AlignV alignV ) : - this( x, y, coordType, alignH, alignV ) - { - _width = width; - _height = height; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public Location( Location rhs ) - { - _x = rhs._x; - _y = rhs._y; - _width = rhs._width; - _height = rhs._height; - _coordinateFrame = rhs.CoordinateFrame; - _alignH = rhs.AlignH; - _alignV = rhs.AlignV; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Location Clone() - { - return new Location( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Location( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _alignV = (AlignV) info.GetValue( "alignV", typeof(AlignV) ); - _alignH = (AlignH) info.GetValue( "alignH", typeof(AlignH) ); - _x = info.GetDouble( "x" ); - _y = info.GetDouble( "y" ); - _width = info.GetDouble( "width" ); - _height = info.GetDouble( "height" ); - _coordinateFrame = (CoordType) info.GetValue( "coordinateFrame", typeof(CoordType) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "alignV", _alignV ); - info.AddValue( "alignH", _alignH ); - info.AddValue( "x", _x ); - info.AddValue( "y", _y ); - info.AddValue( "width", _width ); - info.AddValue( "height", _height ); - info.AddValue( "coordinateFrame", _coordinateFrame ); - } - #endregion - - #region Methods - /// - /// Transform this object to display device - /// coordinates using the properties of the specified . - /// - /// - /// A reference to the object that contains - /// the classes which will be used for the transform. - /// - /// A point in display device coordinates that corresponds to the - /// specified user point. - public PointF Transform( PaneBase pane ) - { - return Transform( pane, _x, _y, - _coordinateFrame ); - } - - /// - /// Transform a data point from the specified coordinate type - /// () to display device coordinates (pixels). - /// - /// - /// If is not of type , then - /// only the transformation is available. - /// - /// - /// A reference to the object that contains - /// the classes which will be used for the transform. - /// - /// The x coordinate that defines the point in user - /// space. - /// The y coordinate that defines the point in user - /// space. - /// A type that defines the - /// coordinate system in which the X,Y pair is defined. - /// A point in display device coordinates that corresponds to the - /// specified user point. - public static PointF Transform( PaneBase pane, double x, double y, CoordType coord ) - { - return pane.TransformCoord( x, y, coord ); - } - - /// - /// Transform this from the coordinate system - /// as specified by to the device coordinates - /// of the specified object. - /// - /// - /// The returned - /// struct represents the top-left corner of the - /// object that honors the properties. - /// The and properties are honored in - /// this transformation. - /// - /// - /// A reference to the object that contains - /// the classes which will be used for the transform. - /// - /// The width of the object in device pixels - /// The height of the object in device pixels - /// The top-left corner of the object - public PointF TransformTopLeft( PaneBase pane, float width, float height ) - { - PointF pt = Transform( pane ); - - if ( _alignH == AlignH.Right ) - pt.X -= width; - else if ( _alignH == AlignH.Center ) - pt.X -= width / 2.0F; - - if ( _alignV == AlignV.Bottom ) - pt.Y -= height; - else if ( _alignV == AlignV.Center ) - pt.Y -= height / 2.0F; - - return pt; - } - - /// - /// The for this object as defined by the - /// and - /// properties. - /// - /// - /// This method transforms the location to output device pixel units. - /// The and properties are ignored for - /// this transformation (see ). - /// - /// A in pixel units. - public PointF TransformTopLeft( PaneBase pane ) - { - return Transform( pane ); - } - - /// - /// The for this object as defined by the - /// and properties. - /// - /// - /// This method transforms the location to output device pixel units. - /// The and properties are ignored for - /// this transformation (see ). - /// - /// A in pixel units. - public PointF TransformBottomRight( PaneBase pane ) - { - return Transform( pane, this.X2, this.Y2, _coordinateFrame ); - } - - /// - /// Transform the for this object as defined by the - /// , , , and - /// properties. - /// - /// - /// This method transforms the location to output device pixel units. - /// The and properties are honored in - /// this transformation. - /// - /// A in pixel units. - public RectangleF TransformRect( PaneBase pane ) - { - PointF pix1 = TransformTopLeft( pane ); - PointF pix2 = TransformBottomRight( pane ); - //PointF pix3 = TransformTopLeft( pane, pix2.X - pix1.X, pix2.Y - pix1.Y ); - - return new RectangleF( pix1.X, pix1.Y, Math.Abs(pix2.X - pix1.X), Math.Abs(pix2.Y - pix1.Y) ); - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/LogScale.cs b/SDK/ZedGraphs/ZedGraph/LogScale.cs deleted file mode 100644 index 15b1466..0000000 --- a/SDK/ZedGraphs/ZedGraph/LogScale.cs +++ /dev/null @@ -1,443 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The LogScale class inherits from the class, and implements - /// the features specific to . - /// - /// - /// LogScale is a non-linear axis in which the values are scaled using the base 10 - /// - /// function. - /// - /// - /// John Champion - /// $Revision: 1.12 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - class LogScale : Scale, ISerializable //, ICloneable - { - - #region constructors - - /// - /// Default constructor that defines the owner - /// (containing object) for this new object. - /// - /// The owner, or containing object, of this instance - public LogScale( Axis owner ) - : base( owner ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - /// The object that will own the - /// new instance of - public LogScale( Scale rhs, Axis owner ) - : base( rhs, owner ) - { - } - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - public override Scale Clone( Axis owner ) - { - return new LogScale( this, owner ); - } - - #endregion - - #region properties - - /// - /// Return the for this , which is - /// . - /// - public override AxisType Type - { - get { return AxisType.Log; } - } - - /// - /// Gets or sets the minimum value for this scale. - /// - /// - /// The set property is specifically adapted for scales, - /// in that it automatically limits the setting to values greater than zero. - /// - public override double Min - { - get { return _min; } - set { if ( value > 0 ) _min = value; } - } - - /// - /// Gets or sets the maximum value for this scale. - /// - /// - /// The set property is specifically adapted for scales, - /// in that it automatically limits the setting to values greater than zero. - /// struct. - /// - public override double Max - { - get { return _max; } - set { if ( value > 0 ) _max = value; } - } - - #endregion - - #region methods - - /// - /// Setup some temporary transform values in preparation for rendering the . - /// - /// - /// This method is typically called by the parent - /// object as part of the method. It is also - /// called by and - /// - /// methods to setup for coordinate transformations. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The parent for this - /// - override public void SetupScaleData( GraphPane pane, Axis axis ) - { - base.SetupScaleData( pane, axis ); - - _minLinTemp = Linearize( _min ); - _maxLinTemp = Linearize( _max ); - } - - /// - /// Convert a value to its linear equivalent for this type of scale. - /// - /// - /// The default behavior is to just return the value unchanged. However, - /// for and , - /// it returns the log or power equivalent. - /// - /// The value to be converted - override public double Linearize( double val ) - { - return SafeLog( val ); - } - - /// - /// Convert a value from its linear equivalent to its actual scale value - /// for this type of scale. - /// - /// - /// The default behavior is to just return the value unchanged. However, - /// for and , - /// it returns the anti-log or inverse-power equivalent. - /// - /// The value to be converted - override public double DeLinearize( double val ) - { - return Math.Pow( 10.0, val ); - } - - /// - /// Determine the value for any major tic. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// The value of the first major tic (floating point double) - /// - /// - /// The major tic number (0 = first major tic). For log scales, this is the actual power of 10. - /// - /// - /// The specified major tic value (floating point double). - /// - override internal double CalcMajorTicValue( double baseVal, double tic ) - { - return baseVal + (double)tic * CyclesPerStep; - - // double val = baseVal + (double)tic * CyclesPerStep; - // double frac = val - Math.Floor( val ); - } - - /// - /// Determine the value for any minor tic. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// The value of the first major tic (floating point double). This tic value is the base - /// reference for all tics (including minor ones). - /// - /// - /// The major tic number (0 = first major tic). For log scales, this is the actual power of 10. - /// - /// - /// The specified minor tic value (floating point double). - /// - override internal double CalcMinorTicValue( double baseVal, int iTic ) - { - double[] dLogVal = { 0, 0.301029995663981, 0.477121254719662, 0.602059991327962, - 0.698970004336019, 0.778151250383644, 0.845098040014257, - 0.903089986991944, 0.954242509439325, 1 }; - - return baseVal + Math.Floor( (double) iTic / 9.0 ) + dLogVal[( iTic + 9 ) % 9]; - } - - /// - /// Internal routine to determine the ordinals of the first minor tic mark - /// - /// - /// The value of the first major tic for the axis. - /// - /// - /// The ordinal position of the first minor tic, relative to the first major tic. - /// This value can be negative (e.g., -3 means the first minor tic is 3 minor step - /// increments before the first major tic. - /// - override internal int CalcMinorStart( double baseVal ) - { - return -9; - } - - /// - /// Determine the value for the first major tic. - /// - /// - /// This is done by finding the first possible value that is an integral multiple of - /// the step size, taking into account the date/time units if appropriate. - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// First major tic value (floating point double). - /// - override internal double CalcBaseTic() - { - if ( _baseTic != PointPair.Missing ) - return _baseTic; - else - { - // go to the nearest even multiple of the step size - return Math.Ceiling( Scale.SafeLog( _min ) - 0.00000001 ); - } - - } - - /// - /// Internal routine to determine the ordinals of the first and last major axis label. - /// - /// - /// This is the total number of major tics for this axis. - /// - override internal int CalcNumTics() - { - int nTics = 1; - - //iStart = (int) ( Math.Ceiling( SafeLog( this.min ) - 1.0e-12 ) ); - //iEnd = (int) ( Math.Floor( SafeLog( this.max ) + 1.0e-12 ) ); - - //nTics = (int)( ( Math.Floor( Scale.SafeLog( _max ) + 1.0e-12 ) ) - - // ( Math.Ceiling( Scale.SafeLog( _min ) - 1.0e-12 ) ) + 1 ) / CyclesPerStep; - nTics = (int)( ( Scale.SafeLog( _max ) - Scale.SafeLog( _min ) ) / CyclesPerStep ) + 1; - - if ( nTics < 1 ) - nTics = 1; - else if ( nTics > 1000 ) - nTics = 1000; - - return nTics; - } - - private double CyclesPerStep - { - //get { return (int)Math.Max( Math.Floor( Scale.SafeLog( _majorStep ) ), 1 ); } - get { return _majorStep; } - } - - /// - /// Select a reasonable base 10 logarithmic axis scale given a range of data values. - /// - /// - /// This method only applies to type axes, and it - /// is called by the general method. The scale range is chosen - /// based always on powers of 10 (full log cycles). This - /// method honors the , , - /// and autorange settings. - /// In the event that any of the autorange settings are false, the - /// corresponding , , or - /// setting is explicitly honored, and the remaining autorange settings (if any) will - /// be calculated to accomodate the non-autoranged values. For log axes, the MinorStep - /// value is not used. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// - override public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - // call the base class first - base.PickScale( pane, g, scaleFactor ); - - // Majorstep is always 1 for log scales - if ( _majorStepAuto ) - _majorStep = 1.0; - - _mag = 0; // Never use a magnitude shift for log scales - //this.numDec = 0; // The number of decimal places to display is not used - - // Check for bad data range - if ( _min <= 0.0 && _max <= 0.0 ) - { - _min = 1.0; - _max = 10.0; - } - else if ( _min <= 0.0 ) - { - _min = _max / 10.0; - } - else if ( _max <= 0.0 ) - { - _max = _min * 10.0; - } - - // Test for trivial condition of range = 0 and pick a suitable default - if ( _max - _min < 1.0e-20 ) - { - if ( _maxAuto ) - _max = _max * 2.0; - if ( _minAuto ) - _min = _min / 2.0; - } - - // Get the nearest power of 10 (no partial log cycles allowed) - if ( _minAuto ) - _min = Math.Pow( (double) 10.0, - Math.Floor( Math.Log10( _min ) ) ); - if ( _maxAuto ) - _max = Math.Pow( (double) 10.0, - Math.Ceiling( Math.Log10( _max ) ) ); - - } - - /// - /// Make a value label for an . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log () - /// and text () type axes. - /// - /// The resulting value label as a - override internal string MakeLabel( GraphPane pane, int index, double dVal ) - { - if ( _format == null ) - _format = Scale.Default.Format; - - if ( _isUseTenPower ) - return string.Format( "{0:F0}", dVal ); - else - return Math.Pow( 10.0, dVal ).ToString( _format ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected LogScale( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/MajorGrid.cs b/SDK/ZedGraphs/ZedGraph/MajorGrid.cs deleted file mode 100644 index 0d83cf3..0000000 --- a/SDK/ZedGraphs/ZedGraph/MajorGrid.cs +++ /dev/null @@ -1,200 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that handles the data associated with the major grid lines on the chart. - /// Inherits from . - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class MajorGrid : MinorGrid, ICloneable, ISerializable - { - internal bool _isZeroLine; - - #region Constructors - - /// - /// Default constructor - /// - public MajorGrid() - { - _dashOn = Default.DashOn; - _dashOff = Default.DashOff; - _penWidth = Default.PenWidth; - _isVisible = Default.IsVisible; - _color = Default.Color; - _isZeroLine = Default.IsZeroLine; - } - - /// - /// Copy constructor - /// - /// The source to be copied. - public MajorGrid( MajorGrid rhs ) : base( rhs ) - { - _isZeroLine = rhs._isZeroLine; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new MajorGrid Clone() - { - return new MajorGrid( this ); - } - - #endregion - - #region Properties - - /// - /// Gets or sets a boolean value that determines if a line will be drawn at the - /// zero value for the axis. - /// - /// - /// The zero line is a line that divides the negative values from the positive values. - /// The default is set according to - /// , , - /// , - /// - /// true to show the zero line, false otherwise - public bool IsZeroLine - { - get { return _isZeroLine; } - set { _isZeroLine = value; } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected MajorGrid( SerializationInfo info, StreamingContext context ) : - base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _isZeroLine = info.GetBoolean( "isZeroLine" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema2", schema2 ); - - info.AddValue( "isZeroLine", _isZeroLine ); - } - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public new struct Default - { - /// - /// The default "dash on" size for drawing the grid - /// ( property). Units are in points (1/72 inch). - /// - public static float DashOn = 1.0F; - /// - /// The default "dash off" size for drawing the grid - /// ( property). Units are in points (1/72 inch). - /// - public static float DashOff = 5.0F; - /// - /// The default pen width for drawing the grid - /// ( property). Units are in points (1/72 inch). - /// - public static float PenWidth = 1.0F; - /// - /// The default color for the grid lines - /// ( property). This color only affects the - /// grid lines. - /// - public static Color Color = Color.Black; - - /// - /// The default display mode for the grid lines - /// ( property). true - /// to show the grid lines, false to hide them. - /// - public static bool IsVisible = false; - - /// - /// The default boolean value that determines if a line will be drawn at the - /// zero value for the axis. - /// - /// - /// The zero line is a line that divides the negative values from the positive values. - /// The default is set according to - /// , , - /// , - /// - /// true to show the zero line, false otherwise - public static bool IsZeroLine = false; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/MajorTic.cs b/SDK/ZedGraphs/ZedGraph/MajorTic.cs deleted file mode 100644 index ab0b597..0000000 --- a/SDK/ZedGraphs/ZedGraph/MajorTic.cs +++ /dev/null @@ -1,244 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that holds the specific properties for the major tics. Inherits from - /// . - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class MajorTic : MinorTic, ICloneable, ISerializable - { - internal bool _isBetweenLabels; - - #region Constructors - - /// - /// Default constructor for . - /// - public MajorTic() - { - _size = Default.Size; - _color = Default.Color; - _penWidth = Default.PenWidth; - - this.IsOutside = Default.IsOutside; - this.IsInside = Default.IsInside; - this.IsOpposite = Default.IsOpposite; - _isCrossOutside = Default.IsCrossOutside; - _isCrossInside = Default.IsCrossInside; - - _isBetweenLabels = false; - } - - /// - /// Copy constructor. - /// - /// The that is to be copied. - public MajorTic( MajorTic rhs ) - : base( rhs ) - { - _isBetweenLabels = rhs._isBetweenLabels; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new MajorTic Clone() - { - return new MajorTic( this ); - } - - #endregion - - #region Properties - - /// - /// Gets or sets a property that determines whether or not the major tics will be drawn - /// inbetween the labels, rather than right at the labels. - /// - /// - /// Note that this setting is only - /// applicable if = . - /// - /// true to place the text between the labels for text axes, false otherwise - /// - /// - /// - /// - /// - public bool IsBetweenLabels - { - get { return _isBetweenLabels; } - set { _isBetweenLabels = value; } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected MajorTic( SerializationInfo info, StreamingContext context ) : - base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch2 = info.GetInt32( "schema2" ); - - _isBetweenLabels = info.GetBoolean( "isBetweenLabels" ); - } - - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema2", schema2 ); - - info.AddValue( "isBetweenLabels", _isBetweenLabels ); - } - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public new struct Default - { - // Default Axis Properties - /// - /// The default size for the tic marks. - /// ( property). Units are in points (1/72 inch). - /// - public static float Size = 5; - /// - /// The default pen width for drawing the tic marks. - /// ( property). Units are in points (1/72 inch). - /// - public static float PenWidth = 1.0F; - /// - /// The display mode for the major outside tic marks - /// ( property). - /// The major tic spacing is controlled by . - /// - /// true to show the major tic marks (outside the axis), - /// false otherwise - public static bool IsOutside = true; - /// - /// The display mode for the major inside tic marks - /// ( property). - /// The major tic spacing is controlled by . - /// - /// true to show the major tic marks (inside the axis), - /// false otherwise - public static bool IsInside = true; - /// - /// The display mode for the major opposite tic marks - /// ( property). - /// The major tic spacing is controlled by . - /// - /// true to show the major tic marks - /// (inside the axis on the opposite side), - /// false otherwise - public static bool IsOpposite = true; - - /// - /// The default display mode for the major outside - /// "cross" tic marks ( property). - /// - /// - /// The "cross" tics are a special, additional set of tic marks that - /// always appear on the actual axis, even if it has been shifted due - /// to the setting. The other tic marks are always - /// fixed to the edges of the . The cross tics - /// are normally not displayed, since, if is true, - /// they will exactly overlay the "normal" and "inside" tics. If - /// is false, then you will most likely want to - /// enable the cross tics. - /// The major tic spacing is controlled by . - /// - /// true to show the major cross tic marks, false otherwise - public static bool IsCrossOutside = false; - /// - /// The default display mode for the major inside - /// "cross" tic marks ( property). - /// - /// - /// The "cross" tics are a special, additional set of tic marks that - /// always appear on the actual axis, even if it has been shifted due - /// to the setting. The other tic marks are always - /// fixed to the edges of the . The cross tics - /// are normally not displayed, since, if is true, - /// they will exactly overlay the "normal" and "inside" tics. If - /// is false, then you will most likely want to - /// enable the cross tics. - /// The major tic spacing is controlled by . - /// - /// true to show the major cross tic marks, false otherwise - public static bool IsCrossInside = false; - - /// - /// The default color for major tics ( property). - /// - public static Color Color = Color.Black; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Margin.cs b/SDK/ZedGraphs/ZedGraph/Margin.cs deleted file mode 100644 index d623721..0000000 --- a/SDK/ZedGraphs/ZedGraph/Margin.cs +++ /dev/null @@ -1,264 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that handles that stores the margin properties for the GraphPane - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class Margin : ICloneable, ISerializable - { - /// - /// Private fields that store the size of the margin around the edge of the pane which will be - /// kept blank. Use the public properties , , - /// , to access these values. - /// - /// Units are points (1/72 inch) - protected float _left, - _right, - _top, - _bottom; - - #region Constructors - - /// - /// Constructor to build a from the default values. - /// - public Margin() - { - _left = Default.Left; - _right = Default.Right; - _top = Default.Top; - _bottom = Default.Bottom; - } - - /// - /// Copy constructor - /// - /// the instance to be copied. - public Margin( Margin rhs ) - { - _left = rhs._left; - _right = rhs._right; - _top = rhs._top; - _bottom = rhs._bottom; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Margin Clone() - { - return new Margin( this ); - } - - #endregion - - #region Properties - - /// - /// Gets or sets a float value that determines the margin area between the left edge of the - /// rectangle and the features of the graph. - /// - /// This value is in units of points (1/72 inch), and is scaled - /// linearly with the graph size. - /// - /// - /// - /// - /// - public float Left - { - get { return _left; } - set { _left = value; } - } - /// - /// Gets or sets a float value that determines the margin area between the right edge of the - /// rectangle and the features of the graph. - /// - /// This value is in units of points (1/72 inch), and is scaled - /// linearly with the graph size. - /// - /// - /// - /// - /// - public float Right - { - get { return _right; } - set { _right = value; } - } - /// - /// Gets or sets a float value that determines the margin area between the top edge of the - /// rectangle and the features of the graph. - /// - /// This value is in units of points (1/72 inch), and is scaled - /// linearly with the graph size. - /// - /// - /// - /// - /// - public float Top - { - get { return _top; } - set { _top = value; } - } - /// - /// Gets or sets a float value that determines the margin area between the bottom edge of the - /// rectangle and the features of the graph. - /// - /// This value is in units of points (1/72 inch), and is scaled - /// linearly with the graph size. - /// - /// - /// - /// - /// - public float Bottom - { - get { return _bottom; } - set { _bottom = value; } - } - - /// - /// Concurrently sets all outer margin values to a single value. - /// - /// This value is in units of points (1/72 inch), and is scaled - /// linearly with the graph size. - /// - /// - /// - /// - /// - public float All - { - set - { - _bottom = value; - _top = value; - _left = value; - _right = value; - } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Margin( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _left = info.GetSingle( "left" ); - _right = info.GetSingle( "right" ); - _top = info.GetSingle( "top" ); - _bottom = info.GetSingle( "bottom" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - - info.AddValue( "left", _left ); - info.AddValue( "right", _right ); - info.AddValue( "top", _top ); - info.AddValue( "bottom", _bottom ); - } - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the default property values for the class. - /// - public class Default - { - /// - /// The default value for the property, which is - /// the size of the space on the left side of the . - /// - /// Units are points (1/72 inch) - public static float Left = 10.0F; - /// - /// The default value for the property, which is - /// the size of the space on the right side of the . - /// - /// Units are points (1/72 inch) - public static float Right = 10.0F; - /// - /// The default value for the property, which is - /// the size of the space on the top side of the . - /// - /// Units are points (1/72 inch) - public static float Top = 10.0F; - /// - /// The default value for the property, which is - /// the size of the space on the bottom side of the . - /// - /// Units are points (1/72 inch) - public static float Bottom = 10.0F; - - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/MasterPane.cs b/SDK/ZedGraphs/ZedGraph/MasterPane.cs deleted file mode 100644 index 1ea586b..0000000 --- a/SDK/ZedGraphs/ZedGraph/MasterPane.cs +++ /dev/null @@ -1,1179 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Text; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Drawing.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects - /// organized together in some form. - /// - /// - /// John Champion - /// $Revision: 3.26 $ $Date: 2007-11-05 18:28:56 $ - [Serializable] - public class MasterPane : PaneBase, ICloneable, ISerializable, IDeserializationCallback - { - - #region Fields - - /// - /// Private field that holds a collection of objects for inclusion - /// in this . Use the public property - /// to access this collection. - /// - internal PaneList _paneList; - /// - /// Private field that sets the amount of space between the GraphPanes. Use the public property - /// to access this value; - /// - internal float _innerPaneGap; - /// - ///Private field that stores a boolean value which signifies whether all - ///s in the chart use the same entries in their - /// If set to true, only one set of entries will be displayed in - ///this instance. If set to false, this instance will display all - ///entries from all s. - /// - private bool _isUniformLegendEntries; - /// - /// private field that determines if the - /// - /// function will automatically set - /// the of each in the - /// such that the scale factors have the same value. - /// - private bool _isCommonScaleFactor; - - /// - /// private field that saves the paneLayout format specified when - /// was called. This value will - /// default to if - /// (or an overload) was never called. - /// - internal PaneLayout _paneLayout; - - /// - /// Private field that stores the boolean value that determines whether - /// is specifying rows or columns. - /// - internal bool _isColumnSpecified; - /// - /// private field that stores the row/column item count that was specified to the - /// method. This values will be - /// null if was never called. - /// - internal int[] _countList; - - /// - /// private field that stores the row/column size proportional values as specified - /// to the method. This - /// value will be null if - /// was never called. - /// - internal float[] _prop; - -/* /// - /// private field to store the instance, which - /// manages the persistence and handling of pane layout information. - /// - private PaneLayoutMgr _paneLayoutMgr; -*/ - /// - /// private field that determines if anti-aliased drawing will be forced on. Use the - /// public property to access this value. - /// - private bool _isAntiAlias = false; - - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public new struct Default - { - /// - /// The default pane layout for - /// - /// method calls. - /// - /// - /// - /// - /// - /// - public static PaneLayout PaneLayout = PaneLayout.SquareColPreferred; - - /// - /// The default value for the property. - /// This is the size of the margin between adjacent - /// objects, in units of points (1/72 inch). - /// - /// - public static float InnerPaneGap = 10; - - /// - /// The default value for the property for - /// the class. - /// - public static bool IsShowLegend = false; - /// - /// The default value for the property. - /// - public static bool IsUniformLegendEntries = false; - /// - /// The default value for the property. - /// - public static bool IsCommonScaleFactor = false; - } - #endregion - - #region Properties - - /// - /// Gets or sets the collection instance that holds the list of - /// objects that are included in this . - /// - /// - /// - public PaneList PaneList - { - get { return _paneList; } - set { _paneList = value; } - } -/* - /// - /// Gets the instance, which manages the pane layout - /// settings, and handles the layout functions. - /// - /// - /// - /// - /// - /// - public PaneLayoutMgr PaneLayoutMgr - { - get { return _paneLayoutMgr; } - } -*/ - /// - /// Gets or sets the size of the margin between adjacent - /// objects. - /// - /// This property is scaled according to , - /// based on . The default value comes from - /// . - /// - /// The value is in points (1/72nd inch). - public float InnerPaneGap - { - get { return _innerPaneGap; } - set { _innerPaneGap = value; } - } - /// - /// Gets or set the value of the - /// - public bool IsUniformLegendEntries - { - get { return (_isUniformLegendEntries); } - set { _isUniformLegendEntries = value; } - } - - /// - /// Gets or sets a value that determines if the - /// method will automatically set the - /// - /// of each in the such that the - /// scale factors have the same value. - /// - /// - /// The scale factors, calculated by , determine - /// scaled font sizes, tic lengths, etc. This function will insure that for - /// multiple graphpanes, a certain specified font size will be the same for - /// all the panes. - /// - /// - /// - /// - /// - /// - public bool IsCommonScaleFactor - { - get { return _isCommonScaleFactor; } - set { _isCommonScaleFactor = value; } - } - - /// - /// Gets or sets a value that determines if all drawing operations for this - /// will be forced to operate in Anti-alias mode. - /// Note that if this value is set to "true", it overrides the setting for sub-objects. - /// Otherwise, the sub-object settings (such as ) - /// will be honored. - /// - public bool IsAntiAlias - { - get { return _isAntiAlias; } - set { _isAntiAlias = value; } - } - - #endregion - - #region Constructors - - /// - /// Default constructor for the class. Sets the to (0, 0, 500, 375). - /// - public MasterPane() : this( "", new RectangleF( 0, 0, 500, 375 ) ) - { - } - - /// - /// Default constructor for the class. Specifies the of - /// the , and the size of the . - /// - public MasterPane( string title, RectangleF paneRect ) : base( title, paneRect ) - { - _innerPaneGap = Default.InnerPaneGap; - - //_paneLayoutMgr = new PaneLayoutMgr(); - - _isUniformLegendEntries = Default.IsUniformLegendEntries ; - _isCommonScaleFactor = Default.IsCommonScaleFactor; - - _paneList = new PaneList(); - - _legend.IsVisible = Default.IsShowLegend; - - _isAntiAlias = false; - - InitLayout(); - } - - private void InitLayout() - { - _paneLayout = Default.PaneLayout; - _countList = null; - _isColumnSpecified = false; - _prop = null; - } - - /// - /// The Copy Constructor - Make a deep-copy clone of this class instance. - /// - /// The object from which to copy - public MasterPane( MasterPane rhs ) : base( rhs ) - { - // copy all the value types - //_paneLayoutMgr = rhs._paneLayoutMgr.Clone(); - _innerPaneGap = rhs._innerPaneGap; - _isUniformLegendEntries = rhs._isUniformLegendEntries; - _isCommonScaleFactor = rhs._isCommonScaleFactor; - - // Then, fill in all the reference types with deep copies - _paneList = rhs._paneList.Clone(); - - _paneLayout = rhs._paneLayout; - _countList = rhs._countList; - _isColumnSpecified = rhs._isColumnSpecified; - _prop = rhs._prop; - _isAntiAlias = rhs._isAntiAlias; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of to make a deep copy. - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public MasterPane Clone() - { - return new MasterPane( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - // schema changed to 2 with addition of 'prop' - // schema changed to 11 with addition of 'isAntiAlias' - public const int schema2 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected MasterPane( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _paneList = (PaneList) info.GetValue( "paneList", typeof(PaneList) ); - //_paneLayoutMgr = (PaneLayoutMgr) info.GetValue( "paneLayoutMgr", typeof(PaneLayoutMgr) ); - _innerPaneGap = info.GetSingle( "innerPaneGap" ); - - _isUniformLegendEntries = info.GetBoolean( "isUniformLegendEntries" ); - _isCommonScaleFactor = info.GetBoolean( "isCommonScaleFactor" ); - - _paneLayout = (PaneLayout)info.GetValue( "paneLayout", typeof( PaneLayout ) ); - _countList = (int[])info.GetValue( "countList", typeof( int[] ) ); - - _isColumnSpecified = info.GetBoolean( "isColumnSpecified" ); - _prop = (float[])info.GetValue( "prop", typeof( float[] ) ); - - if ( sch >= 11 ) - _isAntiAlias = info.GetBoolean( "isAntiAlias" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - - info.AddValue( "paneList", _paneList ); - //info.AddValue( "paneLayoutMgr", _paneLayoutMgr ); - info.AddValue( "innerPaneGap", _innerPaneGap ); - - info.AddValue( "isUniformLegendEntries", _isUniformLegendEntries ); - info.AddValue( "isCommonScaleFactor", _isCommonScaleFactor ); - - info.AddValue( "paneLayout", _paneLayout ); - info.AddValue( "countList", _countList ); - info.AddValue( "isColumnSpecified", _isColumnSpecified ); - info.AddValue( "prop", _prop ); - - info.AddValue( "isAntiAlias", _isAntiAlias ); - } - - /// - /// Respond to the callback when the MasterPane objects are fully initialized. - /// - /// - public void OnDeserialization(object sender) - { - Bitmap bitmap = new Bitmap( 10, 10 ); - Graphics g = Graphics.FromImage( bitmap ); - ReSize( g, _rect ); - } - #endregion - - #region List Methods - /// - /// Indexer to access the specified object from - /// by its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public GraphPane this[ int index ] - { - get { return( (GraphPane) _paneList[index] ); } - set { _paneList[index] = value; } - } - - /// - /// Indexer to access the specified object from - /// by its string. - /// - /// The string title of the - /// object to be accessed. - /// A object reference. - public GraphPane this[ string title ] - { - get { return _paneList[title]; } - } - - /// - /// Add a object to the collection at the end of the list. - /// - /// A reference to the object to - /// be added - /// - public void Add( GraphPane pane ) - { - _paneList.Add( pane ); - } - - /// - /// Call for all objects in the - /// list. - /// - /// - /// This overload of AxisChange just uses the default Graphics instance for the screen. - /// If you have a Graphics instance available from your Windows Form, you should use - /// the overload instead. - /// - public void AxisChange() - { - using ( Graphics g = Graphics.FromHwnd( IntPtr.Zero ) ) - AxisChange( g ); - } - - /// - /// Call for all objects in the - /// list. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - public void AxisChange( Graphics g ) - { - foreach ( GraphPane pane in _paneList ) - pane.AxisChange( g ); - } - - /// - /// Redo the layout using the current size of the , - /// and also handle resizing the - /// contents by calling . - /// - /// This method will use the pane layout that was specified by a call to - /// . If - /// has not previously been called, - /// it will default to . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// - /// - /// - public void ReSize( Graphics g ) - { - ReSize( g, _rect ); - } - - /// - /// Change the size of the , and also handle resizing the - /// contents by calling . - /// - /// This method will use the pane layout that was specified by a call to - /// . If - /// has not previously been called, - /// it will default to . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// - /// - /// - /// - public override void ReSize( Graphics g, RectangleF rect ) - { - _rect = rect; - DoLayout( g ); - CommonScaleFactor(); - } - - /// - /// Method that forces the scale factor calculations - /// (via ), - /// to give a common scale factor for all objects in the - /// . - /// - /// - /// This will make it such that a given font size will result in the same output font - /// size for all 's. Note that this does not make the scale - /// factor for the 's the same as that of the - /// . - /// - /// - public void CommonScaleFactor() - { - if ( _isCommonScaleFactor ) - { - // Find the maximum scaleFactor of all the GraphPanes - float maxFactor = 0; - foreach ( GraphPane pane in PaneList ) - { - pane.BaseDimension = PaneBase.Default.BaseDimension; - float scaleFactor = pane.CalcScaleFactor(); - maxFactor = scaleFactor > maxFactor ? scaleFactor : maxFactor; - } - - // Now, calculate the base dimension - foreach ( GraphPane pane in PaneList ) - { - float scaleFactor = pane.CalcScaleFactor(); - pane.BaseDimension *= scaleFactor / maxFactor; - } - } - } - - /// - /// Render all the objects in the to the - /// specified graphics device. - /// - /// This method should be part of the Paint() update process. Calling this routine - /// will redraw all - /// features of all the items. No preparation is required other than - /// instantiated objects that have been added to the list with the - /// method. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - public override void Draw( Graphics g ) - { - // Save current AntiAlias mode - SmoothingMode sModeSave = g.SmoothingMode; - TextRenderingHint sHintSave = g.TextRenderingHint; - CompositingQuality sCompQual = g.CompositingQuality; - InterpolationMode sInterpMode = g.InterpolationMode; - - SetAntiAliasMode( g, _isAntiAlias ); - - // Draw the pane border & background fill, the title, and the GraphObj objects that lie at - // ZOrder.GBehindAll - base.Draw( g ); - - if ( _rect.Width <= 1 || _rect.Height <= 1 ) - return; - - float scaleFactor = CalcScaleFactor(); - - // Clip everything to the rect - g.SetClip( _rect ); - - // For the MasterPane, All GraphItems go behind the GraphPanes, except those that - // are explicity declared as ZOrder.AInFront - _graphObjList.Draw( g, this, scaleFactor, ZOrder.G_BehindChartFill ); - _graphObjList.Draw( g, this, scaleFactor, ZOrder.E_BehindCurves ); - _graphObjList.Draw( g, this, scaleFactor, ZOrder.D_BehindAxis ); - _graphObjList.Draw( g, this, scaleFactor, ZOrder.C_BehindChartBorder ); - - // Reset the clipping - g.ResetClip(); - - foreach ( GraphPane pane in _paneList ) - pane.Draw( g ); - - // Clip everything to the rect - g.SetClip( _rect ); - - _graphObjList.Draw( g, this, scaleFactor, ZOrder.B_BehindLegend ); - - // Recalculate the legend rect, just in case it has not yet been done - // innerRect is the area for the GraphPane's - RectangleF innerRect = CalcClientRect( g, scaleFactor ); - _legend.CalcRect( g, this, scaleFactor, ref innerRect ); - //this.legend.SetLocation( this, - - _legend.Draw( g, this, scaleFactor ); - - _graphObjList.Draw( g, this, scaleFactor, ZOrder.A_InFront ); - - // Reset the clipping - g.ResetClip(); - - // Restore original anti-alias mode - g.SmoothingMode = sModeSave; - g.TextRenderingHint = sHintSave; - g.CompositingQuality = sCompQual; - g.InterpolationMode = sInterpMode; - - } - - /// - /// Find the pane and the object within that pane that lies closest to the specified - /// mouse (screen) point. - /// - /// - /// This method first finds the within the list that contains - /// the specified mouse point. It then calls the - /// method to determine which object, if any, was clicked. With the exception of the - /// , all the parameters in this method are identical to those - /// in the method. - /// If the mouse point lies within the of any - /// item, then that pane will be returned (otherwise it will be - /// null). Further, within the selected pane, if the mouse point is within the - /// bounding box of any of the items (or in the case - /// of and , within - /// pixels), then the object will be returned. - /// You must check the type of the object to determine what object was - /// selected (for example, "if ( object is Legend ) ..."). The - /// parameter returns the index number of the item - /// within the selected object (such as the point number within a - /// object. - /// - /// The screen point, in pixel coordinates. - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// A reference to the object that was clicked. - /// A reference to the nearest object to the - /// specified screen point. This can be any of , - /// , , - /// , , or . - /// Note: If the pane title is selected, then the object - /// will be returned. - /// - /// The index number of the item within the selected object - /// (where applicable). For example, for a object, - /// will be the index number of the nearest data point, - /// accessible via CurveItem.Points[index]. - /// index will be -1 if no data points are available. - /// true if a was found, false otherwise. - /// - public bool FindNearestPaneObject( PointF mousePt, Graphics g, out GraphPane pane, - out object nearestObj, out int index ) - { - pane = null; - nearestObj = null; - index = -1; - - GraphObj saveGraphItem = null; - int saveIndex = -1; - float scaleFactor = CalcScaleFactor(); - - // See if the point is in a GraphObj - // If so, just save the object and index so we can see if other overlying objects were - // intersected as well. - if ( this.GraphObjList.FindPoint( mousePt, this, g, scaleFactor, out index ) ) - { - saveGraphItem = this.GraphObjList[index]; - saveIndex = index; - - // If it's an "In-Front" item, then just return it - if ( saveGraphItem.ZOrder == ZOrder.A_InFront ) - { - nearestObj = saveGraphItem; - index = saveIndex; - return true; - } - } - - foreach ( GraphPane tPane in _paneList ) - { - if ( tPane.Rect.Contains( mousePt ) ) - { - pane = tPane; - return tPane.FindNearestObject( mousePt, g, out nearestObj, out index ); - } - } - - // If no items were found in the GraphPanes, then return the item found on the MasterPane (if any) - if ( saveGraphItem != null ) - { - nearestObj = saveGraphItem; - index = saveIndex; - return true; - } - - return false; - } - - /// - /// Find the within the that contains the - /// within its . - /// - /// The mouse point location where you want to search - /// A object that contains the mouse point, or - /// null if no was found. - public GraphPane FindPane( PointF mousePt ) - { - foreach ( GraphPane pane in _paneList ) - { - if ( pane.Rect.Contains( mousePt ) ) - return pane; - } - - return null; - } - - /// - /// Find the within the that contains the - /// within its . - /// - /// The mouse point location where you want to search - /// A object that contains the mouse point, or - /// null if no was found. - public GraphPane FindChartRect( PointF mousePt ) - { - foreach ( GraphPane pane in _paneList ) - { - if ( pane.Chart._rect.Contains( mousePt ) ) - return pane; - } - - return null; - } - - #endregion - - #region Layout Methods - - /// The SetLayout() methods setup the desired layout of the - /// objects within a . These functions - /// do not make any changes, they merely set the parameters so that future calls - /// to or - /// will use the desired layout.

- /// The layout options include a set of "canned" layouts provided by the - /// enumeration, options to just set a specific - /// number of rows and columns of panes (and all pane sizes are the same), and more - /// customized options of specifying the number or rows in each column or the number of - /// columns in each row, along with proportional values that determine the size of each - /// individual column or row. - ///
- /// - /// Automatically set all of the 's in - /// the list to a pre-defined layout configuration from a - /// enumeration. - /// - /// This method uses a enumeration to describe the type of layout - /// to be used. Overloads are available that provide other layout options - /// A enumeration that describes how - /// the panes should be laid out within the . - /// - /// A graphic device object to be drawn into. This is normally created with a call to - /// the CreateGraphics() method of the Control or Form. - /// - /// - /// - /// - public void SetLayout( Graphics g, PaneLayout paneLayout ) - { - InitLayout(); - - _paneLayout = paneLayout; - - DoLayout( g ); - } - - /// - /// Automatically set all of the 's in - /// the list to a reasonable configuration. - /// - /// This method explicitly specifies the number of rows and columns to use - /// in the layout, and all objects will have the same size. - /// Overloads are available that provide other layout options - /// - /// A graphic device object to be drawn into. This is normally created with a call to - /// the CreateGraphics() method of the Control or Form. - /// - /// The number of rows of objects - /// to include in the layout - /// The number of columns of objects - /// to include in the layout - /// - /// - /// - public void SetLayout( Graphics g, int rows, int columns ) - { - InitLayout(); - - if ( rows < 1 ) - rows = 1; - if ( columns < 1 ) - columns = 1; - - int[] countList = new int[rows]; - - for ( int i = 0; i < rows; i++ ) - countList[i] = columns; - - SetLayout( g, true, countList, null ); - } - - /// - /// Automatically set all of the 's in - /// the list to the specified configuration. - /// - /// This method specifies the number of rows in each column, or the number of - /// columns in each row, allowing for irregular layouts. Overloads are available that - /// provide other layout options. - /// - /// - /// A graphic device object to be drawn into. This is normally created with a call to - /// the CreateGraphics() method of the Control or Form. - /// - /// Specifies whether the number of columns in each row, or - /// the number of rows in each column will be specified. A value of true indicates the - /// number of columns in each row are specified in . - /// An integer array specifying either the number of columns in - /// each row or the number of rows in each column, depending on the value of - /// . - /// - /// - /// - public void SetLayout( Graphics g, bool isColumnSpecified, int[] countList ) - { - SetLayout( g, isColumnSpecified, countList, null ); - } - - /// - /// Automatically set all of the 's in - /// the list to the specified configuration. - /// - /// This method specifies the number of panes in each row or column, allowing for - /// irregular layouts. - /// This method specifies the number of rows in each column, or the number of - /// columns in each row, allowing for irregular layouts. Additionally, a - /// parameter is provided that allows varying column or - /// row sizes. Overloads for SetLayout() are available that provide other layout options. - /// - /// - /// A graphic device object to be drawn into. This is normally created with a call to - /// the CreateGraphics() method of the Control or Form. - /// - /// Specifies whether the number of columns in each row, or - /// the number of rows in each column will be specified. A value of true indicates the - /// number of columns in each row are specified in . - /// An integer array specifying either the number of columns in - /// each row or the number of rows in each column, depending on the value of - /// . - /// An array of float values specifying proportional sizes for each - /// row or column. Note that these proportions apply to the non-specified dimension -- that is, - /// if is true, then these proportions apply to the row - /// heights, and if is false, then these proportions apply - /// to the column widths. The values in this array are arbitrary floats -- the dimension of - /// any given row or column is that particular proportional value divided by the sum of all - /// the values. For example, let be true, and - /// is an array with values of { 1.0, 2.0, 3.0 }. The sum of - /// those values is 6.0. Therefore, the first row is 1/6th of the available height, the - /// second row is 2/6th's of the available height, and the third row is 3/6th's of the - /// available height. - /// - /// - /// - /// - public void SetLayout( Graphics g, bool isColumnSpecified, int[] countList, float[] proportion ) - { - InitLayout(); - - // use defaults if the parameters are invalid - if ( countList != null && countList.Length > 0 ) - { - _prop = new float[countList.Length]; - - // Sum up the total proportional factors - float sumProp = 0.0f; - for ( int i = 0; i < countList.Length; i++ ) - { - _prop[i] = ( proportion == null || proportion.Length <= i || proportion[i] < 1e-10 ) ? - 1.0f : proportion[i]; - sumProp += _prop[i]; - } - - // Make prop sum to 1.0 - for ( int i = 0; i < countList.Length; i++ ) - _prop[i] /= sumProp; - - _isColumnSpecified = isColumnSpecified; - _countList = countList; - - DoLayout( g ); - } - } - - /// - /// Modify the sizes of each - /// such that they fit within the - /// in a pre-configured layout. - /// - /// The method (and overloads) is - /// used for setting the layout configuration. - /// - /// - /// - /// - public void DoLayout( Graphics g ) - { - if ( _countList != null ) - DoLayout( g, _isColumnSpecified, _countList, _prop ); - else - { - int count = _paneList.Count; - if ( count == 0 ) - return; - - int rows, - cols, - root = (int)( Math.Sqrt( (double)count ) + 0.9999999 ); - - //float[] widthList = new float[5]; - - switch ( _paneLayout ) - { - case PaneLayout.ForceSquare: - rows = root; - cols = root; - DoLayout( g, rows, cols ); - break; - case PaneLayout.SingleColumn: - rows = count; - cols = 1; - DoLayout( g, rows, cols ); - break; - case PaneLayout.SingleRow: - rows = 1; - cols = count; - DoLayout( g, rows, cols ); - break; - default: - case PaneLayout.SquareColPreferred: - rows = root; - cols = root; - if ( count <= root * ( root - 1 ) ) - rows--; - DoLayout( g, rows, cols ); - break; - case PaneLayout.SquareRowPreferred: - rows = root; - cols = root; - if ( count <= root * ( root - 1 ) ) - cols--; - DoLayout( g, rows, cols ); - break; - case PaneLayout.ExplicitCol12: - DoLayout( g, true, new int[2] { 1, 2 }, null ); - break; - case PaneLayout.ExplicitCol21: - DoLayout( g, true, new int[2] { 2, 1 }, null ); - break; - case PaneLayout.ExplicitCol23: - DoLayout( g, true, new int[2] { 2, 3 }, null ); - break; - case PaneLayout.ExplicitCol32: - DoLayout( g, true, new int[2] { 3, 2 }, null ); - break; - case PaneLayout.ExplicitRow12: - DoLayout( g, false, new int[2] { 1, 2 }, null ); - break; - case PaneLayout.ExplicitRow21: - DoLayout( g, false, new int[2] { 2, 1 }, null ); - break; - case PaneLayout.ExplicitRow23: - DoLayout( g, false, new int[2] { 2, 3 }, null ); - break; - case PaneLayout.ExplicitRow32: - DoLayout( g, false, new int[2] { 3, 2 }, null ); - break; - } - } - } - - /// - /// Internal method that applies a previously set layout with a specific - /// row and column count. This method is only called by - /// . - /// - internal void DoLayout( Graphics g, int rows, int columns ) - { - if ( rows < 1 ) - rows = 1; - if ( columns < 1 ) - columns = 1; - - int[] countList = new int[rows]; - - for ( int i = 0; i < rows; i++ ) - countList[i] = columns; - - DoLayout( g, true, countList, null ); - } - - /// - /// Internal method that applies a previously set layout with a rows per column or - /// columns per row configuration. This method is only called by - /// . - /// - internal void DoLayout( Graphics g, bool isColumnSpecified, int[] countList, - float[] proportion ) - { - - // calculate scaleFactor on "normal" pane size (BaseDimension) - float scaleFactor = CalcScaleFactor(); - - // innerRect is the area for the GraphPane's - RectangleF innerRect = CalcClientRect( g, scaleFactor ); - _legend.CalcRect( g, this, scaleFactor, ref innerRect ); - - // scaled InnerGap is the area between the GraphPane.Rect's - float scaledInnerGap = (float)( _innerPaneGap * scaleFactor ); - - int iPane = 0; - - if ( isColumnSpecified ) - { - int rows = countList.Length; - - float y = 0.0f; - - for ( int rowNum = 0; rowNum < rows; rowNum++ ) - { - float propFactor = _prop == null ? 1.0f / rows : _prop[rowNum]; - - float height = ( innerRect.Height - (float)( rows - 1 ) * scaledInnerGap ) * - propFactor; - - int columns = countList[rowNum]; - if ( columns <= 0 ) - columns = 1; - float width = ( innerRect.Width - (float)( columns - 1 ) * scaledInnerGap ) / - (float)columns; - - for ( int colNum = 0; colNum < columns; colNum++ ) - { - if ( iPane >= _paneList.Count ) - return; - - this[iPane].Rect = new RectangleF( - innerRect.X + colNum * ( width + scaledInnerGap ), - innerRect.Y + y, - width, - height ); - iPane++; - } - - y += height + scaledInnerGap; - } - } - else - { - int columns = countList.Length; - - float x = 0.0f; - - for ( int colNum = 0; colNum < columns; colNum++ ) - { - float propFactor = _prop == null ? 1.0f / columns : _prop[colNum]; - - float width = ( innerRect.Width - (float)( columns - 1 ) * scaledInnerGap ) * - propFactor; - - int rows = countList[colNum]; - if ( rows <= 0 ) - rows = 1; - float height = ( innerRect.Height - (float)( rows - 1 ) * scaledInnerGap ) / (float)rows; - - for ( int rowNum = 0; rowNum < rows; rowNum++ ) - { - if ( iPane >= _paneList.Count ) - return; - - this[iPane].Rect = new RectangleF( - innerRect.X + x, - innerRect.Y + rowNum * ( height + scaledInnerGap ), - width, - height ); - iPane++; - } - - x += width + scaledInnerGap; - } - } - } - - /* - /// - /// Automatically set all of the 's in - /// the list to a reasonable configuration. - /// - /// This method explicitly specifies the number of rows and columns to use in the layout. - /// A more automatic overload, using a enumeration, is available. - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The number of rows of objects - /// to include in the layout - /// The number of columns of objects - /// to include in the layout - public void DoPaneLayout( Graphics g, int rows, int columns ) - { - // save the layout settings for future reference - _countList = null; - _rows = rows; - _columns = columns; - - // calculate scaleFactor on "normal" pane size (BaseDimension) - float scaleFactor = this.CalcScaleFactor(); - - // innerRect is the area for the GraphPane's - RectangleF innerRect = CalcClientRect( g, scaleFactor ); - _legend.CalcRect( g, this, scaleFactor, ref innerRect ); - - // scaled InnerGap is the area between the GraphPane.Rect's - float scaledInnerGap = (float)( _innerPaneGap * scaleFactor ); - - float width = ( innerRect.Width - (float)( columns - 1 ) * scaledInnerGap ) / (float)columns; - float height = ( innerRect.Height - (float)( rows - 1 ) * scaledInnerGap ) / (float)rows; - - int i = 0; - foreach ( GraphPane pane in _paneList ) - { - float rowNum = (float)( i / columns ); - float colNum = (float)( i % columns ); - - pane.Rect = new RectangleF( - innerRect.X + colNum * ( width + scaledInnerGap ), - innerRect.Y + rowNum * ( height + scaledInnerGap ), - width, - height ); - - i++; - } - } - */ - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/MinorGrid.cs b/SDK/ZedGraphs/ZedGraph/MinorGrid.cs deleted file mode 100644 index 28fe73c..0000000 --- a/SDK/ZedGraphs/ZedGraph/MinorGrid.cs +++ /dev/null @@ -1,294 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that holds the specific properties for the minor grid. - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class MinorGrid : ICloneable, ISerializable - { - internal bool _isVisible; - - internal float _dashOn, - _dashOff, - _penWidth; - - internal Color _color; - - - #region Constructors - - /// - /// Default constructor - /// - public MinorGrid() - { - _dashOn = Default.DashOn; - _dashOff = Default.DashOff; - _penWidth = Default.PenWidth; - _isVisible = Default.IsVisible; - _color = Default.Color; - } - - /// - /// Copy constructor - /// - /// The source to be copied. - public MinorGrid( MinorGrid rhs ) - { - _dashOn = rhs._dashOn; - _dashOff = rhs._dashOff; - _penWidth = rhs._penWidth; - - _isVisible = rhs._isVisible; - - _color = rhs._color; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public MinorGrid Clone() - { - return new MinorGrid( this ); - } - - #endregion - - #region Properties - - /// - /// Gets or sets a value that determines if the major gridlines - /// (at each labeled value) will be visible - /// - /// true to show the gridlines, false otherwise - /// Default.IsShowGrid. - /// - /// - /// - /// - /// - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - - /// - /// The "Dash On" mode for drawing the grid. - /// - /// - /// This is the distance, - /// in points (1/72 inch), of the dash segments that make up the dashed grid lines. - /// - /// The dash on length is defined in points (1/72 inch) - /// - /// - /// . - public float DashOn - { - get { return _dashOn; } - set { _dashOn = value; } - } - /// - /// The "Dash Off" mode for drawing the grid. - /// - /// - /// This is the distance, - /// in points (1/72 inch), of the spaces between the dash segments that make up - /// the dashed grid lines. - /// - /// The dash off length is defined in points (1/72 inch) - /// - /// - /// . - public float DashOff - { - get { return _dashOff; } - set { _dashOff = value; } - } - /// - /// The pen width used for drawing the grid lines. - /// - /// The grid pen width is defined in points (1/72 inch) - /// - /// . - /// - public float PenWidth - { - get { return _penWidth; } - set { _penWidth = value; } - } - /// - /// The color to use for drawing this grid. - /// - /// The color is defined using the - /// class - /// . - /// - public Color Color - { - get { return _color; } - set { _color = value; } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected MinorGrid( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _isVisible = info.GetBoolean( "isVisible" ); - - _dashOn = info.GetSingle( "dashOn" ); - _dashOff = info.GetSingle( "dashOff" ); - _penWidth = info.GetSingle( "penWidth" ); - - _color = (Color)info.GetValue( "color", typeof( Color ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - - info.AddValue( "isVisible", _isVisible ); - - info.AddValue( "dashOn", _dashOn ); - info.AddValue( "dashOff", _dashOff ); - info.AddValue( "penWidth", _penWidth ); - - info.AddValue( "color", _color ); - } - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default "dash on" size for drawing the minor grid - /// ( property). Units are in points (1/72 inch). - /// - public static float DashOn = 1.0F; - /// - /// The default "dash off" size for drawing the minor grid - /// ( property). Units are in points (1/72 inch). - /// - public static float DashOff = 10.0F; - /// - /// The default pen width for drawing the minor grid - /// ( property). Units are in points (1/72 inch). - /// - public static float PenWidth = 1.0F; - /// - /// The default color for the minor grid lines - /// ( property). This color only affects the - /// minor grid lines. - /// - public static Color Color = Color.Gray; - - /// - /// The default display mode for the minor grid lines - /// ( property). true - /// to show the minor grid lines, false to hide them. - /// - public static bool IsVisible = false; - - } - - #endregion - - #region Methods - - internal void Draw( Graphics g, Pen pen, float pixVal, float topPix ) - { - // draw the minor grid - if ( _isVisible ) - g.DrawLine( pen, pixVal, 0.0F, pixVal, topPix ); - } - - internal Pen GetPen( GraphPane pane, float scaleFactor ) - { - Pen pen = new Pen( _color, - pane.ScaledPenWidth( _penWidth, scaleFactor ) ); - - if ( _dashOff > 1e-10 && _dashOn > 1e-10 ) - { - pen.DashStyle = DashStyle.Custom; - float[] pattern = new float[2]; - pattern[0] = _dashOn; - pattern[1] = _dashOff; - pen.DashPattern = pattern; - } - - return pen; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/MinorTic.cs b/SDK/ZedGraphs/ZedGraph/MinorTic.cs deleted file mode 100644 index 773a21e..0000000 --- a/SDK/ZedGraphs/ZedGraph/MinorTic.cs +++ /dev/null @@ -1,501 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Class that holds the specific properties for the minor tics. - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class MinorTic : ICloneable, ISerializable - { - internal bool _isOutside, - _isInside, - _isOpposite, - _isCrossOutside, - _isCrossInside; - - internal float _penWidth, - _size; - - internal Color _color; - - #region Constructors - - /// - /// Default Constructor - /// - public MinorTic() - { - _size = Default.Size; - _color = Default.Color; - _penWidth = Default.PenWidth; - - this.IsOutside = Default.IsOutside; - this.IsInside = Default.IsInside; - this.IsOpposite = Default.IsOpposite; - _isCrossOutside = Default.IsCrossOutside; - _isCrossInside = Default.IsCrossInside; - } - - /// - /// Copy constructor. - /// - /// The that is to be copied. - public MinorTic( MinorTic rhs ) - { - _size = rhs._size; - _color = rhs._color; - _penWidth = rhs._penWidth; - - this.IsOutside = rhs.IsOutside; - this.IsInside = rhs.IsInside; - this.IsOpposite = rhs.IsOpposite; - _isCrossOutside = rhs._isCrossOutside; - _isCrossInside = rhs._isCrossInside; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public MinorTic Clone() - { - return new MinorTic( this ); - } - - #endregion - - #region Properties - - /// - /// The color to use for drawing the tics of this class instance - /// - /// The color is defined using the - /// class - /// . - /// - /// - public Color Color - { - get { return _color; } - set { _color = value; } - } - - /// - /// The length of the major tic marks. - /// - /// - /// This length will be scaled - /// according to the for the - /// - /// - /// The tic size is measured in points (1/72 inch) - /// . - /// - /// - /// - public float Size - { - get { return _size; } - set { _size = value; } - } - /// - /// Calculate the scaled tic size for this - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The scaled tic size, in points (1/72 inch) - /// - /// - /// - public float ScaledTic( float scaleFactor ) - { - return (float)( _size * scaleFactor ); - } - - /// - /// This is convenience property sets the status of all the different - /// tic properties in this instance to the same value. true to activate all tics, - /// false to clear all tics. - /// - /// - /// This setting does not persist. That is, you can clear all the tics with - /// = false, then activate them individually (example: - /// = true). - /// - /// - /// - /// - /// - /// - public bool IsAllTics - { - set - { - this.IsOutside = value; - this.IsInside = value; - this.IsOpposite = value; - _isCrossOutside = value; - _isCrossInside = value; - } - } - - /// - /// Gets or sets a property that determines whether or not the minor outside tic marks - /// are shown. - /// - /// - /// These are the tic marks on the outside of the border. - /// The minor tic spacing is controlled by . - /// - /// true to show the minor outside tic marks, false otherwise - /// . - /// - /// - /// - /// - /// - public bool IsOutside - { - get { return _isOutside; } - set { _isOutside = value; } - } - - /// - /// Gets or sets a property that determines whether or not the major inside tic marks - /// are shown. - /// - /// - /// These are the tic marks on the inside of the border. - /// The major tic spacing is controlled by . - /// - /// true to show the major inside tic marks, false otherwise - /// . - /// - /// - /// - /// - /// - public bool IsInside - { - get { return _isInside; } - set { _isInside = value; } - } - - /// - /// Gets or sets a property that determines whether or not the major opposite tic marks - /// are shown. - /// - /// - /// These are the tic marks on the inside of the border on - /// the opposite side from the axis. - /// The major tic spacing is controlled by . - /// - /// true to show the major opposite tic marks, false otherwise - /// . - /// - /// - /// - /// - /// - public bool IsOpposite - { - get { return _isOpposite; } - set { _isOpposite = value; } - } - - /// - /// Gets or sets the display mode for the major outside - /// "cross" tic marks. - /// - /// - /// The "cross" tics are a special, additional set of tic marks that - /// always appear on the actual axis, even if it has been shifted due - /// to the setting. The other tic marks are always - /// fixed to the edges of the . The cross tics - /// are normally not displayed, since, if is true, - /// they will exactly overlay the "normal" and "inside" tics. If - /// is false, then you will most likely want to - /// enable the cross tics. - /// The major tic spacing is controlled by . - /// - /// true to show the major cross tic marks, false otherwise - public bool IsCrossOutside - { - get { return _isCrossOutside; } - set { _isCrossOutside = value; } - } - /// - /// Gets or sets the display mode for the major inside - /// "cross" tic marks. - /// - /// - /// The "cross" tics are a special, additional set of tic marks that - /// always appear on the actual axis, even if it has been shifted due - /// to the setting. The other tic marks are always - /// fixed to the edges of the . The cross tics - /// are normally not displayed, since, if is true, - /// they will exactly overlay the "normal" and "inside" tics. If - /// is false, then you will most likely want to - /// enable the cross tics. - /// The major tic spacing is controlled by . - /// - /// true to show the major cross tic marks, false otherwise - public bool IsCrossInside - { - get { return _isCrossInside; } - set { _isCrossInside = value; } - } - - /// - /// Gets or sets the pen width to be used when drawing the tic marks for - /// this - /// - /// The pen width is defined in points (1/72 inch) - /// . - /// - /// - public float PenWidth - { - get { return _penWidth; } - set { _penWidth = value; } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected MinorTic( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _color = (Color) info.GetValue( "color", typeof( Color ) ); - _size = info.GetSingle( "size" ); - _penWidth = info.GetSingle( "penWidth" ); - - IsOutside = info.GetBoolean( "IsOutside" ); - IsInside = info.GetBoolean( "IsInside" ); - IsOpposite = info.GetBoolean( "IsOpposite" ); - _isCrossOutside = info.GetBoolean( "isCrossOutside" ); - _isCrossInside = info.GetBoolean( "isCrossInside" ); - } - - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - - info.AddValue( "color", _color ); - info.AddValue( "size", _size ); - info.AddValue( "penWidth", _penWidth ); - - info.AddValue( "IsOutside", IsOutside ); - info.AddValue( "IsInside", IsInside ); - info.AddValue( "IsOpposite", IsOpposite ); - info.AddValue( "isCrossOutside", _isCrossOutside ); - info.AddValue( "isCrossInside", _isCrossInside ); - - } - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default size for the minor tic marks. - /// ( property). Units are in points (1/72 inch). - /// - public static float Size = 2.5F; - /// - /// The default pen width for drawing the tic marks. - /// ( property). Units are in points (1/72 inch). - /// - public static float PenWidth = 1.0F; - /// - /// The display mode for the minor outside tic marks - /// ( property). - /// The minor tic spacing is controlled by . - /// - /// true to show the minor tic marks (outside the axis), - /// false otherwise - public static bool IsOutside = true; - /// - /// The display mode for the minor inside tic marks - /// ( property). - /// The minor tic spacing is controlled by . - /// - /// true to show the minor tic marks (inside the axis), - /// false otherwise - public static bool IsInside = true; - /// - /// The display mode for the minor opposite tic marks - /// ( property). - /// The minor tic spacing is controlled by . - /// - /// true to show the minor tic marks - /// (inside the axis on the opposite side), - /// false otherwise - public static bool IsOpposite = true; - - /// - /// The default display mode for the minor outside - /// "cross" tic marks ( property). - /// - /// - /// The "cross" tics are a special, additional set of tic marks that - /// always appear on the actual axis, even if it has been shifted due - /// to the setting. The other tic marks are always - /// fixed to the edges of the . The cross tics - /// are normally not displayed, since, if is true, - /// they will exactly overlay the "normal" and "inside" tics. If - /// is false, then you will most likely want to - /// enable the cross tics. - /// The minor tic spacing is controlled by . - /// - /// true to show the major cross tic marks, false otherwise - public static bool IsCrossOutside = false; - /// - /// The default display mode for the minor inside - /// "cross" tic marks ( property). - /// - /// - /// The "cross" tics are a special, additional set of tic marks that - /// always appear on the actual axis, even if it has been shifted due - /// to the setting. The other tic marks are always - /// fixed to the edges of the . The cross tics - /// are normally not displayed, since, if is true, - /// they will exactly overlay the "normal" and "inside" tics. If - /// is false, then you will most likely want to - /// enable the cross tics. - /// The major tic spacing is controlled by . - /// - /// true to show the major cross tic marks, false otherwise - public static bool IsCrossInside = false; - - /// - /// The default color for minor tics ( property). - /// - public static Color Color = Color.Black; - } - - #endregion - - #region Methods - - /// - /// Draw a tic mark at the specified single position. This includes the inner, outer, - /// cross and opposite tic marks as required. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// Graphic with which to draw the tic mark. - /// The pixel location of the tic mark on this - /// - /// The pixel value of the top of the axis border - /// The number of pixels to shift this axis, based on the - /// value of . A positive value is into the ChartRect relative to - /// the default axis position. - /// The scaled size of a minor tic, in pixel units - internal void Draw( Graphics g, GraphPane pane, Pen pen, float pixVal, float topPix, - float shift, float scaledTic ) - { - // draw the outside tic - if ( this.IsOutside ) - g.DrawLine( pen, pixVal, shift, pixVal, shift + scaledTic ); - - // draw the cross tic - if ( _isCrossOutside ) - g.DrawLine( pen, pixVal, 0.0f, pixVal, scaledTic ); - - // draw the inside tic - if ( this.IsInside ) - g.DrawLine( pen, pixVal, shift, pixVal, shift - scaledTic ); - - // draw the inside cross tic - if ( _isCrossInside ) - g.DrawLine( pen, pixVal, 0.0f, pixVal, -scaledTic ); - - // draw the opposite tic - if ( this.IsOpposite ) - g.DrawLine( pen, pixVal, topPix, pixVal, topPix + scaledTic ); - } - - internal Pen GetPen( GraphPane pane, float scaleFactor ) - { - return new Pen( _color, pane.ScaledPenWidth( _penWidth, scaleFactor ) ); - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/NoDupePointList.cs b/SDK/ZedGraphs/ZedGraph/NoDupePointList.cs deleted file mode 100644 index ea359af..0000000 --- a/SDK/ZedGraphs/ZedGraph/NoDupePointList.cs +++ /dev/null @@ -1,358 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; - -namespace ZedGraph -{ - /// - /// A simple storage struct to maintain an individual sampling of data. This only - /// contains two data values in order to reduce to memory load for large datasets. - /// (e.g., no Tag or Z property) - /// - public struct DataPoint - { - /// - /// The X value for the point, stored as a double type. - /// - public double X; - /// - /// The Y value for the point, stored as a double type. - /// - public double Y; - } - - /// - /// A collection class to maintain a set of samples. - /// - /// This type, intended for very - /// large datasets, will reduce the number of points displayed by eliminating - /// individual points that overlay (at the same pixel location) on the graph. - /// Note that this type probably does not make sense for line plots, but is intended - /// primarily for scatter plots. - /// - /// - /// John Champion - /// $Revision: 3.5 $ $Date: 2007-06-02 06:56:03 $ - [Serializable] - public class NoDupePointList : List, IPointList, IPointListEdit - { - /// - /// Protected field that stores a value indicating whether or not the data have been filtered. - /// If the data have not been filtered, then will be equal to - /// . Use the public property to - /// access this value. - /// - protected bool _isFiltered; - /// - /// Protected field that stores the number of data points after filtering (e.g., - /// has been called). The property - /// returns the total count for an unfiltered dataset, or - /// for a dataset that has been filtered. - /// - protected int _filteredCount; - /// - /// Protected array of indices for all the points that are currently visible. This only - /// applies if is true. - /// - protected int[] _visibleIndicies; - - - /// - /// Protected field that stores a value that determines how close a point must be to a prior - /// neighbor in order to be filtered out. Use the public property - /// to access this value. - /// - protected int _filterMode; - - - /// - /// Gets or sets a value that determines how close a point must be to a prior - /// neighbor in order to be filtered out. - /// - /// - /// A value of 0 indicates that subsequent - /// points must coincide exactly at the same pixel location. A value of 1 or more - /// indicates that number of pixels distance from a prior point that will cause - /// a new point to be filtered out. For example, a value of 2 means that, once - /// a particular pixel location is taken, any subsequent point that lies within 2 - /// pixels of that location will be filtered out. - /// - public int FilterMode - { - get { return _filterMode; } - set { _filterMode = value; } - } - - /// - /// Gets a value indicating whether or not the data have been filtered. If the data - /// have not been filtered, then will be equal to - /// . - /// - public bool IsFiltered - { - get { return _isFiltered; } - } - - /// - /// Indexer: get the DataPoint instance at the specified ordinal position in the list - /// - /// - /// This method will throw an exception if the index is out of range. This can happen - /// if the index is less than the number of filtered values, or if data points are - /// removed from a filtered dataset with updating the filter (by calling - /// ). - /// - /// The ordinal position in the list of points - /// Returns a instance. The - /// and properties will be defaulted to - /// and null, respectively. - /// - public new PointPair this[int index] - { - get - { - int j = index; - if ( _isFiltered ) - j = _visibleIndicies[index]; - - DataPoint dp = base[j]; - PointPair pt = new PointPair( dp.X, dp.Y ); - return pt; - } - set - { - int j = index; - if ( _isFiltered ) - j = _visibleIndicies[index]; - - DataPoint dp; - dp.X = value.X; - dp.Y = value.Y; - base[j] = dp; - } - } - - /// - /// Gets the number of active samples in the collection. This is the number of - /// samples that are non-duplicates. See the property - /// to get the total number of samples in the list. - /// - public new int Count - { - get - { - if ( !_isFiltered ) - return base.Count; - else - return _filteredCount; - } - } - - /// - /// Gets the total number of samples in the collection. See the - /// property to get the number of active (non-duplicate) samples in the list. - /// - public int TotalCount - { - get { return base.Count; } - } - - /// - /// Append a data point to the collection - /// - /// The value to append - public void Add( PointPair pt ) - { - DataPoint dp = new DataPoint(); - dp.X = pt.X; - dp.Y = pt.Y; - Add( dp ); - } - - - /// - /// Append a point to the collection - /// - /// The x value of the point to append - /// The y value of the point to append - public void Add( double x, double y ) - { - DataPoint dp = new DataPoint(); - dp.X = x; - dp.Y = y; - Add( dp ); - } - - - // generic Clone: just call the typesafe version - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// typesafe clone method - /// - /// A new cloned NoDupePointList. This returns a copy of the structure, - /// but it does not duplicate the data (it just keeps a reference to the original) - /// - public NoDupePointList Clone() - { - return new NoDupePointList( this ); - } - - /// - /// default constructor - /// - public NoDupePointList() - { - _isFiltered = false; - _filteredCount = 0; - _visibleIndicies = null; - _filterMode = 0; - } - - /// - /// copy constructor -- this returns a copy of the structure, - /// but it does not duplicate the data (it just keeps a reference to the original) - /// - /// The NoDupePointList to be copied - public NoDupePointList( NoDupePointList rhs ) - { - int count = rhs.TotalCount; - for ( int i = 0; i < count; i++ ) - Add( rhs.GetDataPointAt( i ) ); - - _filteredCount = rhs._filteredCount; - _isFiltered = rhs._isFiltered; - _filterMode = rhs._filterMode; - - if ( rhs._visibleIndicies != null ) - _visibleIndicies = (int[]) rhs._visibleIndicies.Clone(); - else - _visibleIndicies = null; - } - - /// - /// Protected method to access the internal DataPoint collection, without any - /// translation to a PointPair. - /// - /// The ordinal position of the DataPoint of interest - protected DataPoint GetDataPointAt( int index ) - { - return base[index]; - } - - /// - /// Clears any filtering previously done by a call to . - /// After calling this method, all data points will be visible, and - /// will be equal to . - /// - public void ClearFilter() - { - _isFiltered = false; - _filteredCount = 0; - } - - /// - /// Go through the collection, and hide (filter out) any points that fall on the - /// same pixel location as a previously included point. - /// - /// - /// This method does not delete any points, it just temporarily hides them until - /// the next call to or . - /// You should call once your collection of points has - /// been constructed. You may need to call again if - /// you add points, or if the chart rect changes size (by resizing, printing, - /// image save, etc.), or if the scale range changes. - /// You must call before calling - /// this method so that the GraphPane.Chart.Rect - /// and the scale ranges are valid. This method is not valid for - /// ordinal axes (but ordinal axes don't make sense for very large datasets - /// anyway). - /// - /// The into which the data - /// will be plotted. - /// The class to be used in the Y direction - /// for plotting these data. This can be a or a - /// , and can be a primary or secondary axis (if multiple Y or Y2 - /// axes are being used). - /// - /// The class to be used in the X direction - /// for plotting these data. This can be an or a - /// . - /// - public void FilterData( GraphPane pane, Axis xAxis, Axis yAxis ) - { - if ( _visibleIndicies == null || _visibleIndicies.Length < base.Count ) - _visibleIndicies = new int[base.Count]; - - _filteredCount = 0; - _isFiltered = true; - - int width = (int)pane.Chart.Rect.Width; - int height = (int)pane.Chart.Rect.Height; - if ( width <= 0 || height <= 0 ) - throw new IndexOutOfRangeException( "Error in FilterData: Chart rect not valid" ); - - bool[,] usedArray = new bool[width, height]; - for ( int i = 0; i < width; i++ ) - for ( int j = 0; j < height; j++ ) - usedArray[i, j] = false; - - xAxis.Scale.SetupScaleData( pane, xAxis ); - yAxis.Scale.SetupScaleData( pane, yAxis ); - - int n = _filterMode < 0 ? 0 : _filterMode; - int left = (int)pane.Chart.Rect.Left; - int top = (int)pane.Chart.Rect.Top; - - for ( int i=0; i= 0 && x < width && y >= 0 && y < height ) - { - bool used = false; - if ( n <= 0 ) - used = usedArray[x, y]; - else - { - for ( int ix = x - n; ix <= x + n; ix++ ) - for ( int iy = y - n; iy <= y + n; iy++ ) - used |= ( ix >= 0 && ix < width && iy >= 0 && iy < height && usedArray[ix, iy] ); - } - - if ( !used ) - { - usedArray[x, y] = true; - _visibleIndicies[_filteredCount] = i; - _filteredCount++; - } - } - } - } - } -} diff --git a/SDK/ZedGraphs/ZedGraph/OHLCBar.cs b/SDK/ZedGraphs/ZedGraph/OHLCBar.cs deleted file mode 100644 index b2e7a8a..0000000 --- a/SDK/ZedGraphs/ZedGraph/OHLCBar.cs +++ /dev/null @@ -1,436 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// This class handles the drawing of the curve objects. - /// - /// - /// John Champion - /// $Revision: 3.5 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - public class OHLCBar : LineBase, ICloneable, ISerializable - { - #region Fields - - /// - /// Private field that stores the visibility of the open and - /// close line segments ("wings"). Use the public - /// property to access this value. If this value is - /// false, the wings will not be shown. - /// - protected bool _isOpenCloseVisible; - - /// - /// Private field that stores the total width for the Opening/Closing line - /// segments. Use the public property to access this value. - /// - protected float _size; - - /// - /// Private field that determines if the property will be - /// calculated automatically based on the minimum axis scale step size between - /// bars. Use the public property to access this value. - /// - protected Boolean _isAutoSize; - - /// - /// The result of the autosize calculation, which is the size of the bars in - /// user scale units. This is converted to pixels at draw time. - /// - internal double _userScaleSize = 1.0; - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - new public struct Default - { - // Default Symbol properties - /// - /// The default width for the candlesticks (see ), - /// in units of points. - /// - public static float Size = 12; - /// - /// The default display mode for symbols ( property). - /// true to display symbols, false to hide them. - /// - public static bool IsOpenCloseVisible = true; - - /// - /// The default value for the property. - /// - public static Boolean IsAutoSize = true; - } - - #endregion - - #region Properties - - /// - /// Gets or sets a property that shows or hides the open/close "wings". - /// - /// true to show the CandleStick wings, false to hide them - /// - public bool IsOpenCloseVisible - { - get { return _isOpenCloseVisible; } - set { _isOpenCloseVisible = value; } - } - - /// - /// Gets or sets the total width to be used for drawing the opening/closing line - /// segments ("wings") of the items. Units are points. - /// - /// The size of the candlesticks can be set by this value, which - /// is then scaled according to the scaleFactor (see - /// ). Alternatively, - /// if is true, the bar width will - /// be set according to the maximum available cluster width less - /// the cluster gap (see - /// and ). That is, if - /// is true, then the value of - /// will be ignored. If you modify the value of Size, - /// then will be automatically set to false. - /// - /// Size in points (1/72 inch) - /// - public float Size - { - get { return _size; } - set { _size = value; _isAutoSize = false; } - } - - /// - /// Gets or sets a value that determines if the property will be - /// calculated automatically based on the minimum axis scale step size between - /// bars. - /// - public Boolean IsAutoSize - { - get { return _isAutoSize; } - set { _isAutoSize = value; } - } - - #endregion - - #region Constructors - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class. - /// - public OHLCBar() : this( LineBase.Default.Color ) - { - } - - /// - /// Default constructor that sets the - /// as specified, and the remaining - /// properties to default - /// values as defined in the class. - /// - /// A value indicating - /// the color of the symbol - /// - public OHLCBar( Color color ) : base( color ) - { - _size = Default.Size; - _isAutoSize = Default.IsAutoSize; - _isOpenCloseVisible = Default.IsOpenCloseVisible; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public OHLCBar( OHLCBar rhs ) : base( rhs ) - { - _isOpenCloseVisible = rhs._isOpenCloseVisible; - _size = rhs._size; - _isAutoSize = rhs._isAutoSize; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public OHLCBar Clone() - { - return new OHLCBar( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected OHLCBar( SerializationInfo info, StreamingContext context ) : - base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _isOpenCloseVisible = info.GetBoolean( "isOpenCloseVisible" ); - _size = info.GetSingle( "size" ); - _isAutoSize = info.GetBoolean( "isAutoSize" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema", schema ); - info.AddValue( "isOpenCloseVisible", _isOpenCloseVisible ); - info.AddValue( "size", _size ); - info.AddValue( "isAutoSize", _isAutoSize ); - } - - #endregion - - #region Rendering Methods - - - /// - /// Draw the to the specified - /// device at the specified location. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// boolean value that indicates if the "base" axis for this - /// is the X axis. True for an base, - /// false for a or base. - /// The independent axis position of the center of the candlestick in - /// pixel units - /// The dependent axis position of the top of the candlestick in - /// pixel units - /// The dependent axis position of the bottom of the candlestick in - /// pixel units - /// The dependent axis position of the opening value of the candlestick in - /// pixel units - /// The dependent axis position of the closing value of the candlestick in - /// pixel units - /// - /// The scaled width of the candlesticks, pixels - /// A pen with attributes of and - /// for this - public void Draw( Graphics g, GraphPane pane, bool isXBase, - float pixBase, float pixHigh, float pixLow, - float pixOpen, float pixClose, - float halfSize, Pen pen ) - { - if ( pixBase != PointPair.Missing ) - { - if ( isXBase ) - { - if ( Math.Abs( pixLow ) < 1000000 && Math.Abs( pixHigh ) < 1000000 ) - g.DrawLine( pen, pixBase, pixHigh, pixBase, pixLow ); - if ( _isOpenCloseVisible && Math.Abs( pixOpen ) < 1000000 ) - g.DrawLine( pen, pixBase - halfSize, pixOpen, pixBase, pixOpen ); - if ( _isOpenCloseVisible && Math.Abs( pixClose ) < 1000000 ) - g.DrawLine( pen, pixBase, pixClose, pixBase + halfSize, pixClose ); - } - else - { - if ( Math.Abs( pixLow ) < 1000000 && Math.Abs( pixHigh ) < 1000000 ) - g.DrawLine( pen, pixHigh, pixBase, pixLow, pixBase ); - if ( _isOpenCloseVisible && Math.Abs( pixOpen ) < 1000000 ) - g.DrawLine( pen, pixOpen, pixBase - halfSize, pixOpen, pixBase ); - if ( _isOpenCloseVisible && Math.Abs( pixClose ) < 1000000 ) - g.DrawLine( pen, pixClose, pixBase, pixClose, pixBase + halfSize ); - } - } - } - - - /// - /// Draw all the 's to the specified - /// device as a candlestick at each defined point. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A object representing the - /// 's to be drawn. - /// The class instance that defines the base (independent) - /// axis for the - /// The class instance that defines the value (dependent) - /// axis for the - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void Draw( Graphics g, GraphPane pane, OHLCBarItem curve, - Axis baseAxis, Axis valueAxis, float scaleFactor ) - { - //ValueHandler valueHandler = new ValueHandler( pane, false ); - - float pixBase, pixHigh, pixLow, pixOpen, pixClose; - - if ( curve.Points != null ) - { - //float halfSize = _size * scaleFactor; - float halfSize = GetBarWidth( pane, baseAxis, scaleFactor ); - - using ( Pen pen = !curve.IsSelected ? new Pen( _color, _width ) : - new Pen( Selection.Border.Color, Selection.Border.Width ) ) -// using ( Pen pen = new Pen( _color, _penWidth ) ) - { - // Loop over each defined point - for ( int i = 0; i < curve.Points.Count; i++ ) - { - PointPair pt = curve.Points[i]; - double date = pt.X; - double high = pt.Y; - double low = pt.Z; - double open = PointPair.Missing; - double close = PointPair.Missing; - if ( pt is StockPt ) - { - open = ( pt as StockPt ).Open; - close = ( pt as StockPt ).Close; - } - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - - if ( !curve.Points[i].IsInvalid3D && - ( date > 0 || !baseAxis._scale.IsLog ) && - ( ( high > 0 && low > 0 ) || !valueAxis._scale.IsLog ) ) - { - pixBase = (int)( baseAxis.Scale.Transform( curve.IsOverrideOrdinal, i, date ) + 0.5 ); - //pixBase = baseAxis.Scale.Transform( curve.IsOverrideOrdinal, i, date ); - pixHigh = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, high ); - pixLow = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, low ); - if ( PointPair.IsValueInvalid( open ) ) - pixOpen = Single.MaxValue; - else - pixOpen = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, open ); - - if ( PointPair.IsValueInvalid( close ) ) - pixClose = Single.MaxValue; - else - pixClose = valueAxis.Scale.Transform( curve.IsOverrideOrdinal, i, close ); - - if ( !curve.IsSelected && this._gradientFill.IsGradientValueType ) - { - using ( Pen tPen = GetPen( pane, scaleFactor, pt ) ) - Draw( g, pane, baseAxis is XAxis || baseAxis is X2Axis, - pixBase, pixHigh, pixLow, pixOpen, - pixClose, halfSize, tPen ); - } - else - Draw( g, pane, baseAxis is XAxis || baseAxis is X2Axis, - pixBase, pixHigh, pixLow, pixOpen, - pixClose, halfSize, pen ); - } - } - } - } - } - - /// - /// Returns the width of the candleStick, in pixels, based on the settings for - /// and . - /// - /// The parent object. - /// The object that - /// represents the bar base (independent axis). - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The width of each bar, in pixel units - public float GetBarWidth( GraphPane pane, Axis baseAxis, float scaleFactor ) - { - float width; - if ( _isAutoSize ) - width = baseAxis._scale.GetClusterWidth( _userScaleSize ) / - ( 1.0F + pane._barSettings.MinClusterGap ) / 2.0f; - else - width = (float)( _size * scaleFactor ) / 2.0f; - - // use integral size - return (int)(width + 0.5f); - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/OHLCBarItem.cs b/SDK/ZedGraphs/ZedGraph/OHLCBarItem.cs deleted file mode 100644 index 04665f2..0000000 --- a/SDK/ZedGraphs/ZedGraph/OHLCBarItem.cs +++ /dev/null @@ -1,345 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// Encapsulates a CandleStick curve type that displays a vertical (or horizontal) - /// line displaying the range of data values at each sample point, plus an starting - /// mark and an ending mark signifying the opening and closing value for the sample. - /// - /// For this type to work properly, your must contain - /// objects, rather than ordinary types. - /// This is because the type actually displays 5 data values - /// but the only stores 3 data values. The - /// stores , , - /// , , and - /// members. - /// For a vertical CandleStick chart, the opening value is drawn as a horizontal line - /// segment to the left of the vertical range bar, and the closing value is a horizontal - /// line segment to the right. The total length of these two line segments is controlled - /// by the property, which is specified in - /// points (1/72nd inch), and scaled according to . - /// The candlesticks are drawn horizontally or vertically depending on the - /// value of , which is a - /// enum type. - /// John Champion - /// $Revision: 3.4 $ $Date: 2007-12-31 00:23:05 $ - [Serializable] - public class OHLCBarItem : CurveItem, ICloneable, ISerializable - { - #region Fields - - /// - /// Private field that stores a reference to the - /// class defined for this . Use the public - /// property to access this value. - /// - /// - protected OHLCBar _bar; - - #endregion - - #region Properties - /// - /// Gets a reference to the class defined - /// for this . - /// - public OHLCBar Bar - { - get { return _bar; } - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return pane._barSettings.Base == BarBase.X; - } - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// - /// IsZIncluded is true for objects, since the Y and Z - /// values are defined as the High and Low values for the day. - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return true; - } - - #endregion - - #region Constructors - /// - /// Create a new , specifying only the legend label. - /// - /// The label that will appear in the legend. - public OHLCBarItem( string label ) - : base( label ) - { - _bar = new OHLCBar(); - } - - /// - /// Create a new using the specified properties. - /// - /// The _label that will appear in the legend. - /// An of double precision values that define - /// the Date, Close, Open, High, and Low values for the curve. Note that this - /// should contain items rather - /// than items. - /// - /// - /// The to use for drawing the candlesticks. - public OHLCBarItem( string label, IPointList points, Color color ) - : base( label, points ) - { - _bar = new OHLCBar( color ); - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public OHLCBarItem( OHLCBarItem rhs ) - : base( rhs ) - { - _bar = rhs._bar.Clone(); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public OHLCBarItem Clone() - { - return new OHLCBarItem( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected OHLCBarItem( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _bar = (OHLCBar)info.GetValue( "stick", typeof( OHLCBar ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - - info.AddValue( "schema2", schema2 ); - info.AddValue( "stick", _bar ); - } - - #endregion - - #region Methods - - /// - /// Do all rendering associated with this to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The ordinal position of the current - /// curve. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, GraphPane pane, int pos, float scaleFactor ) - { - if ( _isVisible ) - { - _bar.Draw( g, pane, this, this.BaseAxis( pane ), - this.ValueAxis( pane ), scaleFactor ); - } - } - - /// - /// Draw a legend key entry for this at the specified location - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The struct that specifies the - /// location for the legend key - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, - float scaleFactor ) - { - float pixBase, pixHigh, pixLow, pixOpen, pixClose; - - if ( pane._barSettings.Base == BarBase.X ) - { - pixBase = rect.Left + rect.Width / 2.0F; - pixHigh = rect.Top; - pixLow = rect.Bottom; - pixOpen = pixHigh + rect.Height / 4; - pixClose = pixLow - rect.Height / 4; - } - else - { - pixBase = rect.Top + rect.Height / 2.0F; - pixHigh = rect.Right; - pixLow = rect.Left; - pixOpen = pixHigh - rect.Width / 4; - pixClose = pixLow + rect.Width / 4; - } - - float halfSize = 2.0f * scaleFactor; - - using ( Pen pen = new Pen( _bar.Color, _bar._width ) ) - { - _bar.Draw( g, pane, pane._barSettings.Base == BarBase.X, pixBase, pixHigh, - pixLow, pixOpen, pixClose, halfSize, pen ); - } - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - override public bool GetCoords( GraphPane pane, int i, out string coords ) - { - coords = string.Empty; - - if ( i < 0 || i >= _points.Count ) - return false; - - Axis valueAxis = ValueAxis( pane ); - Axis baseAxis = BaseAxis( pane ); - - float halfSize = _bar.Size * pane.CalcScaleFactor(); - - PointPair pt = _points[i]; - double date = pt.X; - double high = pt.Y; - double low = pt.Z; - - if ( !pt.IsInvalid3D && - ( date > 0 || !baseAxis._scale.IsLog ) && - ( ( high > 0 && low > 0 ) || !valueAxis._scale.IsLog ) ) - { - float pixBase, pixHigh, pixLow; - pixBase = baseAxis.Scale.Transform( _isOverrideOrdinal, i, date ); - pixHigh = valueAxis.Scale.Transform( _isOverrideOrdinal, i, high ); - pixLow = valueAxis.Scale.Transform( _isOverrideOrdinal, i, low ); - - // Calculate the pixel location for the side of the bar (on the base axis) - float pixSide = pixBase - halfSize; - - // Draw the bar - if ( baseAxis is XAxis || baseAxis is X2Axis ) - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixSide, pixLow, - pixSide + halfSize * 2, pixHigh ); - else - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0}", - pixLow, pixSide, - pixHigh, pixSide + halfSize * 2 ); - - return true; - } - - return false; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/OrdinalScale.cs b/SDK/ZedGraphs/ZedGraph/OrdinalScale.cs deleted file mode 100644 index 4c76a4a..0000000 --- a/SDK/ZedGraphs/ZedGraph/OrdinalScale.cs +++ /dev/null @@ -1,233 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The OrdinalScale class inherits from the class, and implements - /// the features specific to . - /// - /// - /// OrdinalScale is an ordinal axis with tic labels generated at integral values. An ordinal axis means that - /// all data points are evenly spaced at integral values, and the actual coordinate values - /// for points corresponding to that axis are ignored. That is, if the X axis is an - /// ordinal type, then all X values associated with the curves are ignored. - /// - /// - /// John Champion - /// $Revision: 1.8 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - class OrdinalScale : Scale, ISerializable //, ICloneable - { - - #region constructors - - /// - /// Default constructor that defines the owner - /// (containing object) for this new object. - /// - /// The owner, or containing object, of this instance - public OrdinalScale( Axis owner ) - : base( owner ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - /// The object that will own the - /// new instance of - public OrdinalScale( Scale rhs, Axis owner ) - : base( rhs, owner ) - { - } - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - public override Scale Clone( Axis owner ) - { - return new OrdinalScale( this, owner ); - } - - #endregion - - #region properties - - /// - /// Return the for this , which is - /// . - /// - public override AxisType Type - { - get { return AxisType.Ordinal; } - } - - #endregion - - #region methods - - /// - /// Select a reasonable ordinal axis scale given a range of data values. - /// - /// - /// This method only applies to type axes, and it - /// is called by the general method. The scale range is chosen - /// based on increments of 1, 2, or 5 (because they are even divisors of 10). - /// Being an ordinal axis type, the value will always be integral. This - /// method honors the , , - /// and autorange settings. - /// In the event that any of the autorange settings are false, the - /// corresponding , , or - /// setting is explicitly honored, and the remaining autorange settings (if any) will - /// be calculated to accomodate the non-autoranged values. The basic defaults for - /// scale selection are defined using , - /// , and - /// from the default class. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to scale minor step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - override public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - // call the base class first - base.PickScale( pane, g, scaleFactor ); - - PickScale( pane, g, scaleFactor, this ); - } - - internal static void PickScale( GraphPane pane, Graphics g, float scaleFactor, Scale scale ) - { - // Test for trivial condition of range = 0 and pick a suitable default - if ( scale._max - scale._min < 1.0 ) - { - if ( scale._maxAuto ) - scale._max = scale._min + 0.5; - else - scale._min = scale._max - 0.5; - } - else - { - // Calculate the new step size - if ( scale._majorStepAuto ) - { - // Calculate the step size based on targetSteps - scale._majorStep = Scale.CalcStepSize( scale._max - scale._min, - ( scale._ownerAxis is XAxis || scale._ownerAxis is X2Axis ) ? - Default.TargetXSteps : Default.TargetYSteps ); - - if ( scale.IsPreventLabelOverlap ) - { - // Calculate the maximum number of labels - double maxLabels = (double) scale.CalcMaxLabels( g, pane, scaleFactor ); - - // Calculate a step size based on the width of the labels - double tmpStep = Math.Ceiling( ( scale._max - scale._min ) / maxLabels ); - - // Use the greater of the two step sizes - if ( tmpStep > scale._majorStep ) - scale._majorStep = tmpStep; - } - - } - - scale._majorStep = (int)scale._majorStep; - if ( scale._majorStep < 1.0 ) - scale._majorStep = 1.0; - - // Calculate the new minor step size - if ( scale._minorStepAuto ) - scale._minorStep = Scale.CalcStepSize( scale._majorStep, - ( scale._ownerAxis is XAxis || scale._ownerAxis is X2Axis ) ? - Default.TargetMinorXSteps : Default.TargetMinorYSteps ); - - if ( scale._minAuto ) - scale._min -= 0.5; - if ( scale._maxAuto ) - scale._max += 0.5; - } - } - - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected OrdinalScale( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PaneBase.cs b/SDK/ZedGraphs/ZedGraph/PaneBase.cs deleted file mode 100644 index 83a8a0d..0000000 --- a/SDK/ZedGraphs/ZedGraph/PaneBase.cs +++ /dev/null @@ -1,1220 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Text; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using System.Drawing.Imaging; -using System.Runtime.Serialization; -using System.Security.Permissions; -using System.IO; - -#endregion - -namespace ZedGraph -{ - /// - /// An abstract base class that defines basic functionality for handling a pane. This class is the - /// parent class for and . - /// - /// - /// John Champion - /// $Revision: 3.32 $ $Date: 2007-11-05 18:28:56 $ - abstract public class PaneBase : ICloneable - { - - #region Fields - - /// - /// The rectangle that defines the full area into which the pane is rendered. Units are pixels. - /// Use the public property to access this value. - /// - protected RectangleF _rect; - - /// Private field that holds the main title of the pane. Use the - /// public property to access this value. - /// - protected GapLabel _title; - - /// Private field instance of the class. Use the - /// public property to access this class. - protected Legend _legend; - - /// - /// Private field that stores the user-defined tag for this . This tag - /// can be any user-defined value. If it is a type, it can be used as - /// a parameter to the method. Use the public property - /// to access this value. - /// - protected object _tag; - - /// - /// private field to store the margin values for this . Use the - /// public property to access this property. - /// - internal Margin _margin; - - /// Private field that determines whether or not the fonts, tics, gaps, etc. - /// will be scaled according to the actual graph size. true for font and feature scaling - /// with graph size, false for fixed font sizes (scaleFactor = 1.0 constant). - /// Use the public property to access this value. - /// - /// - protected bool _isFontsScaled; - /// - /// Private field that controls whether or not pen widths are scaled according to the - /// size of the graph. This value is only applicable if - /// is true. If is false, then no scaling will be done, - /// regardless of the value of . - /// - /// true to scale the pen widths according to the size of the graph, - /// false otherwise. - /// - /// - protected bool _isPenWidthScaled; - - /// - /// Private field that stores the data for the - /// background. Use the public property to - /// access this value. - /// - protected Fill _fill; - /// - /// Private field that stores the data for the - /// border. Use the public property to - /// access this value. - /// - protected Border _border; - - /// Private field instance of the class. Use the - /// public property to access this class. - protected GraphObjList _graphObjList; - - /// Private field that determines the base size of the pane, in inches. - /// Fonts, tics, gaps, etc. are scaled according to this base size. - /// Use the public property to access this value. - /// - /// - protected float _baseDimension; - - /// - /// private field that stores the gap between the bottom of the pane title and the - /// client area of the pane. This is expressed as a fraction of the title character height. - /// - protected float _titleGap; - - #endregion - - #region Defaults - /// - /// A simple struct that defines the default property values for the class. - /// - public struct Default - { - // Default GraphPane properties - /// - /// The default display mode for the title at the top of the pane - /// ( property). true to - /// display a title, false otherwise. - /// - public static bool IsShowTitle = true; - - /// - /// The default font family for the title - /// ( property). - /// - public static string FontFamily = "Arial"; - /// - /// The default font size (points) for the - /// ( property). - /// - public static float FontSize = 16; - /// - /// The default font color for the - /// - /// ( property). - /// - public static Color FontColor = Color.Black; - /// - /// The default font bold mode for the - /// - /// ( property). true - /// for a bold typeface, false otherwise. - /// - public static bool FontBold = true; - /// - /// The default font italic mode for the - /// - /// ( property). true - /// for an italic typeface, false otherwise. - /// - public static bool FontItalic = false; - /// - /// The default font underline mode for the - /// - /// ( property). true - /// for an underlined typeface, false otherwise. - /// - public static bool FontUnderline = false; - - /// - /// The default border mode for the . - /// ( property). true - /// to draw a border around the , - /// false otherwise. - /// - public static bool IsBorderVisible = true; - /// - /// The default color for the border. - /// ( property). - /// - public static Color BorderColor = Color.Black; - /// - /// The default color for the background. - /// ( property). - /// - public static Color FillColor = Color.White; - - /// - /// The default pen width for the border. - /// ( property). Units are in points (1/72 inch). - /// - public static float BorderPenWidth = 1; - - /// - /// The default dimension of the , which - /// defines a normal sized plot. This dimension is used to scale the - /// fonts, symbols, etc. according to the actual size of the - /// . - /// - /// - public static float BaseDimension = 8.0F; - - /// - /// The default setting for the option. - /// true to have all pen widths scaled according to , - /// false otherwise. - /// - /// - public static bool IsPenWidthScaled = false; - /// - /// The default setting for the option. - /// true to have all fonts scaled according to , - /// false otherwise. - /// - /// - public static bool IsFontsScaled = true; - - /// - /// The default value for the property, expressed as - /// a fraction of the scaled character height. - /// - public static float TitleGap = 0.5f; - } - #endregion - - #region Properties - - /// - /// The rectangle that defines the full area into which all graphics - /// will be rendered. - /// - /// Note that this rectangle has x, y, width, and height. Most of the - /// GDI+ graphic primitive actually draw one pixel beyond those dimensions. For - /// example, for a rectangle of ( X=0, Y=0, Width=100, Height=100 ), GDI+ would - /// draw into pixels 0 through 100, which is actually 101 pixels. For the - /// ZedGraph Rect, a Width of 100 pixels means that pixels 0 through 99 are used - /// Units are pixels. - /// - public RectangleF Rect - { - get { return _rect; } - set { _rect = value; } - } - - /// - /// Accesses the for this - /// - /// A reference to a object - public Legend Legend - { - get { return _legend; } - } - - /// - /// Gets the instance that contains the text and attributes of the title. - /// This text can be multiple lines separated by newline characters ('\n'). - /// - /// - /// - /// - /// - /// - /// - /// - public Label Title - { - get { return _title; } - } - - /// - /// Gets or sets the user-defined tag for this . This tag - /// can be any user-defined value. If it is a type, it can be used as - /// a parameter to the method. - /// - /// - /// Note that, if you are going to Serialize ZedGraph data, then any type - /// that you store in must be a serializable type (or - /// it will cause an exception). - /// - public object Tag - { - get { return _tag; } - set { _tag = value; } - } - - /// - /// Gets or sets the class for drawing the border - /// border around the - /// - /// - /// - public Border Border - { - get { return _border; } - set { _border = value; } - } - - /// - /// Gets or sets the data for the - /// filling the background of the . - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - - /// - /// Gets or sets the list of items for this - /// - /// A reference to a collection object - public GraphObjList GraphObjList - { - get { return _graphObjList; } - set { _graphObjList = value; } - } - - /// - /// Gets or sets the instance that controls the space between - /// the edge of the and the rendered content of the graph. - /// - public Margin Margin - { - get { return _margin; } - set { _margin = value; } - } - - /// - /// BaseDimension is a double precision value that sets "normal" pane size on - /// which all the settings are based. The BaseDimension is in inches. For - /// example, if the BaseDimension is 8.0 inches and the - /// size is 14 points. Then the pane title font - /// will be 14 points high when the is approximately 8.0 - /// inches wide. If the Rect is 4.0 inches wide, the pane title font will be - /// 7 points high. Most features of the graph are scaled in this manner. - /// - /// The base dimension reference for the , in inches - /// - /// - /// - public float BaseDimension - { - get { return _baseDimension; } - set { _baseDimension = value; } - } - - /// - /// Gets or sets the gap between the bottom of the pane title and the - /// client area of the pane. This is expressed as a fraction of the scaled - /// character height. - /// - public float TitleGap - { - get { return _titleGap; } - set { _titleGap = value; } - } - - /// - /// Determines if the font sizes, tic sizes, gap sizes, etc. will be scaled according to - /// the size of the and the . If this - /// value is set to false, then the font sizes and tic sizes will always be exactly as - /// specified, without any scaling. - /// - /// True to have the fonts and tics scaled, false to have them constant - /// - public bool IsFontsScaled - { - get { return _isFontsScaled; } - set { _isFontsScaled = value; } - } - /// - /// Gets or sets the property that controls whether or not pen widths are scaled for this - /// . - /// - /// This value is only applicable if - /// is true. If is false, then no scaling will be done, - /// regardless of the value of . Note that scaling the pen - /// widths can cause "artifacts" to appear at typical screen resolutions. This occurs - /// because of roundoff differences; in some cases the pen width may round to 1 pixel wide - /// and in another it may round to 2 pixels wide. The result is typically undesirable. - /// Therefore, this option defaults to false. This option is primarily useful for high - /// resolution output, such as printer output or high resolution bitmaps (from - /// ) where it is desirable to have the pen width - /// be consistent with the screen image. - /// - /// true to scale the pen widths according to the size of the graph, - /// false otherwise. - /// - /// - public bool IsPenWidthScaled - { - get { return _isPenWidthScaled; } - set { _isPenWidthScaled = value; } - } - - #endregion - - #region Constructors - - /// - /// Default constructor for the class. Leaves the empty. - /// - public PaneBase() : this( "", new RectangleF( 0, 0, 0, 0 ) ) - { - } - - /// - /// Default constructor for the class. Specifies the of - /// the , and the size of the . - /// - public PaneBase( string title, RectangleF paneRect ) - { - _rect = paneRect; - - _legend = new Legend(); - - _baseDimension = Default.BaseDimension; - _margin = new Margin(); - _titleGap = Default.TitleGap; - - _isFontsScaled = Default.IsFontsScaled; - _isPenWidthScaled = Default.IsPenWidthScaled; - _fill = new Fill( Default.FillColor ); - _border = new Border( Default.IsBorderVisible, Default.BorderColor, - Default.BorderPenWidth ); - - _title = new GapLabel( title, Default.FontFamily, - Default.FontSize, Default.FontColor, Default.FontBold, - Default.FontItalic, Default.FontUnderline ); - _title._fontSpec.Fill.IsVisible = false; - _title._fontSpec.Border.IsVisible = false; - - _graphObjList = new GraphObjList(); - - _tag = null; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public PaneBase( PaneBase rhs ) - { - // copy over all the value types - _isFontsScaled = rhs._isFontsScaled; - _isPenWidthScaled = rhs._isPenWidthScaled; - - _titleGap = rhs._titleGap; - _baseDimension = rhs._baseDimension; - _margin = rhs._margin.Clone(); - _rect = rhs._rect; - - // Copy the reference types by cloning - _fill = rhs._fill.Clone(); - _border = rhs._border.Clone(); - _title = rhs._title.Clone(); - - _legend = rhs.Legend.Clone(); - _title = rhs._title.Clone(); - _graphObjList = rhs._graphObjList.Clone(); - - if ( rhs._tag is ICloneable ) - _tag = ((ICloneable) rhs._tag).Clone(); - else - _tag = rhs._tag; - } - - - //abstract public object ShallowClone(); - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of Clone - /// - /// - /// Note that this method must be called with an explicit cast to ICloneable, and - /// that it is inherently virtual. For example: - /// - /// ParentClass foo = new ChildClass(); - /// ChildClass bar = (ChildClass) ((ICloneable)foo).Clone(); - /// - /// Assume that ChildClass is inherited from ParentClass. Even though foo is declared with - /// ParentClass, it is actually an instance of ChildClass. Calling the ICloneable implementation - /// of Clone() on foo actually calls ChildClass.Clone() as if it were a virtual function. - /// - /// A deep copy of this object - object ICloneable.Clone() - { - throw new NotImplementedException( "Can't clone an abstract base type -- child types must implement ICloneable" ); - //return new PaneBase( this ); - } - - /// - /// Create a shallow, memberwise copy of this class. - /// - /// - /// Note that this method uses MemberWiseClone, which will copy all - /// members (shallow) including those of classes derived from this class. - /// a new copy of the class - public PaneBase ShallowClone() - { - // return a shallow copy - return this.MemberwiseClone() as PaneBase; - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - // schema changed to 2 when Label Class added - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected PaneBase( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _rect = (RectangleF) info.GetValue( "rect", typeof(RectangleF) ); - _legend = (Legend) info.GetValue( "legend", typeof(Legend) ); - _title = (GapLabel) info.GetValue( "title", typeof(GapLabel) ); - //this.isShowTitle = info.GetBoolean( "isShowTitle" ); - _isFontsScaled = info.GetBoolean( "isFontsScaled" ); - _isPenWidthScaled = info.GetBoolean( "isPenWidthScaled" ); - //this.fontSpec = (FontSpec) info.GetValue( "fontSpec" , typeof(FontSpec) ); - _titleGap = info.GetSingle( "titleGap" ); - _fill = (Fill) info.GetValue( "fill", typeof(Fill) ); - _border = (Border) info.GetValue( "border", typeof(Border) ); - _baseDimension = info.GetSingle( "baseDimension" ); - _margin = (Margin)info.GetValue( "margin", typeof( Margin ) ); - _graphObjList = (GraphObjList) info.GetValue( "graphObjList", typeof(GraphObjList) ); - - _tag = info.GetValue( "tag", typeof(object) ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - - info.AddValue( "rect", _rect ); - info.AddValue( "legend", _legend ); - info.AddValue( "title", _title ); - //info.AddValue( "isShowTitle", isShowTitle ); - info.AddValue( "isFontsScaled", _isFontsScaled ); - info.AddValue( "isPenWidthScaled", _isPenWidthScaled ); - info.AddValue( "titleGap", _titleGap ); - - //info.AddValue( "fontSpec", fontSpec ); - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - info.AddValue( "baseDimension", _baseDimension ); - info.AddValue( "margin", _margin ); - info.AddValue( "graphObjList", _graphObjList ); - - info.AddValue( "tag", _tag ); - } - #endregion - - #region Methods - - /// - /// Do all rendering associated with this to the specified - /// device. This abstract method is implemented by the child - /// classes. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - public virtual void Draw( Graphics g ) - { - if ( _rect.Width <= 1 || _rect.Height <= 1 ) - return; - - // calculate scaleFactor on "normal" pane size (BaseDimension) - float scaleFactor = this.CalcScaleFactor(); - - // Fill the pane background and draw a border around it - DrawPaneFrame( g, scaleFactor ); - - // Clip everything to the rect - g.SetClip( _rect ); - - // Draw the GraphItems that are behind everything - _graphObjList.Draw( g, this, scaleFactor, ZOrder.H_BehindAll ); - - // Draw the Pane Title - DrawTitle( g, scaleFactor ); - - // Draw the Legend - //this.Legend.Draw( g, this, scaleFactor ); - - // Reset the clipping - g.ResetClip(); - } - - /// - /// Calculate the client area rectangle based on the . - /// - /// The client rectangle is the actual area available for - /// or items after taking out space for the margins and the title. - /// This method does not take out the area required for the . - /// To do so, you must separately call . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - /// The calculated chart rect, in pixel coordinates. - public RectangleF CalcClientRect( Graphics g, float scaleFactor ) - { - // get scaled values for the paneGap and character height - //float scaledOuterGap = (float) ( Default.OuterPaneGap * scaleFactor ); - float charHeight = _title._fontSpec.GetHeight( scaleFactor ); - - // chart rect starts out at the full pane rect. It gets reduced to make room for the legend, - // scales, titles, etc. - RectangleF innerRect = new RectangleF( - _rect.Left + _margin.Left * scaleFactor, - _rect.Top + _margin.Top * scaleFactor, - _rect.Width - scaleFactor * ( _margin.Left + _margin.Right ), - _rect.Height - scaleFactor * ( _margin.Top + _margin.Bottom ) ); - - // Leave room for the title - if ( _title._isVisible && _title._text != string.Empty ) - { - SizeF titleSize = _title._fontSpec.BoundingBox( g, _title._text, scaleFactor ); - // Leave room for the title height, plus a line spacing of charHeight * _titleGap - innerRect.Y += titleSize.Height + charHeight * _titleGap; - innerRect.Height -= titleSize.Height + charHeight * _titleGap; - } - - // Calculate the legend rect, and back it out of the current ChartRect - //this.legend.CalcRect( g, this, scaleFactor, ref innerRect ); - - return innerRect; - } - - /// - /// Draw the border _border around the area. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - public void DrawPaneFrame( Graphics g, float scaleFactor ) - { - // Erase the pane background, filling it with the specified brush - _fill.Draw( g, _rect ); - - // Reduce the rect width and height by 1 pixel so that for a rect of - // new RectangleF( 0, 0, 100, 100 ), which should be 100 pixels wide, we cover - // from 0 through 99. The draw routines normally cover from 0 through 100, which is - // actually 101 pixels wide. - RectangleF rect = new RectangleF( _rect.X, _rect.Y, _rect.Width - 1, _rect.Height - 1 ); - - _border.Draw( g, this, scaleFactor, rect ); - } - - /// - /// Draw the on the graph, centered at the top of the pane. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - public void DrawTitle( Graphics g, float scaleFactor ) - { - // only draw the title if it's required - if ( _title._isVisible ) - { - SizeF size = _title._fontSpec.BoundingBox( g, _title._text, scaleFactor ); - - // use the internal fontSpec class to draw the text using user-specified and/or - // default attributes. - _title._fontSpec.Draw( g, this, _title._text, - ( _rect.Left + _rect.Right ) / 2, - _rect.Top + _margin.Top * (float) scaleFactor + size.Height / 2.0F, - AlignH.Center, AlignV.Center, scaleFactor ); - } - } - - /// - /// Change the size of the . Override this method to handle resizing the contents - /// as required. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The new size for the . - public virtual void ReSize( Graphics g, RectangleF rect ) - { - _rect = rect; - } - - /// - /// Calculate the scaling factor based on the ratio of the current dimensions and - /// the . - /// - /// This scaling factor is used to proportionally scale the - /// features of the so that small graphs don't have huge fonts, and vice versa. - /// The scale factor represents a linear multiple to be applied to font sizes, symbol sizes, tic sizes, - /// gap sizes, pen widths, etc. The units of the scale factor are "World Pixels" per "Standard Point". - /// If any object size, in points, is multiplied by this scale factor, the result is the size, in pixels, - /// that the object should be drawn using the standard GDI+ drawing instructions. A "Standard Point" - /// is a dimension based on points (1/72nd inch) assuming that the size - /// matches the . - /// Note that "World Pixels" will still be transformed by the GDI+ transform matrices to result - /// in "Output Device Pixels", but "World Pixels" are the reference basis for the drawing commands. - /// - /// - /// A value representing the scaling factor to use for the rendering calculations. - /// - /// - public float CalcScaleFactor() - { - float scaleFactor; //, xInch, yInch; - const float ASPECTLIMIT = 1.5F; - - // if font scaling is turned off, then always return a 1.0 scale factor - if ( !_isFontsScaled ) - return 1.0f; - - // Assume the standard width (BaseDimension) is 8.0 inches - // Therefore, if the rect is 8.0 inches wide, then the fonts will be scaled at 1.0 - // if the rect is 4.0 inches wide, the fonts will be half-sized. - // if the rect is 16.0 inches wide, the fonts will be double-sized. - - // Scale the size depending on the client area width in linear fashion - if ( _rect.Height <= 0 ) - return 1.0F; - float length = _rect.Width; - float aspect = _rect.Width / _rect.Height; - if ( aspect > ASPECTLIMIT ) - length = _rect.Height * ASPECTLIMIT; - if ( aspect < 1.0F / ASPECTLIMIT ) - length = _rect.Width * ASPECTLIMIT; - - scaleFactor = length / ( _baseDimension * 72F ); - - // Don't let the scaleFactor get ridiculous - if ( scaleFactor < 0.1F ) - scaleFactor = 0.1F; - - return scaleFactor; - } - - /// - /// Calculate the scaled pen width, taking into account the scaleFactor and the - /// setting of the property of the pane. - /// - /// The pen width, in points (1/72 inch) - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - /// The scaled pen width, in world pixels - public float ScaledPenWidth( float penWidth, float scaleFactor ) - { - if ( _isPenWidthScaled ) - return (float)( penWidth * scaleFactor ); - else - return penWidth; - } - - /// - /// Build a object containing the graphical rendering of - /// all the objects in this list. - /// - /// A object rendered with the current graph. - /// - /// - /// - public Bitmap GetImage() - { - return GetImage( false ); - } - - /// - /// Build a object containing the graphical rendering of - /// all the objects in this list. - /// - /// A object rendered with the current graph. - /// - /// - /// - public Bitmap GetImage( bool isAntiAlias ) - { - Bitmap bitmap = new Bitmap( (int) _rect.Width, (int) _rect.Height ); - using ( Graphics bitmapGraphics = Graphics.FromImage( bitmap ) ) - { - bitmapGraphics.TranslateTransform( -_rect.Left, -_rect.Top ); - this.Draw( bitmapGraphics ); - } - - return bitmap; - } - - /// - /// Gets an image for the current GraphPane, scaled to the specified size and resolution. - /// - /// The scaled width of the bitmap in pixels - /// The scaled height of the bitmap in pixels - /// The resolution of the bitmap, in dots per inch - /// true for anti-aliased rendering, false otherwise - /// - /// - /// - /// - public Bitmap GetImage( int width, int height, float dpi, bool isAntiAlias ) - { - Bitmap bitmap = new Bitmap( width, height ); - bitmap.SetResolution( dpi, dpi ); - using ( Graphics bitmapGraphics = Graphics.FromImage( bitmap ) ) - { - MakeImage( bitmapGraphics, width, height, isAntiAlias ); - } - - return bitmap; - } - - /// - /// Gets an image for the current GraphPane, scaled to the specified size and resolution. - /// - /// The scaled width of the bitmap in pixels - /// The scaled height of the bitmap in pixels - /// The resolution of the bitmap, in dots per inch - /// - /// - /// - /// - public Bitmap GetImage( int width, int height, float dpi ) - { - return GetImage( width, height, dpi, false ); - } - - /// - /// Setup a instance with appropriate antialias settings. - /// - /// - /// No settings are modified if is set to false. This method - /// does not restore original settings, it presumes that the Graphics instance will be - /// disposed. - /// An existing instance - /// true to render in anti-alias mode, false otherwise - internal void SetAntiAliasMode( Graphics g, bool isAntiAlias ) - { - if ( isAntiAlias ) - { - g.SmoothingMode = SmoothingMode.HighQuality; - //g.SmoothingMode = SmoothingMode.AntiAlias; - g.TextRenderingHint = TextRenderingHint.AntiAlias; - g.CompositingQuality = CompositingQuality.HighQuality; - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - } - } - - private void MakeImage( Graphics g, int width, int height, bool antiAlias ) - { - //g.SmoothingMode = SmoothingMode.AntiAlias; - SetAntiAliasMode( g, antiAlias ); - - // This is actually a shallow clone, so we don't duplicate all the data, curveLists, etc. - PaneBase tempPane = this.ShallowClone(); - - // Clone the Chart object for GraphPanes so we don't mess up the minPix and maxPix values or - // the rect/ChartRect calculations of the original - //RectangleF saveRect = new RectangleF(); - //if ( this is GraphPane ) - // saveRect = ( this as GraphPane ).Chart.Rect; - - tempPane.ReSize( g, new RectangleF( 0, 0, width, height ) ); - - tempPane.Draw( g ); - - //if ( this is GraphPane ) - //{ - // GraphPane gPane = this as GraphPane; - // gPane.Chart.Rect = saveRect; - // gPane.XAxis.Scale.SetupScaleData( gPane, gPane.XAxis ); - // foreach ( Axis axis in gPane.YAxisList ) - // axis.Scale.SetupScaleData( gPane, axis ); - // foreach ( Axis axis in gPane.Y2AxisList ) - // axis.Scale.SetupScaleData( gPane, axis ); - //} - - // To restore all the various state variables, you must redraw the graph in it's - // original form. For this we create a 1x1 bitmap (it doesn't matter what size you use, - // since we're only mimicing the draw. If you use the 'bitmapGraphics' already created, - // then you will be drawing back into the bitmap that will be returned. - - Bitmap bm = new Bitmap( 1, 1 ); - using ( Graphics bmg = Graphics.FromImage( bm ) ) - { - this.ReSize( bmg, this.Rect ); - SetAntiAliasMode( bmg, antiAlias ); - this.Draw( bmg ); - } - } - - /// - /// Gets an enhanced metafile image for the current GraphPane, scaled to the specified size. - /// - /// - /// By definition, a Metafile is a vector drawing, and therefore scaling should not matter. - /// However, this method is provided because certain options in Zedgraph, such as - /// are affected by the size of the expected image. - /// - /// The "effective" scaled width of the bitmap in pixels - /// The "effective" scaled height of the bitmap in pixels - /// true to use anti-aliased drawing mode, false otherwise - /// - /// - /// - public Metafile GetMetafile( int width, int height, bool isAntiAlias ) - { - Bitmap bm = new Bitmap( 1, 1 ); - using ( Graphics g = Graphics.FromImage( bm ) ) - { - IntPtr hdc = g.GetHdc(); - Stream stream = new MemoryStream(); - Metafile metafile = new Metafile( stream, hdc, _rect, - MetafileFrameUnit.Pixel, EmfType.EmfPlusDual ); - g.ReleaseHdc( hdc ); - - using ( Graphics metafileGraphics = Graphics.FromImage( metafile ) ) - { - //metafileGraphics.TranslateTransform( -_rect.Left, -_rect.Top ); - metafileGraphics.PageUnit = System.Drawing.GraphicsUnit.Pixel; - PointF P = new PointF( width, height ); - PointF[] PA = new PointF[] { P }; - metafileGraphics.TransformPoints( CoordinateSpace.Page, CoordinateSpace.Device, PA ); - //metafileGraphics.PageScale = 1f; - - // output - MakeImage( metafileGraphics, width, height, isAntiAlias ); - //this.Draw( metafileGraphics ); - - return metafile; - } - } - } - - /// - /// Gets an enhanced metafile image for the current GraphPane, scaled to the specified size. - /// - /// - /// By definition, a Metafile is a vector drawing, and therefore scaling should not matter. - /// However, this method is provided because certain options in Zedgraph, such as - /// are affected by the size of the expected image. - /// - /// The "effective" scaled width of the bitmap in pixels - /// The "effective" scaled height of the bitmap in pixels - /// - /// - /// - public Metafile GetMetafile( int width, int height ) - { - return GetMetafile( width, height, false ); - } - - /// - /// Gets an enhanced metafile image for the current GraphPane. - /// - /// - /// - /// - public Metafile GetMetafile() - { - Bitmap bm = new Bitmap( 1, 1 ); - using ( Graphics g = Graphics.FromImage( bm ) ) - { - IntPtr hdc = g.GetHdc(); - Stream stream = new MemoryStream(); - Metafile metafile = new Metafile( stream, hdc, _rect, - MetafileFrameUnit.Pixel, EmfType.EmfOnly ); - - using ( Graphics metafileGraphics = Graphics.FromImage( metafile ) ) - { - metafileGraphics.TranslateTransform( -_rect.Left, -_rect.Top ); - metafileGraphics.PageUnit = System.Drawing.GraphicsUnit.Pixel; - PointF P = new PointF( _rect.Width, _rect.Height ); - PointF[] PA = new PointF[] { P }; - metafileGraphics.TransformPoints( CoordinateSpace.Page, CoordinateSpace.Device, PA ); - //metafileGraphics.PageScale = 1f; - - // output - this.Draw( metafileGraphics ); - - g.ReleaseHdc( hdc ); - return metafile; - } - } - } - - /* - System.Drawing.Imaging.Metafile metafile = null; - - // create a Metafile object that is compatible with the surface of this - // form - using ( Graphics graphics = this.CreateGraphics() ) - { - System.IntPtr hdc = graphics.GetHdc(); - metafile = new Metafile(filename, hdc, new Rectangle( 0, 0, - (((int) this.ClientRectangle.Width)), - (((int) this.ClientRectangle.Height ))), - MetafileFrameUnit.Point ); - graphics.ReleaseHdc( hdc ); - } - - // draw to the metafile - using ( Graphics metafileGraphics = Graphics.FromImage( metafile ) ) - { - metafileGraphics.PageUnit=System.Drawing.GraphicsUnit.Point; - PointF P=new Point(this.ClientRectangle.Width,this.ClientRectangle.Height); - PointF[] PA=new PointF[]{P}; - metafileGraphics.TransformPoints(CoordinateSpace.Page, CoordinateSpace.Device, PA); - metafileGraphics.PageScale=1f; - metafileGraphics.SmoothingMode = SmoothingMode.AntiAlias; // smooth the - // output - this.masterPane.Draw( metafileGraphics ); - metafileGraphics.DrawRectangle(new System.Drawing.Pen( Color.Gray),this.ClientRectangle); - metafile.Dispose(); - - } - - return true; - } - else - { - return false; - } - } - else - { - //no directory given - return false; - } - */ - - -/* - /// - /// Function to export the Diagram as WMF file - /// see http://www.codeproject.com/showcase/pdfrasterizer.asp?print=true - /// - /// - /// filename is the name to export to - /// - public bool ExporttoWmf( string filename ) - { - string p; - - //FileInfo TheFile = new FileInfo(filename); - p = Path.GetDirectoryName( filename ); - if ( p != "" ) - { - DirectoryInfo TheDir = new DirectoryInfo( p ); - if ( TheDir.Exists ) - { - System.Drawing.Imaging.Metafile metafile = null; - - // create a Metafile object that is compatible with the surface of this - // form - using ( Graphics graphics = this.CreateGraphics() ) - { - System.IntPtr hdc = graphics.GetHdc(); - metafile = new Metafile( filename, hdc, new Rectangle( 0, 0, - ( ( (int)this.ClientRectangle.Width ) ), - ( ( (int)this.ClientRectangle.Height ) ) ), - MetafileFrameUnit.Point ); - graphics.ReleaseHdc( hdc ); - } - - // draw to the metafile - using ( Graphics metafileGraphics = Graphics.FromImage( metafile ) ) - { - metafileGraphics.PageUnit = System.Drawing.GraphicsUnit.Point; - PointF P = new Point( this.ClientRectangle.Width, this.ClientRectangle.Height ); - PointF[] PA = new PointF[] { P }; - metafileGraphics.TransformPoints( CoordinateSpace.Page, CoordinateSpace.Device, PA ); - metafileGraphics.PageScale = 1f; - metafileGraphics.SmoothingMode = SmoothingMode.AntiAlias; // smooth the - // output - this.masterPane.Draw( metafileGraphics ); - metafileGraphics.DrawRectangle( new System.Drawing.Pen( Color.Gray ), this.ClientRectangle ); - metafile.Dispose(); - - } - - return true; - } - else - { - return false; - } - } - else - { - //no directory given - return false; - } - } - */ - internal PointF TransformCoord( double x, double y, CoordType coord ) - { - // If the Transformation is an illegal type, just stick it in the middle - if ( !( this is GraphPane ) && !( coord == CoordType.PaneFraction ) ) - { - coord = CoordType.PaneFraction; - x = 0.5; - y = 0.5; - } - - // Just to save some casts - GraphPane gPane = null; - RectangleF chartRect = new RectangleF( 0, 0, 1, 1 ); - if ( this is GraphPane ) - { - gPane = this as GraphPane; - chartRect = gPane.Chart._rect; - } - - PointF ptPix = new PointF(); - - if ( coord == CoordType.ChartFraction ) - { - ptPix.X = (float)( chartRect.Left + x * chartRect.Width ); - ptPix.Y = (float)( chartRect.Top + y * chartRect.Height ); - } - else if ( coord == CoordType.AxisXYScale ) - { - ptPix.X = gPane.XAxis.Scale.Transform( x ); - ptPix.Y = gPane.YAxis.Scale.Transform( y ); - } - else if ( coord == CoordType.AxisXY2Scale ) - { - ptPix.X = gPane.XAxis.Scale.Transform( x ); - ptPix.Y = gPane.Y2Axis.Scale.Transform( y ); - } - else if ( coord == CoordType.XScaleYChartFraction ) - { - ptPix.X = gPane.XAxis.Scale.Transform( x ); - ptPix.Y = (float)( chartRect.Top + y * chartRect.Height ); - } - else if ( coord == CoordType.XChartFractionYScale ) - { - ptPix.X = (float)( chartRect.Left + x * chartRect.Width ); - ptPix.Y = gPane.YAxis.Scale.Transform( y ); - } - else if ( coord == CoordType.XChartFractionY2Scale ) - { - ptPix.X = (float)( chartRect.Left + x * chartRect.Width ); - ptPix.Y = gPane.Y2Axis.Scale.Transform( y ); - } - else if ( coord == CoordType.XChartFractionYPaneFraction ) - { - ptPix.X = (float)( chartRect.Left + x * chartRect.Width ); - ptPix.Y = (float)( this.Rect.Top + y * _rect.Height ); - } - else if ( coord == CoordType.XPaneFractionYChartFraction ) - { - ptPix.X = (float)( this.Rect.Left + x * _rect.Width ); - ptPix.Y = (float)( chartRect.Top + y * chartRect.Height ); - } - else // PaneFraction - { - ptPix.X = (float)( _rect.Left + x * _rect.Width ); - ptPix.Y = (float)( _rect.Top + y * _rect.Height ); - } - - return ptPix; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PaneLayoutMgr.cs b/SDK/ZedGraphs/ZedGraph/PaneLayoutMgr.cs deleted file mode 100644 index 523ebd5..0000000 --- a/SDK/ZedGraphs/ZedGraph/PaneLayoutMgr.cs +++ /dev/null @@ -1,561 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright (C) 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// internal class to store pane layout details for the - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public class PaneLayoutMgr : ICloneable, ISerializable - { - // =========== PANE LAYOUT STUFF ================ - - #region Fields - - /// - /// private field that saves the paneLayout format specified when - /// was called. This value will - /// default to if - /// (or an overload) was never called. - /// - internal PaneLayout _paneLayout; - - /// - /// Private field that stores the boolean value that determines whether - /// is specifying rows or columns. - /// - internal bool _isColumnSpecified; - /// - /// private field that stores the row/column item count that was specified to the - /// method. This values will be - /// null if was never called. - /// - internal int[] _countList; - - /// - /// private field that stores the row/column size proportional values as specified - /// to the method. This - /// value will be null if - /// was never called. - /// - internal float[] _prop; - - #endregion - - #region Constructors - - internal void Init() - { - _paneLayout = MasterPane.Default.PaneLayout; - _countList = null; - _isColumnSpecified = false; - _prop = null; - } - - internal PaneLayoutMgr() - { - Init(); - } - - internal PaneLayoutMgr( PaneLayoutMgr rhs ) - { - _paneLayout = rhs._paneLayout; - _countList = rhs._countList; - _isColumnSpecified = rhs._isColumnSpecified; - _prop = rhs._prop; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public PaneLayoutMgr Clone() - { - return new PaneLayoutMgr( this ); - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - internal const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - public PaneLayoutMgr( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _paneLayout = (PaneLayout)info.GetValue( "paneLayout", typeof( PaneLayout ) ); - _countList = (int[])info.GetValue( "countList", typeof(int[]) ); - - _isColumnSpecified = info.GetBoolean( "isColumnSpecified" ); - _prop = (float[]) info.GetValue( "prop", typeof( float[] ) ); - } - - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - - info.AddValue( "paneLayout", _paneLayout ); - info.AddValue( "countList", _countList ); - info.AddValue( "isColumnSpecified", _isColumnSpecified ); - info.AddValue( "prop", _prop ); - } - #endregion - - #region Methods - - /// The SetLayout() methods setup the desired layout of the - /// objects within a . These functions - /// do not make any changes, they merely set the parameters so that future calls - /// to or - /// will use the desired layout.

- /// The layout options include a set of "canned" layouts provided by the - /// enumeration, options to just set a specific - /// number of rows and columns of panes (and all pane sizes are the same), and more - /// customized options of specifying the number or rows in each column or the number of - /// columns in each row, along with proportional values that determine the size of each - /// individual column or row. - ///
- /// - /// Automatically set all of the 's in - /// the list to a pre-defined layout configuration from a - /// enumeration. - /// - /// This method uses a enumeration to describe the type of layout - /// to be used. Overloads are available that provide other layout options - /// A enumeration that describes how - /// the panes should be laid out within the . - /// - /// - /// - public void SetLayout( PaneLayout paneLayout ) - { - Init(); - - _paneLayout = paneLayout; - } - - /// - /// Automatically set all of the 's in - /// the list to a reasonable configuration. - /// - /// This method explicitly specifies the number of rows and columns to use - /// in the layout, and all objects will have the same size. - /// Overloads are available that provide other layout options - /// The number of rows of objects - /// to include in the layout - /// The number of columns of objects - /// to include in the layout - /// - /// - /// - public void SetLayout( int rows, int columns ) - { - Init(); - - if ( rows < 1 ) - rows = 1; - if ( columns < 1 ) - columns = 1; - - int[] countList = new int[rows]; - - for (int i=0; i - /// Automatically set all of the 's in - /// the list to the specified configuration. - /// - /// This method specifies the number of rows in each column, or the number of - /// columns in each row, allowing for irregular layouts. Overloads are available that - /// provide other layout options. - /// - /// Specifies whether the number of columns in each row, or - /// the number of rows in each column will be specified. A value of true indicates the - /// number of columns in each row are specified in . - /// An integer array specifying either the number of columns in - /// each row or the number of rows in each column, depending on the value of - /// . - /// - /// - /// - public void SetLayout( bool isColumnSpecified, int[] countList ) - { - SetLayout( isColumnSpecified, countList, null ); - } - - /// - /// Automatically set all of the 's in - /// the list to the specified configuration. - /// - /// This method specifies the number of panes in each row or column, allowing for - /// irregular layouts. - /// This method specifies the number of rows in each column, or the number of - /// columns in each row, allowing for irregular layouts. Additionally, a - /// parameter is provided that allows varying column or - /// row sizes. Overloads for SetLayout() are available that provide other layout options. - /// - /// Specifies whether the number of columns in each row, or - /// the number of rows in each column will be specified. A value of true indicates the - /// number of columns in each row are specified in . - /// An integer array specifying either the number of columns in - /// each row or the number of rows in each column, depending on the value of - /// . - /// An array of float values specifying proportional sizes for each - /// row or column. Note that these proportions apply to the non-specified dimension -- that is, - /// if is true, then these proportions apply to the row - /// heights, and if is false, then these proportions apply - /// to the column widths. The values in this array are arbitrary floats -- the dimension of - /// any given row or column is that particular proportional value divided by the sum of all - /// the values. For example, let be true, and - /// is an array with values of { 1.0, 2.0, 3.0 }. The sum of - /// those values is 6.0. Therefore, the first row is 1/6th of the available height, the - /// second row is 2/6th's of the available height, and the third row is 3/6th's of the - /// available height. - /// - /// - /// - /// - public void SetLayout( bool isColumnSpecified, int[] countList, float[] proportion ) - { - Init(); - - // use defaults if the parameters are invalid - if ( countList != null && countList.Length > 0 ) - { - this._prop = new float[countList.Length]; - - // Sum up the total proportional factors - float sumProp = 0.0f; - for ( int i = 0; i < countList.Length; i++ ) - { - this._prop[i] = ( proportion == null || proportion.Length <= i || proportion[i] < 1e-10 ) ? - 1.0f : proportion[i]; - sumProp += this._prop[i]; - } - - // Make prop sum to 1.0 - for ( int i=0; i - /// Modify the sizes of each - /// such that they fit within the - /// in a pre-configured layout. - /// - /// The method (and overloads) is - /// used for setting the layout configuration. - /// A instance to be used for font sizing, - /// etc. in determining the layout configuration. - /// The instance which is to - /// be resized. - /// - /// - /// - /// - public void DoLayout( Graphics g, MasterPane master ) - { - if ( this._countList != null ) - DoLayout( g, master, this._isColumnSpecified, this._countList, this._prop ); - else - { - int count = master.PaneList.Count; - if ( count == 0 ) - return; - - int rows, - cols, - root = (int)( Math.Sqrt( (double)count ) + 0.9999999 ); - - //float[] widthList = new float[5]; - - switch ( _paneLayout ) - { - case PaneLayout.ForceSquare: - rows = root; - cols = root; - DoLayout( g, master, rows, cols ); - break; - case PaneLayout.SingleColumn: - rows = count; - cols = 1; - DoLayout( g, master, rows, cols ); - break; - case PaneLayout.SingleRow: - rows = 1; - cols = count; - DoLayout( g, master, rows, cols ); - break; - default: - case PaneLayout.SquareColPreferred: - rows = root; - cols = root; - if ( count <= root * ( root - 1 ) ) - rows--; - DoLayout( g, master, rows, cols ); - break; - case PaneLayout.SquareRowPreferred: - rows = root; - cols = root; - if ( count <= root * ( root - 1 ) ) - cols--; - DoLayout( g, master, rows, cols ); - break; - case PaneLayout.ExplicitCol12: - DoLayout( g, master, true, new int[2] { 1, 2 }, null ); - break; - case PaneLayout.ExplicitCol21: - DoLayout( g, master, true, new int[2] { 2, 1 }, null ); - break; - case PaneLayout.ExplicitCol23: - DoLayout( g, master, true, new int[2] { 2, 3 }, null ); - break; - case PaneLayout.ExplicitCol32: - DoLayout( g, master, true, new int[2] { 3, 2 }, null ); - break; - case PaneLayout.ExplicitRow12: - DoLayout( g, master, false, new int[2] { 1, 2 }, null ); - break; - case PaneLayout.ExplicitRow21: - DoLayout( g, master, false, new int[2] { 2, 1 }, null ); - break; - case PaneLayout.ExplicitRow23: - DoLayout( g, master, false, new int[2] { 2, 3 }, null ); - break; - case PaneLayout.ExplicitRow32: - DoLayout( g, master, false, new int[2] { 3, 2 }, null ); - break; - } - } - } - - /// - /// Internal method that applies a previously set layout with a specific - /// row and column count. This method is only called by - /// . - /// - internal void DoLayout( Graphics g, MasterPane master, int rows, int columns ) - { - if ( rows < 1 ) - rows = 1; - if ( columns < 1 ) - columns = 1; - - int[] countList = new int[rows]; - - for (int i=0; i - /// Internal method that applies a previously set layout with a rows per column or - /// columns per row configuration. This method is only called by - /// . - /// - internal void DoLayout( Graphics g, MasterPane master, bool isColumnSpecified, int[] countList, - float[] proportion ) - { - - // calculate scaleFactor on "normal" pane size (BaseDimension) - float scaleFactor = master.CalcScaleFactor(); - - // innerRect is the area for the GraphPane's - RectangleF innerRect = master.CalcClientRect( g, scaleFactor ); - master.Legend.CalcRect( g, master, scaleFactor, ref innerRect ); - - // scaled InnerGap is the area between the GraphPane.Rect's - float scaledInnerGap = (float)( master._innerPaneGap * scaleFactor ); - - int iPane = 0; - - if ( isColumnSpecified ) - { - int rows = countList.Length; - - float y = 0.0f; - - for ( int rowNum = 0; rowNum < rows; rowNum++ ) - { - float propFactor = _prop == null ? 1.0f / rows : _prop[rowNum]; - - float height = ( innerRect.Height - (float)( rows - 1 ) * scaledInnerGap ) * - propFactor; - - int columns = countList[rowNum]; - if ( columns <= 0 ) - columns = 1; - float width = ( innerRect.Width - (float)( columns - 1 ) * scaledInnerGap ) / - (float)columns; - - if ( iPane >= master._paneList.Count ) - return; - - for ( int colNum = 0; colNum < columns; colNum++ ) - { - master[iPane].Rect = new RectangleF( - innerRect.X + colNum * ( width + scaledInnerGap ), - innerRect.Y + y, - width, - height ); - iPane++; - } - - y += height + scaledInnerGap; - } - } - else - { - int columns = countList.Length; - - float x = 0.0f; - - for ( int colNum = 0; colNum < columns; colNum++ ) - { - float propFactor = _prop == null ? 1.0f / columns : _prop[colNum]; - - float width = ( innerRect.Width - (float)( columns - 1 ) * scaledInnerGap ) * - propFactor; - - int rows = countList[colNum]; - if ( rows <= 0 ) - rows = 1; - float height = ( innerRect.Height - (float)( rows - 1 ) * scaledInnerGap ) / (float)rows; - - for ( int rowNum = 0; rowNum < rows; rowNum++ ) - { - if ( iPane >= master._paneList.Count ) - return; - - master[iPane].Rect = new RectangleF( - innerRect.X + x, - innerRect.Y + rowNum * ( height + scaledInnerGap ), - width, - height ); - iPane++; - } - - x += width + scaledInnerGap; - } - } - } - - /* - /// - /// Automatically set all of the 's in - /// the list to a reasonable configuration. - /// - /// This method explicitly specifies the number of rows and columns to use in the layout. - /// A more automatic overload, using a enumeration, is available. - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The number of rows of objects - /// to include in the layout - /// The number of columns of objects - /// to include in the layout - public void DoPaneLayout( Graphics g, int rows, int columns ) - { - // save the layout settings for future reference - this._countList = null; - this._rows = rows; - this._columns = columns; - - // calculate scaleFactor on "normal" pane size (BaseDimension) - float scaleFactor = this.CalcScaleFactor(); - - // innerRect is the area for the GraphPane's - RectangleF innerRect = CalcClientRect( g, scaleFactor ); - this._legend.CalcRect( g, this, scaleFactor, ref innerRect ); - - // scaled InnerGap is the area between the GraphPane.Rect's - float scaledInnerGap = (float)( this._innerPaneGap * scaleFactor ); - - float width = ( innerRect.Width - (float)( columns - 1 ) * scaledInnerGap ) / (float)columns; - float height = ( innerRect.Height - (float)( rows - 1 ) * scaledInnerGap ) / (float)rows; - - int i = 0; - foreach ( GraphPane pane in this._paneList ) - { - float rowNum = (float)( i / columns ); - float colNum = (float)( i % columns ); - - pane.Rect = new RectangleF( - innerRect.X + colNum * ( width + scaledInnerGap ), - innerRect.Y + rowNum * ( height + scaledInnerGap ), - width, - height ); - - i++; - } - } - */ - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PaneList.cs b/SDK/ZedGraphs/ZedGraph/PaneList.cs deleted file mode 100644 index e89a15f..0000000 --- a/SDK/ZedGraphs/ZedGraph/PaneList.cs +++ /dev/null @@ -1,237 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects. - /// - /// - /// John Champion - /// $Revision: 3.6 $ $Date: 2006-06-24 20:26:43 $ - [Serializable] - public class PaneList : List, ICloneable - { - - #region Constructors - - /// - /// Default constructor for the collection class. - /// - public PaneList() - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public PaneList( PaneList rhs ) - { - foreach ( GraphPane item in rhs ) - { - this.Add( item.Clone() ); - } - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public PaneList Clone() - { - return new PaneList( this ); - } - - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected PaneList( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - } - #endregion - - #region List Methods -/* /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public GraphPane this[ int index ] - { - get { return( (GraphPane) List[index] ); } - set { List[index] = value; } - } -*/ - /// - /// Indexer to access the specified object by - /// its string. - /// - /// The string title of the - /// object to be accessed. - /// A object reference. - public GraphPane this[ string title ] - { - get - { - int index = IndexOf( title ); - if ( index >= 0 ) - return( (GraphPane) this[index] ); - else - return null; - } - } -/* - /// - /// Add a object to the collection at the end of the list. - /// - /// A reference to the object to - /// be added - /// - public void Add( GraphPane pane ) - { - List.Add( pane ); - } - - /// - /// Remove a object from the collection based on an object reference. - /// - /// A reference to the object that is to be - /// removed. - /// - public void Remove( GraphPane pane ) - { - List.Remove( pane ); - } - - /// - /// Insert a object into the collection at the specified - /// zero-based index location. - /// - /// The zero-based index location for insertion. - /// A reference to the object that is to be - /// inserted. - /// - public void Insert( int index, GraphPane pane ) - { - List.Insert( index, pane ); - } -*/ - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// The comparison of titles is not case sensitive, but it must include - /// all characters including punctuation, spaces, etc. - /// The label that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the was not found in the list - /// - public int IndexOf( string title ) - { - int index = 0; - foreach ( GraphPane pane in this ) - { - if ( String.Compare( pane.Title.Text, title, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// In order for this method to work, the - /// property must be of type . - /// The tag that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the string is not in the list - public int IndexOfTag( string tagStr ) - { - int index = 0; - foreach ( GraphPane pane in this ) - { - if ( pane.Tag is string && - String.Compare( (string) pane.Tag, tagStr, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PieItem.cs b/SDK/ZedGraphs/ZedGraph/PieItem.cs deleted file mode 100644 index 953a59c..0000000 --- a/SDK/ZedGraphs/ZedGraph/PieItem.cs +++ /dev/null @@ -1,1091 +0,0 @@ -//============================================================================ -//PieItem Class -//Copyright 2005 Bob Kaye -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections; -using System.Drawing.Drawing2D; -using System.Globalization; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class representing a pie chart object comprised of one or more - /// s. - /// - /// Bob Kaye - /// $Revision: 1.32 $ $Date: 2007-07-30 05:26:23 $ - [Serializable] - public class PieItem : CurveItem, ICloneable, ISerializable - { - - #region Fields - /* - /// - /// Private field instance of the class indicating whether - /// the instance is displayed in 2D or 3D.(see ) - /// - private PieType pieType; -*/ - /// - /// Percentage (expressed as #.##) of radius to - /// which this is to be displaced from the center. - /// Displacement is done outward along the radius - /// bisecting the chord of this . Maximum allowable value - /// is 0.5. - /// - private double _displacement; - - /// - /// A which will customize the label display of this - /// - /// - private TextObj _labelDetail; - - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Fill _fill; - - /// - /// Private field that stores the class that defines the - /// properties of the border around this . Use the public - /// property to access this value. - /// - private Border _border; - - /// - /// Private field that stores the absolute value of this instance. - /// Value will be set to zero if submitted value is less than zero. - /// - private double _pieValue; - - /// - /// An enum that specifies how each for this object - /// will be displayed. Use the public property to access this data. - /// Use enum . - /// - private PieLabelType _labelType; - /// - /// The point on the arc of this representing the intersection of - /// the arc and the explosion radius. - /// - private PointF _intersectionPoint; - - /// - /// The bounding rectangle for this . - /// - private RectangleF _boundingRectangle; - - /// - /// The formatted string for this 's label. Formatting is - /// done based on the . - /// - private string _labelStr; - /// - /// The point at which the line between this and its - /// label bends to the horizontal. - /// - private PointF _pivotPoint; - /// - /// The point at the end of the line between this and - /// it's label (i.e. the beginning of the label display) - /// - private PointF _endPoint; - - /// - /// Private field to hold the GraphicsPath of this to be - /// used for 'hit testing'. - /// - private GraphicsPath _slicePath; - - /// - /// Private field which holds the angle (in degrees) at which the display of this - /// object will begin. - /// - private float _startAngle; - - /// - ///Private field which holds the length (in degrees) of the arc representing this - ///object. - /// - private float _sweepAngle; - - /// - ///Private field which represents the angle (in degrees) of the radius along which this - ///object will be displaced, if desired. - /// - private float _midAngle; - - /// - ///Private field which determines the number of decimal digits displayed to - ///in a label containing a value. - /// - private int _valueDecimalDigits; - - /// - ///Private field which determines the number of decimal digits displayed - ///in a label containing a percent. - /// - private int _percentDecimalDigits; - - private static ColorSymbolRotator _rotator = new ColorSymbolRotator(); - - #endregion - - #region Defaults - /// - /// Specify the default property values for the class. - /// - public struct Default - { - /// - ///Default displacement. - /// - public static double Displacement = 0; - - /// - /// The default pen width to be used for drawing the border around the PieItem - /// ( property). Units are points. - /// - public static float BorderWidth = 1.0F; - /// - /// The default fill mode for this PieItem ( property). - /// - public static FillType FillType = FillType.Brush; - /// - /// The default border mode for PieItem ( property). - /// true to display frame around PieItem, false otherwise - /// - public static bool IsBorderVisible = true; - /// - /// The default color for drawing frames around PieItem - /// ( property). - /// - public static Color BorderColor = Color.Black; - /// - /// The default color for filling in the PieItem - /// ( property). - /// - public static Color FillColor = Color.Red; - /// - /// The default custom brush for filling in the PieItem. - /// ( property). - /// - public static Brush FillBrush = null; - - /// - ///Default value for controlling display. - /// - public static bool isVisible = true; - - /// - /// Default value for . - /// - public static PieLabelType LabelType = PieLabelType.Name; - - /// - /// The default font size for entries - /// ( property). Units are - /// in points (1/72 inch). - /// - public static float FontSize = 10; - - /// - /// Default value for the number of decimal digits - /// to be displayed when contains a value. - /// - public static int ValueDecimalDigits = 0; - - /// - /// Default value for the number of decimal digits - /// to be displayed where contains a percent. - /// - public static int PercentDecimalDigits = 2; - } - #endregion Defaults - - #region PieItem Properties - /// - /// Gets or sets the a value which determines the amount, if any, of this - /// displacement. - /// - public double Displacement - { - get { return ( _displacement ); } - set { _displacement = value > .5 ? .5 : value; } - } - - /// - /// Gets a path representing this - /// - public GraphicsPath SlicePath - { - get { return _slicePath; } - } - - /// - /// Gets or sets the to be used - /// for displaying this 's label. - /// - public TextObj LabelDetail - { - get { return _labelDetail; } - set { _labelDetail = value; } - } - - /// - /// Gets or sets the object so as to be able to modify - /// its properties. - /// - public Border Border - { - get { return ( _border ); } - set { _border = value; } - } - - /// - /// Gets or sets the object which is used to fill the - /// pie slice with color. - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - - /// - /// Gets or sets the arc length (in degrees) of this . - /// - private float SweepAngle - { - get { return _sweepAngle; } - set { _sweepAngle = value; } - } - - /// - /// Gets or sets the starting angle (in degrees) of this . - /// - private float StartAngle - { - get { return ( _startAngle ); } - set { _startAngle = value; } - } - - /// - /// Gets or sets the angle (in degrees) of the radius along which - /// this will be displaced. - /// - private float MidAngle - { - get { return ( _midAngle ); } - set { _midAngle = value; } - } - - /// - /// Gets or sets the value of this . - /// Minimum value is 0. - /// - public double Value - { - get { return ( _pieValue ); } - set { _pieValue = value > 0 ? value : 0; } - } - - /// - /// Gets or sets the to be used in displaying - /// labels. - /// - public PieLabelType LabelType - { - get { return ( _labelType ); } - set - { - _labelType = value; - if ( value == PieLabelType.None ) - this.LabelDetail.IsVisible = false; - else - this.LabelDetail.IsVisible = true; - } - } - - /// - /// Gets or sets the number of decimal digits to be displayed in a - /// value label. - /// - public int ValueDecimalDigits - { - get { return ( _valueDecimalDigits ); } - set { _valueDecimalDigits = value; } - } - - /// - /// Gets or sets the number of decimal digits to be displayed in a - /// percent label. - /// - public int PercentDecimalDigits - { - get { return ( _percentDecimalDigits ); } - set { _percentDecimalDigits = value; } - } - - /* - /// - /// Getsor sets enum to be used for drawing this . - /// - public PieType PieType - { - get { return (this.pieType); } - set { this.pieType = value; } - } - */ - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return false; - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return true; - } - - #endregion - - #region Constructors - /// - /// Create a new , providing a gradient fill for the pie color. - /// - /// The value associated with this instance. - /// The starting display color for the gradient for this - /// instance. - /// The ending display color for the gradient for this - /// instance. - /// The angle for the gradient . - /// The amount this instance will be - /// displaced from the center point. - /// Text label for this instance. - public PieItem( double pieValue, Color color1, Color color2, float fillAngle, - double displacement, string label ) - : - this( pieValue, color1, displacement, label ) - { - if ( !color1.IsEmpty && !color2.IsEmpty ) - _fill = new Fill( color1, color2, fillAngle ); - } - - /// - /// Create a new . - /// - /// The value associated with this instance. - /// The display color for this instance. - /// The amount this instance will be - /// displaced from the center point. - /// Text label for this instance. - public PieItem( double pieValue, Color color, double displacement, string label ) - : base( label ) - { - _pieValue = pieValue; - _fill = new Fill( color.IsEmpty ? _rotator.NextColor : color ); - _displacement = displacement; - _border = new Border( Default.BorderColor, Default.BorderWidth ); - _labelDetail = new TextObj(); - _labelDetail.FontSpec.Size = Default.FontSize; - _labelType = Default.LabelType; - _valueDecimalDigits = Default.ValueDecimalDigits; - _percentDecimalDigits = Default.PercentDecimalDigits; - _slicePath = null; - } - - /// - /// Create a new . - /// - /// The value associated with this instance. - /// Text label for this instance - public PieItem( double pieValue, string label ) - : - this( pieValue, _rotator.NextColor, Default.Displacement, label ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public PieItem( PieItem rhs ) - : base( rhs ) - { - _pieValue = rhs._pieValue; - _fill = rhs._fill.Clone(); - this.Border = rhs._border.Clone(); - _displacement = rhs._displacement; - _labelDetail = rhs._labelDetail.Clone(); - _labelType = rhs._labelType; - _valueDecimalDigits = rhs._valueDecimalDigits; - _percentDecimalDigits = rhs._percentDecimalDigits; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public PieItem Clone() - { - return new PieItem( this ); - } - - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected PieItem( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _displacement = info.GetDouble( "displacement" ); - _labelDetail = (TextObj)info.GetValue( "labelDetail", typeof( TextObj ) ); - _fill = (Fill)info.GetValue( "fill", typeof( Fill ) ); - _border = (Border)info.GetValue( "border", typeof( Border ) ); - _pieValue = info.GetDouble( "pieValue" ); - _labelType = (PieLabelType)info.GetValue( "labelType", typeof( PieLabelType ) ); - _intersectionPoint = (PointF)info.GetValue( "intersectionPoint", typeof( PointF ) ); - _boundingRectangle = (RectangleF)info.GetValue( "boundingRectangle", typeof( RectangleF ) ); - _pivotPoint = (PointF)info.GetValue( "pivotPoint", typeof( PointF ) ); - _endPoint = (PointF)info.GetValue( "endPoint", typeof( PointF ) ); - // _slicePath = (GraphicsPath)info.GetValue( "slicePath", typeof( GraphicsPath ) ); - _startAngle = (float)info.GetDouble( "startAngle" ); - _sweepAngle = (float)info.GetDouble( "sweepAngle" ); - _midAngle = (float)info.GetDouble( "midAngle" ); - _labelStr = info.GetString( "labelStr" ); - _valueDecimalDigits = info.GetInt32( "valueDecimalDigits" ); - _percentDecimalDigits = info.GetInt32( "percentDecimalDigits" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "displacement", _displacement ); - info.AddValue( "labelDetail", _labelDetail ); - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - info.AddValue( "pieValue", _pieValue ); - info.AddValue( "labelType", _labelType ); - info.AddValue( "intersectionPoint", _intersectionPoint ); - info.AddValue( "boundingRectangle", _boundingRectangle ); - info.AddValue( "pivotPoint", _pivotPoint ); - info.AddValue( "endPoint", _endPoint ); - // info.AddValue( "slicePath", _slicePath ); - info.AddValue( "startAngle", _startAngle ); - info.AddValue( "sweepAngle", _sweepAngle ); - info.AddValue( "midAngle", _midAngle ); - info.AddValue( "labelStr", _labelStr ); - info.AddValue( "valueDecimalDigits", _valueDecimalDigits ); - info.AddValue( "percentDecimalDigits", _percentDecimalDigits ); - } - - #endregion - - #region Methods - /// - /// Do all rendering associated with this item to the specified - /// device. This method is normally only - /// called by the Draw method of the parent - /// collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// Not used for rendering Piesparam> - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, GraphPane pane, int pos, float scaleFactor ) - { - if ( pane.Chart._rect.Width <= 0 && pane.Chart._rect.Height <= 0 ) - { - //pane.PieRect = RectangleF.Empty; - _slicePath = null; - } - else - { - //pane.PieRect = CalcPieRect( g, pane, scaleFactor, pane.ChartRect ); - CalcPieRect( g, pane, scaleFactor, pane.Chart._rect ); - - _slicePath = new GraphicsPath(); - - if ( !_isVisible ) - return; - - RectangleF tRect = _boundingRectangle; - - if ( tRect.Width >= 1 && tRect.Height >= 1 ) - { - SmoothingMode sMode = g.SmoothingMode; - g.SmoothingMode = SmoothingMode.AntiAlias; - - Fill tFill = _fill; - Border tBorder = _border; - if ( this.IsSelected ) - { - tFill = Selection.Fill; - tBorder = Selection.Border; - } - - using ( Brush brush = tFill.MakeBrush( _boundingRectangle ) ) - { - g.FillPie( brush, tRect.X, tRect.Y, tRect.Width, tRect.Height, this.StartAngle, this.SweepAngle ); - - //add GraphicsPath for hit testing - _slicePath.AddPie( tRect.X, tRect.Y, tRect.Width, tRect.Height, - this.StartAngle, this.SweepAngle ); - - if ( this.Border.IsVisible ) - { - using ( Pen borderPen = tBorder.GetPen( pane, scaleFactor ) ) - { - g.DrawPie( borderPen, tRect.X, tRect.Y, tRect.Width, tRect.Height, - this.StartAngle, this.SweepAngle ); - } - } - - if ( _labelType != PieLabelType.None ) - DrawLabel( g, pane, tRect, scaleFactor ); - - //brush.Dispose(); - } - - g.SmoothingMode = sMode; - } - } - } - - /// - /// Calculate the that will be used to define the bounding rectangle of - /// the Pie. - /// - /// This rectangle always lies inside of the , and it is - /// normally a square so that the pie itself is not oval-shaped. - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// The (normally the ) - /// that bounds this pie. - /// - public static RectangleF CalcPieRect( Graphics g, GraphPane pane, float scaleFactor, RectangleF chartRect ) - { - //want to draw the largest pie possible within ChartRect - //but want to leave 5% slack around the pie so labels will not overrun clip area - //largest pie is limited by the smaller of ChartRect.height or ChartRect.width... - //this rect (nonExplRect)has to be re-positioned so that it's in the center of ChartRect. - //Where ChartRect is almost a square - low Aspect Ratio -, need to contract pieRect so that there's some - //room for labels, if they're visible. - double maxDisplacement = 0; - RectangleF tempRect; //= new RectangleF(0,0,0,0); - - RectangleF nonExplRect = chartRect; - - if ( pane.CurveList.IsPieOnly ) - { - if ( nonExplRect.Width < nonExplRect.Height ) - { - //create slack rect - nonExplRect.Inflate( -(float)0.05F * nonExplRect.Height, -(float)0.05F * nonExplRect.Width ); - //get the difference between dimensions - float delta = ( nonExplRect.Height - nonExplRect.Width ) / 2; - //make a square so we end up with circular pie - nonExplRect.Height = nonExplRect.Width; - //keep the center point the same - nonExplRect.Y += delta; - } - else - { - nonExplRect.Inflate( -(float)0.05F * nonExplRect.Height, -(float)0.05F * nonExplRect.Width ); - float delta = ( nonExplRect.Width - nonExplRect.Height ) / 2; - nonExplRect.Width = nonExplRect.Height; - nonExplRect.X += delta; - } - //check aspect ratio - double aspectRatio = chartRect.Width / chartRect.Height; - //make an adjustment in rect size,as aspect ratio varies - if ( aspectRatio < 1.5 ) - nonExplRect.Inflate( -(float)( .1 * ( 1.5 / aspectRatio ) * nonExplRect.Width ), - -(float)( .1 * ( 1.5 / aspectRatio ) * nonExplRect.Width ) ); - - //modify the rect to determine if any of the labels need to be wrapped.... - //first see if there's any exploded slices and if so, what's the max displacement... - //also, might as well get all the display params we can - PieItem.CalculatePieChartParams( pane, ref maxDisplacement ); - - if ( maxDisplacement != 0 ) //need new rectangle if any slice exploded - CalcNewBaseRect( maxDisplacement, ref nonExplRect ); - - foreach ( PieItem slice in pane.CurveList ) - { - slice._boundingRectangle = nonExplRect; - //if exploded, need to re-calculate rectangle for slice - if ( slice.Displacement != 0 ) - { - tempRect = nonExplRect; - slice.CalcExplodedRect( ref tempRect ); - slice._boundingRectangle = tempRect; - } - //now get all the other slice specific drawing details, including need for wrapping label - slice.DesignLabel( g, pane, slice._boundingRectangle, scaleFactor ); - } - } - return nonExplRect; - } - - /// - /// Recalculate the bounding rectangle when a piee slice is displaced. - /// - /// rectangle to be used for drawing exploded pie - private void CalcExplodedRect( ref RectangleF explRect ) - { - //pie exploded out along the slice bisector - modify upper left of bounding rect to account for displacement - //keep height and width same - explRect.X += (float)( this.Displacement * explRect.Width / 2 * Math.Cos( _midAngle * Math.PI / 180 ) ); - explRect.Y += (float)( this.Displacement * explRect.Height / 2 * Math.Sin( _midAngle * Math.PI / 180 ) ); - } - - /// - /// Calculate the values needed to properly display this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// maximum slice displacement - private static void CalculatePieChartParams( GraphPane pane, ref double maxDisplacement ) - { - string lblStr = " "; - - //loop thru slices and get total value and maxDisplacement - double pieTotalValue = 0; - foreach ( PieItem curve in pane.CurveList ) - if ( curve.IsPie ) - { - pieTotalValue += curve._pieValue; - if ( curve.Displacement > maxDisplacement ) - maxDisplacement = curve.Displacement; - } - - double nextStartAngle = 0; - //now loop thru and calculate the various angle values - foreach ( PieItem curve in pane.CurveList ) - { - lblStr = curve._labelStr; - curve.StartAngle = (float)nextStartAngle; - curve.SweepAngle = (float)( 360 * curve.Value / pieTotalValue ); - curve.MidAngle = curve.StartAngle + curve.SweepAngle / 2; - nextStartAngle = curve._startAngle + curve._sweepAngle; - PieItem.BuildLabelString( curve ); - } - } - - /// - /// Render the label for this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// Bounding rectangle for this . - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void DrawLabel( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor ) - { - if ( !_labelDetail.IsVisible ) - return; - - using ( Pen labelPen = this.Border.GetPen( pane, scaleFactor ) ) - { - //draw line from intersection point to pivot point - - g.DrawLine( labelPen, _intersectionPoint, _pivotPoint ); - - //draw horizontal line to move label away from pie... - g.DrawLine( labelPen, _pivotPoint, _endPoint ); - } - - //draw the label (TextObj) - _labelDetail.Draw( g, pane, scaleFactor ); - } - - /// - /// This method collects all the data relative to rendering this 's label. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The rectangle used for rendering this - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public void DesignLabel( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor ) - { - if ( !_labelDetail.IsVisible ) - return; - - _labelDetail.LayoutArea = new SizeF(); - //this.labelDetail.IsWrapped = false; - - //label line will come off the explosion radius and then pivot to the horizontal right or left, - //dependent on position.. - //text will be at the end of horizontal segment... - CalculateLinePoints( rect, _midAngle ); - - //now get size of bounding rect for label - SizeF size = _labelDetail.FontSpec.BoundingBox( g, _labelStr, scaleFactor ); - - //how much room left for the label - most likely midangles for wrapping - //Right - 315 -> 45 degrees - //Bottom - 45 -> 135 - //Left - 135 -> 225 - //Top - 225 -> 315 - RectangleF chartRect = pane.Chart._rect; - float fill = 0; - if ( _midAngle > 315 || _midAngle <= 45 ) - { - //correct by wrapping text - fill = chartRect.X + chartRect.Width - _endPoint.X - 5; - if ( size.Width > fill ) - { - //need to wrap, so create label rectangle for overloaded DrawString - two rows, max - _labelDetail.LayoutArea = new SizeF( fill, size.Height * 3.0F ); - } - } - - if ( _midAngle > 45 && _midAngle <= 135 ) - { - //correct by moving radial line toward one or the other end of the range - fill = chartRect.Y + chartRect.Height - _endPoint.Y - 5; - //is there enuf room for the label - if ( size.Height / 2 > fill ) - { - //no, so got to move explosion radius - if ( _midAngle > 90 ) //move _label clockwise one-third of way to the end of the arc - CalculateLinePoints( rect, _midAngle + ( _sweepAngle + _startAngle - _midAngle ) / 3 ); - else //move _label counter-clockwise one-third of way to the start of the arc - CalculateLinePoints( rect, _midAngle - ( _midAngle - ( _midAngle - _startAngle ) / 3 ) ); - } - } - - if ( _midAngle > 135 && _midAngle <= 225 ) - { - //wrap text - fill = _endPoint.X - chartRect.X - 5; - //need to wrap, so create label rectangle for overloaded DrawString - two rows, max - if ( size.Width > fill ) - { - _labelDetail.LayoutArea = new SizeF( fill, size.Height * 3.0F ); - } - } - - if ( _midAngle > 225 && _midAngle <= 315 ) - { - //correct by moving radial line toward one or the other end of the range - fill = _endPoint.Y - 5 - chartRect.Y; - //is there enuf room for the label - if ( size.Height / 2 > fill ) - { - //no, so got to move explosion radius - if ( _midAngle < 270 ) //move _label counter-clockwise one-third of way to the start of the arc - CalculateLinePoints( rect, _midAngle - ( _sweepAngle + _startAngle - _midAngle ) / 3 ); - else //move _label clockwise one-third of way to the end of the arc - CalculateLinePoints( rect, _midAngle + ( _midAngle - _startAngle ) / 3 ); - } - } - - //complete the location Detail info - _labelDetail.Location.AlignV = AlignV.Center; - _labelDetail.Location.CoordinateFrame = CoordType.PaneFraction; - _labelDetail.Location.X = ( _endPoint.X - pane.Rect.X ) / pane.Rect.Width; - _labelDetail.Location.Y = ( _endPoint.Y - pane.Rect.Y ) / pane.Rect.Height; - _labelDetail.Text = _labelStr; - } - - /// - /// - /// - /// - /// - private void CalculateLinePoints( RectangleF rect, double midAngle ) - { - //get the point where the explosion radius intersects the this arc - PointF rectCenter = new PointF( ( rect.X + rect.Width / 2 ), ( rect.Y + rect.Height / 2 ) ); - - _intersectionPoint = new PointF( (float)( rectCenter.X + ( rect.Width / 2 * Math.Cos( ( midAngle ) * Math.PI / 180 ) ) ), - (float)( rectCenter.Y + ( rect.Height / 2 * Math.Sin( ( midAngle ) * Math.PI / 180 ) ) ) ); - - //draw line from intersection point to pivot point - length to be .05 * pieRect.Width pixels long - _pivotPoint = new PointF( (float)( _intersectionPoint.X + .05 * rect.Width * Math.Cos( ( midAngle ) * Math.PI / 180 ) ), - (float)( _intersectionPoint.Y + .05 * rect.Width * Math.Sin( ( midAngle ) * Math.PI / 180 ) ) ); - - //add horizontal line to move label away from pie...length to be 5% of rect.Width - //does line go to left or right....label alignment is to the opposite - if ( _pivotPoint.X >= rectCenter.X ) //goes to right - { - _endPoint = new PointF( (float)( _pivotPoint.X + .05 * rect.Width ), _pivotPoint.Y ); - _labelDetail.Location.AlignH = AlignH.Left; - } - else - { - _endPoint = new PointF( (float)( _pivotPoint.X - .05 * rect.Width ), _pivotPoint.Y ); - _labelDetail.Location.AlignH = AlignH.Right; - } - _midAngle = (float)midAngle; - } - - /// - /// Build the string that will be displayed as the slice label as determined by - /// . - /// - /// reference to the - private static void BuildLabelString( PieItem curve ) - { - //set up label string formatting - NumberFormatInfo labelFormat = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone(); - - labelFormat.NumberDecimalDigits = curve._valueDecimalDigits; - labelFormat.PercentPositivePattern = 1; //no space between number and % sign - labelFormat.PercentDecimalDigits = curve._percentDecimalDigits; - - switch ( curve._labelType ) - { - case PieLabelType.Value: - curve._labelStr = curve._pieValue.ToString( "F", labelFormat ); - break; - case PieLabelType.Percent: - curve._labelStr = ( curve._sweepAngle / 360 ).ToString( "P", labelFormat ); - break; - case PieLabelType.Name_Value: - curve._labelStr = curve._label._text + ": " + curve._pieValue.ToString( "F", labelFormat ); - break; - case PieLabelType.Name_Percent: - curve._labelStr = curve._label._text + ": " + ( curve._sweepAngle / 360 ).ToString( "P", labelFormat ); - break; - case PieLabelType.Name_Value_Percent: - curve._labelStr = curve._label._text + ": " + curve._pieValue.ToString( "F", labelFormat ) + - " (" + ( curve._sweepAngle / 360 ).ToString( "P", labelFormat ) + ")"; - break; - case PieLabelType.Name: - curve._labelStr = curve._label._text; - break; - case PieLabelType.None: - default: - break; - } - } - - /// - /// A method which calculates a new size for the bounding rectangle for the non-displaced - /// 's in the pie chart. This method is called after it is found - /// that at least one slice is displaced. - /// - /// The biggest displacement among the s - /// making up the pie chart. - /// The current bounding rectangle - private static void CalcNewBaseRect( double maxDisplacement, ref RectangleF baseRect ) - { - //displacement expressed in terms of % of pie radius ...do not want exploded slice to - //go beyond nonExplRect, but want to maintain the same center point...therefore, got to - //reduce the diameter of the nonexploded pie by the alue of the displacement - - float xDispl = (float)( ( maxDisplacement * baseRect.Width ) ); - float yDispl = (float)( ( maxDisplacement * baseRect.Height ) ); - - baseRect.Inflate( -(float)( ( xDispl / 10 ) ), -(float)( ( xDispl / 10 ) ) ); - } - - /// - /// Draw a legend key entry for this at the specified location - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The struct that specifies the - /// location for the legend key - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void DrawLegendKey( Graphics g, GraphPane pane, RectangleF rect, float scaleFactor ) - { - if ( !_isVisible ) - return; - - // Fill the slice - if ( _fill.IsVisible ) - { - // just avoid height/width being less than 0.1 so GDI+ doesn't cry - using ( Brush brush = _fill.MakeBrush( rect ) ) - { - g.FillRectangle( brush, rect ); - //brush.Dispose(); - } - } - - // Border the bar - if ( !_border.Color.IsEmpty ) - _border.Draw( g, pane, scaleFactor, rect ); - } - - /// - /// Determine the coords for the rectangle associated with a specified point for - /// this - /// - /// The to which this curve belongs - /// The index of the point of interest - /// A list of coordinates that represents the "rect" for - /// this point (used in an html AREA tag) - /// true if it's a valid point, false otherwise - override public bool GetCoords( GraphPane pane, int i, out string coords ) - { - coords = string.Empty; - - PointF pt = _boundingRectangle.Location; - pt.X += _boundingRectangle.Width / 2.0f; - pt.Y += _boundingRectangle.Height / 2.0f; - - float radius = _boundingRectangle.Width / 2.0f; - Matrix matrix = new Matrix(); - - // Move the coordinate system to local coordinates - // of this text object (that is, at the specified - // x,y location) - matrix.Translate( pt.X, pt.Y ); - - matrix.Rotate( this.StartAngle ); - //One mark every 5'ish degrees - int count = (int)Math.Floor ( SweepAngle / 5 ) + 1; - PointF[] pts = new PointF[2 + count]; - pts[0] = new PointF( 0, 0 ); - pts[1] = new PointF( radius, 0 ); - double angle = 0.0; - for ( int j = 2; j < count + 2; j++ ) - { - angle += SweepAngle / count; - - pts[j] = new PointF(radius * (float)Math.Cos(angle * Math.PI / 180.0), - radius * (float)Math.Sin( angle * Math.PI / 180.0 ) ); - } - - matrix.TransformPoints( pts ); - - coords = String.Format("{0:f0},{1:f0},{2:f0},{3:f0},", - pts[0].X, pts[0].Y, pts[1].X, pts[1].Y ); - for (int j = 2; j < count + 2; j++) - coords += String.Format(j > count ? "{0:f0},{1:f0}" : "{0:f0},{1:f0},", pts[j].X, pts[j].Y); - - return true; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PointD.cs b/SDK/ZedGraphs/ZedGraph/PointD.cs deleted file mode 100644 index 71715a2..0000000 --- a/SDK/ZedGraphs/ZedGraph/PointD.cs +++ /dev/null @@ -1,59 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Simple struct that stores X and Y coordinates as doubles. - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - [Serializable] - public struct PointD - { - /// - /// The X coordinate - /// - public double X; - /// - /// The Y coordinate - /// - public double Y; - - /// - /// Construct a object from two double values. - /// - /// The X coordinate - /// The Y coordinate - public PointD( double x, double y ) - { - X = x; - Y = y; - } - } -} - diff --git a/SDK/ZedGraphs/ZedGraph/PointPair.cs b/SDK/ZedGraphs/ZedGraph/PointPair.cs deleted file mode 100644 index 68f563e..0000000 --- a/SDK/ZedGraphs/ZedGraph/PointPair.cs +++ /dev/null @@ -1,562 +0,0 @@ -//============================================================================ -//PointPair Class -//Copyright 2004 Jerry Vos -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; -using System.Collections; -using IComparer = System.Collections.IComparer; - -#if ( !DOTNET1 ) // Is this a .Net 2 compilation? -using System.Collections.Generic; -#endif - - -namespace ZedGraph -{ - /// - /// A simple point represented by an (X,Y,Z) group of double values. - /// - /// - /// Jerry Vos modified by John Champion - /// $Revision: 3.26 $ $Date: 2007-11-28 02:38:22 $ - [Serializable] - public class PointPair : PointPairBase, ISerializable, ICloneable - { - #region Member variables - - /// - /// This PointPair's Z coordinate. Also used for the lower value (dependent axis) - /// for and charts. - /// - public double Z; - - /// - /// A tag object for use by the user. This can be used to store additional - /// information associated with the . ZedGraph never - /// modifies this value, but if it is a type, it - /// may be displayed in a - /// within the object. - /// - /// - /// Note that, if you are going to Serialize ZedGraph data, then any type - /// that you store in must be a serializable type (or - /// it will cause an exception). - /// - public object Tag; - - #endregion - - #region Constructors - - /// - /// Default Constructor - /// - public PointPair() : this( 0, 0, 0, null ) - { - } - - /// - /// Creates a point pair with the specified X and Y. - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - public PointPair( double x, double y ) - : this ( x, y, 0, null ) - { - } - - /// - /// Creates a point pair with the specified X, Y, and - /// label (). - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - /// This pair's string label () - public PointPair( double x, double y, string label ) - : this( x, y, 0, label as object ) - { - } - - /// - /// Creates a point pair with the specified X, Y, and base value. - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - /// This pair's z or lower dependent coordinate. - public PointPair( double x, double y, double z ) - : this( x, y, z, null ) - { - } - - /// - /// Creates a point pair with the specified X, Y, base value, and - /// string label (). - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - /// This pair's z or lower dependent coordinate. - /// This pair's string label () - public PointPair( double x, double y, double z, string label ) - : this( x, y, z, label as object ) - { - } - - /// - /// Creates a point pair with the specified X, Y, base value, and - /// (). - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - /// This pair's z or lower dependent coordinate. - /// This pair's property - public PointPair( double x, double y, double z, object tag ) - : base( x, y ) - { - this.Z = z; - this.Tag = tag; - } - - /// - /// Creates a point pair from the specified struct. - /// - /// The struct from which to get the - /// new values. - public PointPair( PointF pt ) : this( pt.X, pt.Y, 0, null ) - { - } - - /// - /// The PointPair copy constructor. - /// - /// The basis for the copy. - public PointPair( PointPair rhs ) : base( rhs ) - { - this.Z = rhs.Z; - - if ( rhs.Tag is ICloneable ) - this.Tag = ((ICloneable) rhs.Tag).Clone(); - else - this.Tag = rhs.Tag; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public PointPair Clone() - { - return new PointPair( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected PointPair( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - Z = info.GetDouble( "Z" ); - Tag = info.GetValue( "Tag", typeof(object) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "Z", Z ); - info.AddValue( "Tag", Tag ); - } - #endregion - - #region Properties - - /// - /// Readonly value that determines if either the X, Y, or Z - /// coordinate in this PointPair is an invalid (not plotable) value. - /// It is considered invalid if it is missing (equal to System.Double.Max), - /// Infinity, or NaN. - /// - /// true if any value is invalid - public bool IsInvalid3D - { - get { return this.X == PointPair.Missing || - this.Y == PointPair.Missing || - this.Z == PointPair.Missing || - Double.IsInfinity( this.X ) || - Double.IsInfinity( this.Y ) || - Double.IsInfinity( this.Z ) || - Double.IsNaN( this.X ) || - Double.IsNaN( this.Y ) || - Double.IsNaN( this.Z ); - } - } - - /// - /// The "low" value for this point (lower dependent-axis value). - /// This is really just an alias for . - /// - /// The lower dependent value for this . - public double LowValue - { - get { return this.Z; } - set { this.Z = value; } - } - - /// - /// The ColorValue property is just an alias for the - /// property. - /// - /// - /// For other types, such as the , the - /// can be mapped to a unique value. This is used with the - /// option. - /// - virtual public double ColorValue - { - get { return Z; } - set { Z = value; } - } - - #endregion - - #region Inner classes - - #if ( DOTNET1 ) // Is this a .Net 1.1 compilation? - - /// - /// Compares points based on their y values. Is setup to be used in an - /// ascending order sort. - /// - /// - public class PointPairComparerY : IComparer - { - - /// - /// Compares two s. - /// - /// Point to the left. - /// Point to the right. - /// -1, 0, or 1 depending on l.Y's relation to r.Y - public int Compare( object l, object r ) - { - PointPair pl = (PointPair) l; - PointPair pr = (PointPair) r; - - if (pl == null && pr == null) - { - return 0; - } - else if (pl == null && pr != null) - { - return -1; - } - else if (pl != null && pr == null) - { - return 1; - } - - double lY = pl.Y; - double rY = pr.Y; - - if (System.Math.Abs(lY - rY) < .000000001) - return 0; - - return lY < rY ? -1 : 1; - } - } - - /// - /// Compares points based on their x values. Is setup to be used in an - /// ascending order sort. - /// - /// - public class PointPairComparer : IComparer - { - private SortType sortType; - - /// - /// Constructor for PointPairComparer. - /// - /// The axis type on which to sort. - public PointPairComparer( SortType type ) - { - this.sortType = type; - } - - /// - /// Compares two s. - /// - /// Point to the left. - /// Point to the right. - /// -1, 0, or 1 depending on l.X's relation to r.X - public int Compare( object l, object r ) - { - PointPair pl = (PointPair) l; - PointPair pr = (PointPair) r; - - if ( pl == null && pr == null ) - return 0; - else if ( pl == null && pr != null ) - return -1; - else if ( pl != null && pr == null ) - return 1; - - double lVal, rVal; - - if ( sortType == SortType.XValues ) - { - lVal = pl.X; - rVal = pr.X; - } - else - { - lVal = pl.Y; - rVal = pr.Y; - } - - if ( lVal == PointPair.Missing || Double.IsInfinity( lVal ) || Double.IsNaN( lVal ) ) - pl = null; - if ( rVal == PointPair.Missing || Double.IsInfinity( rVal ) || Double.IsNaN( rVal ) ) - pr = null; - - if ( ( pl == null && pr == null ) || ( System.Math.Abs( lVal - rVal ) < 1e-10 ) ) - return 0; - else if ( pl == null && pr != null ) - return -1; - else if ( pl != null && pr == null ) - return 1; - else - return lVal < rVal ? -1 : 1; - } - } - - #else // Otherwise, it's .Net 2.0, so use generics - - /// - /// Compares points based on their y values. Is setup to be used in an - /// ascending order sort. - /// - /// - public class PointPairComparerY : IComparer - { - - /// - /// Compares two s. - /// - /// Point to the left. - /// Point to the right. - /// -1, 0, or 1 depending on l.Y's relation to r.Y - public int Compare( PointPair l, PointPair r ) - { - if ( l == null && r == null ) - { - return 0; - } - else if ( l == null && r != null ) - { - return -1; - } - else if ( l != null && r == null ) - { - return 1; - } - - double lY = l.Y; - double rY = r.Y; - - if ( System.Math.Abs( lY - rY ) < .000000001 ) - return 0; - - return lY < rY ? -1 : 1; - } - } - - /// - /// Compares points based on their x values. Is setup to be used in an - /// ascending order sort. - /// - /// - public class PointPairComparer : IComparer - { - private SortType sortType; - - /// - /// Constructor for PointPairComparer. - /// - /// The axis type on which to sort. - public PointPairComparer( SortType type ) - { - this.sortType = type; - } - - /// - /// Compares two s. - /// - /// Point to the left. - /// Point to the right. - /// -1, 0, or 1 depending on l.X's relation to r.X - public int Compare( PointPair l, PointPair r ) - { - if ( l == null && r == null ) - return 0; - else if ( l == null && r != null ) - return -1; - else if ( l != null && r == null ) - return 1; - - double lVal, rVal; - - if ( sortType == SortType.XValues ) - { - lVal = l.X; - rVal = r.X; - } - else - { - lVal = l.Y; - rVal = r.Y; - } - - if ( lVal == PointPair.Missing || Double.IsInfinity( lVal ) || Double.IsNaN( lVal ) ) - l = null; - if ( rVal == PointPair.Missing || Double.IsInfinity( rVal ) || Double.IsNaN( rVal ) ) - r = null; - - if ( ( l == null && r == null ) || ( System.Math.Abs( lVal - rVal ) < 1e-100 ) ) - return 0; - else if ( l == null && r != null ) - return -1; - else if ( l != null && r == null ) - return 1; - else - return lVal < rVal ? -1 : 1; - } - } - - #endif - - #endregion - - #region Methods - - /// - /// Compare two objects for equality. To be equal, X, Y, and Z - /// must be exactly the same between the two objects. - /// - /// The object to be compared with. - /// true if the objects are equal, false otherwise - public override bool Equals( object obj ) - { - PointPair rhs = obj as PointPair; - return this.X == rhs.X && this.Y == rhs.Y && this.Z == rhs.Z; - } - - /// - /// Return the HashCode from the base class. - /// - /// - public override int GetHashCode() - { - return base.GetHashCode(); - } - - /// - /// Format this PointPair value using the default format. Example: "( 12.345, -16.876 )". - /// The two double values are formatted with the "g" format type. - /// - /// true to show the third "Z" or low dependent value coordinate - /// A string representation of the PointPair - virtual public string ToString( bool isShowZ ) - { - return this.ToString( PointPair.DefaultFormat, isShowZ ); - } - - /// - /// Format this PointPair value using a general format string. - /// Example: a format string of "e2" would give "( 1.23e+001, -1.69e+001 )". - /// If - /// is true, then the third "Z" coordinate is also shown. - /// - /// A format string that will be used to format each of - /// the two double type values (see ). - /// A string representation of the PointPair - /// true to show the third "Z" or low dependent value coordinate - virtual public string ToString( string format, bool isShowZ ) - { - return "( " + this.X.ToString( format ) + - ", " + this.Y.ToString( format ) + - ( isShowZ ? ( ", " + this.Z.ToString( format ) ) : "" ) - + " )"; - } - - /// - /// Format this PointPair value using different general format strings for the X, Y, and Z values. - /// Example: a format string of "e2" would give "( 1.23e+001, -1.69e+001 )". - /// - /// A format string that will be used to format the X - /// double type value (see ). - /// A format string that will be used to format the Y - /// double type value (see ). - /// A format string that will be used to format the Z - /// double type value (see ). - /// A string representation of the PointPair - public string ToString( string formatX, string formatY, string formatZ ) - { - return "( " + this.X.ToString( formatX ) + - ", " + this.Y.ToString( formatY ) + - ", " + this.Z.ToString( formatZ ) + - " )"; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PointPair4.cs b/SDK/ZedGraphs/ZedGraph/PointPair4.cs deleted file mode 100644 index 374e818..0000000 --- a/SDK/ZedGraphs/ZedGraph/PointPair4.cs +++ /dev/null @@ -1,218 +0,0 @@ -//============================================================================ -//PointPair4 Class -//Copyright 2006 Jerry Vos & John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; -using IComparer = System.Collections.IComparer; - -namespace ZedGraph -{ - /// - /// The basic class holds three data values (X, Y, Z). This - /// class extends the basic PointPair to contain four data values (X, Y, Z, T). - /// - /// - /// John Champion - /// $Revision: 3.3 $ $Date: 2007-03-17 18:43:44 $ - [Serializable] - public class PointPair4 : PointPair, ISerializable - { - - #region Member variables - - /// - /// This PointPair4's T coordinate. - /// - public double T; - - #endregion - - #region Constructors - - /// - /// Default Constructor - /// - public PointPair4() : base() - { - this.T = 0; - } - - /// - /// Creates a point pair with the specified X, Y, Z, and T value. - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - /// This pair's z coordinate. - /// This pair's t coordinate. - public PointPair4( double x, double y, double z, double t ) : base( x, y, z ) - { - this.T = t; - } - - /// - /// Creates a point pair with the specified X, Y, base value, and - /// label (). - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - /// This pair's z coordinate. - /// This pair's t coordinate. - /// This pair's string label () - public PointPair4( double x, double y, double z, double t, string label ) : - base( x, y, z, label ) - { - this.T = t; - } - - /// - /// The PointPair4 copy constructor. - /// - /// The basis for the copy. - public PointPair4( PointPair4 rhs ) : base( rhs ) - { - this.T = rhs.T; - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected PointPair4( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema3" ); - - T = info.GetDouble( "T" ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema3 ); - info.AddValue( "T", T ); - } - - #endregion - - #region Properties - - /// - /// Readonly value that determines if either the X, Y, Z, or T - /// coordinate in this PointPair4 is an invalid (not plotable) value. - /// It is considered invalid if it is missing (equal to System.Double.Max), - /// Infinity, or NaN. - /// - /// true if any value is invalid - public bool IsInvalid4D - { - get - { - return this.X == PointPair.Missing || - this.Y == PointPair.Missing || - this.Z == PointPair.Missing || - this.T == PointPair.Missing || - Double.IsInfinity( this.X ) || - Double.IsInfinity( this.Y ) || - Double.IsInfinity( this.Z ) || - Double.IsInfinity( this.T ) || - Double.IsNaN( this.X ) || - Double.IsNaN( this.Y ) || - Double.IsNaN( this.Z ) || - Double.IsNaN( this.T ); - } - } - - #endregion - - #region Methods - - /// - /// Format this PointPair4 value using the default format. Example: "( 12.345, -16.876 )". - /// The two double values are formatted with the "g" format type. - /// - /// true to show the third "Z" and fourth "T" value coordinates - /// A string representation of the PointPair4 - public new string ToString( bool isShowZT ) - { - return this.ToString( PointPair.DefaultFormat, isShowZT ); - } - - /// - /// Format this PointPair value using a general format string. - /// Example: a format string of "e2" would give "( 1.23e+001, -1.69e+001 )". - /// If - /// is true, then the third "Z" coordinate is also shown. - /// - /// A format string that will be used to format each of - /// the two double type values (see ). - /// A string representation of the PointPair - /// true to show the third "Z" or low dependent value coordinate - public new string ToString( string format, bool isShowZT ) - { - return "( " + this.X.ToString( format ) + - ", " + this.Y.ToString( format ) + - ( isShowZT ? ( ", " + this.Z.ToString( format ) + - ", " + this.T.ToString( format ) ): "" ) + " )"; - } - - /// - /// Format this PointPair value using different general format strings for the X, Y, and Z values. - /// Example: a format string of "e2" would give "( 1.23e+001, -1.69e+001 )". - /// - /// A format string that will be used to format the X - /// double type value (see ). - /// A format string that will be used to format the Y - /// double type value (see ). - /// A format string that will be used to format the Z - /// double type value (see ). - /// A format string that will be used to format the T - /// double type value (see ). - /// A string representation of the PointPair - public string ToString( string formatX, string formatY, string formatZ, string formatT ) - { - return "( " + this.X.ToString( formatX ) + - ", " + this.Y.ToString( formatY ) + - ", " + this.Z.ToString( formatZ ) + - ", " + this.T.ToString( formatT ) + - " )"; - } - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PointPairBase.cs b/SDK/ZedGraphs/ZedGraph/PointPairBase.cs deleted file mode 100644 index 338b67e..0000000 --- a/SDK/ZedGraphs/ZedGraph/PointPairBase.cs +++ /dev/null @@ -1,281 +0,0 @@ -//============================================================================ -//PointPairBase Class -//Copyright 2006 Jerry Vos & John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; -using IComparer = System.Collections.IComparer; - -namespace ZedGraph -{ - /// - /// This is a base class that provides base-level functionality for a data point consisting - /// of an (X,Y) pair of double values. - /// - /// - /// This class is typically a base class for actual type implementations. - /// - /// - /// Jerry Vos modified by John Champion - /// $Revision: 1.4 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - public class PointPairBase : ISerializable - { - - #region Member variables - - /// - /// Missing values are represented internally using . - /// - public const double Missing = Double.MaxValue; - - /// - /// The default format to be used for displaying point values via the - /// method. - /// - public const string DefaultFormat = "G"; - - /// - /// This PointPair's X coordinate - /// - public double X; - - /// - /// This PointPair's Y coordinate - /// - public double Y; - - #endregion - - #region Constructors - - /// - /// Default Constructor - /// - public PointPairBase() - : this( 0, 0 ) - { - } - - /// - /// Creates a point pair with the specified X and Y. - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - public PointPairBase( double x, double y ) - { - this.X = x; - this.Y = y; - } - - /// - /// Creates a point pair from the specified struct. - /// - /// The struct from which to get the - /// new values. - public PointPairBase( PointF pt ) - : this( pt.X, pt.Y ) - { - } - - /// - /// The PointPairBase copy constructor. - /// - /// The basis for the copy. - public PointPairBase( PointPairBase rhs ) - { - this.X = rhs.X; - this.Y = rhs.Y; - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected PointPairBase( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - X = info.GetDouble( "X" ); - Y = info.GetDouble( "Y" ); - } - - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "X", X ); - info.AddValue( "Y", Y ); - } - - #endregion - - #region Properties - - /// - /// Readonly value that determines if either the X or the Y - /// coordinate in this PointPair is a missing value. - /// - /// true if either value is missing - public bool IsMissing - { - get { return this.X == PointPairBase.Missing || this.Y == PointPairBase.Missing; } - } - - /// - /// Readonly value that determines if either the X or the Y - /// coordinate in this PointPair is an invalid (not plotable) value. - /// It is considered invalid if it is missing (equal to System.Double.Max), - /// Infinity, or NaN. - /// - /// true if either value is invalid - public bool IsInvalid - { - get - { - return this.X == PointPairBase.Missing || - this.Y == PointPairBase.Missing || - Double.IsInfinity( this.X ) || - Double.IsInfinity( this.Y ) || - Double.IsNaN( this.X ) || - Double.IsNaN( this.Y ); - } - } - - /// - /// static method to determine if the specified point value is invalid. - /// - /// The value is considered invalid if it is , - /// , - /// or . - /// The value to be checked for validity. - /// true if the value is invalid, false otherwise - public static bool IsValueInvalid( double value ) - { - return ( value == PointPairBase.Missing || - Double.IsInfinity( value ) || - Double.IsNaN( value ) ); - } - - #endregion - - #region Operator Overloads - - /// - /// Implicit conversion from PointPair to PointF. Note that this conversion - /// can result in data loss, since the data are being cast from a type - /// double (64 bit) to a float (32 bit). - /// - /// The PointPair struct on which to operate - /// A PointF struct equivalent to the PointPair - public static implicit operator PointF( PointPairBase pair ) - { - return new PointF( (float)pair.X, (float)pair.Y ); - } - - #endregion - - #region Methods - - /// - /// Compare two objects for equality. To be equal, X and Y - /// must be exactly the same between the two objects. - /// - /// The object to be compared with. - /// true if the objects are equal, false otherwise - public override bool Equals( object obj ) - { - PointPairBase rhs = obj as PointPairBase; - return this.X == rhs.X && this.Y == rhs.Y; - } - - /// - /// Return the HashCode from the base class. - /// - /// - public override int GetHashCode() - { - return base.GetHashCode(); - } - - /// - /// Format this PointPair value using the default format. Example: "( 12.345, -16.876 )". - /// The two double values are formatted with the "g" format type. - /// - /// A string representation of the PointPair - public override string ToString() - { - return this.ToString( PointPairBase.DefaultFormat ); - } - - /// - /// Format this PointPair value using a general format string. - /// Example: a format string of "e2" would give "( 1.23e+001, -1.69e+001 )". - /// - /// A format string that will be used to format each of - /// the two double type values (see ). - /// A string representation of the PointPair - public string ToString( string format ) - { - return "( " + this.X.ToString( format ) + - ", " + this.Y.ToString( format ) + - " )"; - } - - /// - /// Format this PointPair value using different general format strings for the X and Y values. - /// Example: a format string of "e2" would give "( 1.23e+001, -1.69e+001 )". - /// The Z value is not displayed (see ). - /// - /// A format string that will be used to format the X - /// double type value (see ). - /// A format string that will be used to format the Y - /// double type value (see ). - /// A string representation of the PointPair - public string ToString( string formatX, string formatY ) - { - return "( " + this.X.ToString( formatX ) + - ", " + this.Y.ToString( formatY ) + - " )"; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PointPairCV.cs b/SDK/ZedGraphs/ZedGraph/PointPairCV.cs deleted file mode 100644 index 8bbe4d0..0000000 --- a/SDK/ZedGraphs/ZedGraph/PointPairCV.cs +++ /dev/null @@ -1,122 +0,0 @@ -//============================================================================ -//PointPairCV Class -//Copyright 2007 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#if ( !DOTNET1 ) // Is this a .Net 2 compilation? -using System.Collections.Generic; -#endif - -namespace ZedGraph -{ - /// - /// A simple instance that stores a data point (X, Y, Z). This differs from a regular - /// in that it maps the property - /// to an independent value. That is, and - /// are not related (as they are in the - /// ). - /// - public class PointPairCV : PointPair - { - - #region Properties - - /// - /// This is a user value that can be anything. It is used to provide special - /// property-based coloration to the graph elements. - /// - private double _colorValue; - - #endregion - - #region Constructors - - /// - /// Creates a point pair with the specified X, Y, and base value. - /// - /// This pair's x coordinate. - /// This pair's y coordinate. - /// This pair's z or lower dependent coordinate. - public PointPairCV( double x, double y, double z ) - : base( x, y, z, null ) - { - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected PointPairCV( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema3" ); - - ColorValue = info.GetDouble( "ColorValue" ); - } - - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema3", schema2 ); - info.AddValue( "ColorValue", ColorValue ); - } - - #endregion - - - #region Properties - - /// - /// The ColorValue property. This is used with the - /// option. - /// - override public double ColorValue - { - get { return _colorValue; } - set { _colorValue = value; } - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/PointPairList.cs b/SDK/ZedGraphs/ZedGraph/PointPairList.cs deleted file mode 100644 index 249dc41..0000000 --- a/SDK/ZedGraphs/ZedGraph/PointPairList.cs +++ /dev/null @@ -1,935 +0,0 @@ -//============================================================================ -//PointPairList Class -//Copyright 2004 Jerry Vos -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections.Generic; - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects - /// that define the set of points to be displayed on the curve. - /// - /// - /// - /// - /// Jerry Vos based on code by John Champion - /// modified by John Champion - /// $Revision: 3.37 $ $Date: 2007-06-29 15:39:07 $ - [Serializable] - public class PointPairList : List, IPointList, IPointListEdit - { - #region Fields - /// Private field to maintain the sort status of this - /// . Use the public property - /// to access this value. - /// - protected bool _sorted = true; - #endregion - - #region Properties -/* /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public PointPair this[ int index ] - { - get { return (PointPair) List[index]; } - set { List[index] = value; } - } -*/ - /// - /// true if the list is currently sorted. - /// - /// - public bool Sorted - { - get { return _sorted; } - } - #endregion - - #region Constructors - /// - /// Default constructor for the collection class - /// - public PointPairList() - { - _sorted = false; - } - - /// - /// Constructor to initialize the PointPairList from two arrays of - /// type double. - /// - public PointPairList( double[] x, double[] y ) - { - Add( x, y ); - - _sorted = false; - } - - /// - /// Constructor to initialize the PointPairList from an IPointList - /// - public PointPairList( IPointList list ) - { - int count = list.Count; - for ( int i = 0; i < count; i++ ) - Add( list[i] ); - - _sorted = false; - } - - /// - /// Constructor to initialize the PointPairList from three arrays of - /// type double. - /// - public PointPairList( double[] x, double[] y, double[] baseVal ) - { - Add( x, y, baseVal ); - - _sorted = false; - } - - /// - /// The Copy Constructor - /// - /// The PointPairList from which to copy - public PointPairList( PointPairList rhs ) - { - Add( rhs ); - - _sorted = false; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public PointPairList Clone() - { - return new PointPairList( this ); - } - - #endregion - - #region Methods - /// - /// Add a object to the collection at the end of the list. - /// - /// The object to - /// be added - /// The zero-based ordinal index where the point was added in the list. - public new void Add( PointPair point ) - { - _sorted = false; - //base.Add( new PointPair( point ) ); - base.Add( point.Clone() ); - } - - /// - /// Add a object to the collection at the end of the list. - /// - /// A reference to the object to - /// be added - /// The zero-based ordinal index where the last point was added in the list, - /// or -1 if no points were added. - public void Add( PointPairList pointList ) - { - foreach ( PointPair point in pointList ) - Add( point ); - - _sorted = false; - } - - /// - /// Add a set of points to the PointPairList from two arrays of type double. - /// If either array is null, then a set of ordinal values is automatically - /// generated in its place (see . - /// If the arrays are of different size, then the larger array prevails and the - /// smaller array is padded with values. - /// - /// A double[] array of X values - /// A double[] array of Y values - /// The zero-based ordinal index where the last point was added in the list, - /// or -1 if no points were added. - public void Add( double[] x, double[] y ) - { - int len = 0; - - if ( x != null ) - len = x.Length; - if ( y != null && y.Length > len ) - len = y.Length; - - for ( int i=0; i - /// Add a set of points to the from three arrays of type double. - /// If the X or Y array is null, then a set of ordinal values is automatically - /// generated in its place (see . If the - /// is null, then it is set to zero. - /// If the arrays are of different size, then the larger array prevails and the - /// smaller array is padded with values. - /// - /// A double[] array of X values - /// A double[] array of Y values - /// A double[] array of Z or lower-dependent axis values - /// The zero-based ordinal index where the last point was added in the list, - /// or -1 if no points were added. - public void Add( double[] x, double[] y, double[] z ) - { - int len = 0; - - if ( x != null ) - len = x.Length; - if ( y != null && y.Length > len ) - len = y.Length; - if ( z != null && z.Length > len ) - len = z.Length; - - for ( int i=0; i - /// Add a single point to the from values of type double. - /// - /// The X value - /// The Y value - /// The zero-based ordinal index where the point was added in the list. - public void Add( double x, double y ) - { - _sorted = false; - PointPair point = new PointPair( x, y ); - base.Add( point ); - } - - /// - /// Add a single point to the from values of type double. - /// - /// The X value - /// The Y value - /// The Tag value for the PointPair - /// The zero-based ordinal index where the point was added in the list. - public void Add( double x, double y, string tag ) - { - _sorted = false; - PointPair point = new PointPair( x, y, tag ); - base.Add( point ); - } - - /// - /// Add a single point to the from values of type double. - /// - /// The X value - /// The Y value - /// The Z or lower dependent axis value - /// The zero-based ordinal index where the point was added - /// in the list. - public void Add( double x, double y, double z ) - { - _sorted = false; - PointPair point = new PointPair( x, y, z ); - base.Add( point ); - } - - /// - /// Add a single point to the from values of type double. - /// - /// The X value - /// The Y value - /// The Z or lower dependent axis value - /// The Tag value for the PointPair - /// The zero-based ordinal index where the point was added - /// in the list. - public void Add( double x, double y, double z, string tag ) - { - _sorted = false; - PointPair point = new PointPair( x, y, z, tag ); - base.Add( point ); - } - - /// - /// Add a object to the collection at the specified, - /// zero-based, index location. - /// - /// - /// The zero-based ordinal index where the point is to be added in the list. - /// - /// - /// The object to be added. - /// - public new void Insert( int index, PointPair point ) - { - _sorted = false; - base.Insert( index, point ); - } - - /// - /// Add a single point (from values of type double ) to the at the specified, - /// zero-based, index location. - /// - /// - /// The zero-based ordinal index where the point is to be added in the list. - /// - /// The X value - /// The Y value - public void Insert( int index, double x, double y ) - { - _sorted = false; - base.Insert( index, new PointPair( x, y ) ); - } - - /// - /// Add a single point (from values of type double ) to the at the specified, - /// zero-based, index location. - /// - /// - /// The zero-based ordinal index where the point is to be added in the list. - /// - /// The X value - /// The Y value - /// The Z or lower dependent axis value - public void Insert( int index, double x, double y, double z ) - { - _sorted = false; - Insert( index, new PointPair( x, y, z ) ); - } - /* - /// - /// Remove the specified object from the collection based - /// the point values (must match exactly). - /// - /// - /// A that is to be removed by value. - /// - /// - public void Remove( PointPair pt ) - { - List.Remove( pt ); - } - - /// - /// Return the zero-based position index of the specified - /// in the collection. - /// - /// The object that is to be found. - /// - /// The zero-based index of the specified , or -1 if the - /// is not in the list - /// - public int IndexOf( PointPair pt ) - { - return List.IndexOf( pt ); - } - */ - /// - /// Return the zero-based position index of the - /// with the specified label . - /// - /// The object must be of type - /// for this method to find it. - /// The label that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the is not in the list - public int IndexOfTag( string label ) - { - int iPt = 0; - foreach ( PointPair p in this ) - { - if ( p.Tag is string && String.Compare( (string) p.Tag, label, true ) == 0 ) - return iPt; - iPt++; - } - - return -1; - } - - /// - /// Compare two objects to see if they are equal. - /// - /// Equality is based on equal count of items, and - /// each individual must be equal (as per the - /// method. - /// The to be compared with for equality. - /// true if the objects are equal, false otherwise. - public override bool Equals( object obj ) - { - PointPairList rhs = obj as PointPairList; - if( this.Count != rhs.Count ) - return false; - - for( int i=0; i - /// Return the HashCode from the base class. - /// - /// - public override int GetHashCode() - { - return base.GetHashCode (); - } - - /// - /// Sorts the list according to the point x values. Will not sort the - /// list if the list is already sorted. - /// - /// If the list was sorted before sort was called - public new bool Sort() - { - // if it is already sorted we don't have to sort again - if ( _sorted ) - return true; - - Sort( new PointPair.PointPairComparer( SortType.XValues ) ); - return false; - } - - /// - /// Sorts the list according to the point values . Will not sort the - /// list if the list is already sorted. - /// - /// The - ///used to determine whether the X or Y values will be used to sort - ///the list - /// If the list was sorted before sort was called - public bool Sort( SortType type) - { - // if it is already sorted we don't have to sort again - if ( _sorted ) - return true; - - this.Sort( new PointPair.PointPairComparer( type ) ); - - return false; - } - - /// - /// Set the X values for this from the specified - /// array of double values. - /// - /// - /// If has more values than - /// this list, then the extra values will be ignored. If - /// has less values, then the corresponding values - /// will not be changed. That is, if the has 20 values - /// and has 15 values, then the first 15 values of the - /// will be changed, and the last 5 values will not be - /// changed. - /// - /// An array of double values that will replace the existing X - /// values in the . - public void SetX( double[] x ) - { - for ( int i=0; i - /// Set the Y values for this from the specified - /// array of double values. - /// - /// - /// If has more values than - /// this list, then the extra values will be ignored. If - /// has less values, then the corresponding values - /// will not be changed. That is, if the has 20 values - /// and has 15 values, then the first 15 values of the - /// will be changed, and the last 5 values will not be - /// changed. - /// - /// An array of double values that will replace the existing Y - /// values in the . - public void SetY( double[] y ) - { - for ( int i=0; i - /// Set the Z values for this from the specified - /// array of double values. - /// - /// - /// If has more values than - /// this list, then the extra values will be ignored. If - /// has less values, then the corresponding values - /// will not be changed. That is, if the has 20 values - /// and has 15 values, then the first 15 values of the - /// will be changed, and the last 5 values will not be - /// changed. - /// - /// An array of double values that will replace the existing Z - /// values in the . - public void SetZ( double[] z ) - { - for ( int i=0; i - /// Add the Y values from the specified object to this - /// . If has more values than - /// this list, then the extra values will be ignored. If - /// has less values, the missing values are assumed to be zero. - /// - /// A reference to the object to - /// be summed into the this . - public void SumY( PointPairList sumList ) - { - for ( int i=0; i - /// Add the X values from the specified object to this - /// . If has more values than - /// this list, then the extra values will be ignored. If - /// has less values, the missing values are assumed to be zero. - /// - /// A reference to the object to - /// be summed into the this . - public void SumX( PointPairList sumList ) - { - for ( int i=0; i - /// Linearly interpolate the data to find an arbitraty Y value that corresponds to the specified X value. - /// - /// - /// This method uses linear interpolation with a binary search algorithm. It therefore - /// requires that the x data be monotonically increasing. Missing values are not allowed. This - /// method will extrapolate outside the range of the PointPairList if necessary. - /// - /// The target X value on which to interpolate - /// The Y value that corresponds to the value. - public double InterpolateX( double xTarget ) - { - int lo, mid, hi; - if ( this.Count < 2 ) - throw new Exception( "Error: Not enough points in curve to interpolate" ); - - if ( xTarget <= this[0].X ) - { - lo = 0; - hi = 1; - } - else if ( xTarget >= this[this.Count-1].X ) - { - lo = this.Count - 2; - hi = this.Count - 1; - } - else - { - // if x is within the bounds of the x table, then do a binary search - // in the x table to find table entries that bound the x value - lo = 0; - hi = this.Count - 1; - - // limit to 1000 loops to avoid an infinite loop problem - int j; - for ( j=0; j<1000 && hi > lo + 1; j++ ) - { - mid = ( hi + lo ) / 2; - if ( xTarget > this[mid].X ) - lo = mid; - else - hi = mid; - } - - if ( j >= 1000 ) - throw new Exception( "Error: Infinite loop in interpolation" ); - } - - return ( xTarget - this[lo].X ) / ( this[hi].X - this[lo].X ) * - ( this[hi].Y - this[lo].Y ) + this[lo].Y; - - } - - /// - /// Use Cardinal Splines to Interpolate the data to find an arbitraty Y value that corresponds to - /// the specified X value. - /// - /// - /// This method uses cardinal spline interpolation with a binary search algorithm. It therefore - /// requires that the x data be monotonically increasing. Missing values are not allowed. This - /// method will not extrapolate outside the range of the PointPairList (it returns - /// if extrapolation would be required). WARNING: Cardinal - /// spline interpolation can generate curves with non-unique X values for higher tension - /// settings. That is, there may be multiple X values for the same Y value. This routine - /// follows the path of the spline curve until it reaches the FIRST OCCURRENCE of the - /// target X value. It does not check to see if other solutions are possible. - /// - /// The target X value on which to interpolate - /// The tension setting that controls the curvature of the spline fit. - /// Typical values are between 0 and 1, where 0 is a linear fit, and 1 is lots of "roundness". - /// Values greater than 1 may give odd results. - /// - /// The Y value that corresponds to the value. - public double SplineInterpolateX( double xTarget, double tension ) - { - // Scale the tension value to be compatible with the GDI+ values - tension /= 3.0; - - int lo, mid, hi; - if ( this.Count < 2 ) - throw new Exception( "Error: Not enough points in curve to interpolate" ); - - // Extrapolation not allowed - if ( xTarget <= this[0].X || xTarget >= this[this.Count-1].X ) - return PointPair.Missing; - else - { - // if x is within the bounds of the x table, then do a binary search - // in the x table to find table entries that bound the x value - lo = 0; - hi = this.Count - 1; - - // limit to 1000 loops to avoid an infinite loop problem - int j; - for ( j=0; j<1000 && hi > lo + 1; j++ ) - { - mid = ( hi + lo ) / 2; - if ( xTarget > this[mid].X ) - lo = mid; - else - hi = mid; - } - - if ( j >= 1000 ) - throw new Exception( "Error: Infinite loop in interpolation" ); - } - - // At this point, we know the two bounding points around our point of interest - // We need the four points that surround our point - - double X0, X1, X2, X3; - double Y0, Y1, Y2, Y3; - double B0, B1, B2, B3; - - X1 = this[lo].X; - X2 = this[hi].X; - Y1 = this[lo].Y; - Y2 = this[hi].Y; - - // if we are at either the beginning of the table or the end, then make up a before - // and/or after point to fill in the four points - if ( lo == 0 ) - { - X0 = X1 - ( X2 - X1 )/3; - Y0 = Y1 - ( Y2 - Y1 )/3; - } - else - { - X0 = this[lo-1].X; - Y0 = this[lo-1].Y; - } - - if ( hi == this.Count - 1 ) - { - X3 = X2 + ( X2 - X1 )/3; - Y3 = Y2 + ( Y2 - Y1 )/3; - } - else - { - X3 = this[hi+1].X; - Y3 = this[hi+1].Y; - } - - double newX, newY, - lastX = X1, - lastY = Y1; - - // Do 100 steps to find the result - for ( double t=0.01; t<=1; t+=0.01 ) - { - B0 = (1 - t) * (1 - t) * (1 - t); - B1 = 3.0 * t * (1 - t) * (1 - t); - B2 = 3.0 * t * t * (1 - t); - B3 = t * t * t; - - newX = X1 * B0 + (X1 + (X2 - X0) * tension) * B1 + - (X2 - (X3 - X1) * tension) * B2 + X2 * B3; - newY = Y1 * B0 + (Y1 + (Y2 - Y0) * tension) * B1 + - (Y2 - (Y3 - Y1) * tension) * B2 + Y2 * B3; - - // We are looking for the first X that exceeds the target - if ( newX >= xTarget ) - { - // We now have two bounding X values around our target - // use linear interpolation to minimize the discretization - // error. - return ( xTarget - lastX ) / ( newX - lastX ) * - ( newY - lastY ) + lastY; - } - - lastX = newX; - lastY = newY; - } - - // This should never happen - return Y2; - } - - /// - /// Linearly interpolate the data to find an arbitraty X value that corresponds to the specified Y value. - /// - /// - /// This method uses linear interpolation with a binary search algorithm. It therefore - /// requires that the Y data be monotonically increasing. Missing values are not allowed. This - /// method will extrapolate outside the range of the PointPairList if necessary. - /// - /// The target Y value on which to interpolate - /// The X value that corresponds to the value. - public double InterpolateY( double yTarget ) - { - int lo, mid, hi; - if ( this.Count < 2 ) - throw new Exception( "Error: Not enough points in curve to interpolate" ); - - if ( yTarget <= this[0].Y ) - { - lo = 0; - hi = 1; - } - else if ( yTarget >= this[this.Count-1].Y ) - { - lo = this.Count - 2; - hi = this.Count - 1; - } - else - { - // if y is within the bounds of the y table, then do a binary search - // in the y table to find table entries that bound the y value - lo = 0; - hi = this.Count - 1; - - // limit to 1000 loops to avoid an infinite loop problem - int j; - for ( j=0; j<1000 && hi > lo + 1; j++ ) - { - mid = ( hi + lo ) / 2; - if ( yTarget > this[mid].Y ) - lo = mid; - else - hi = mid; - } - - if ( j >= 1000 ) - throw new Exception( "Error: Infinite loop in interpolation" ); - } - - return ( yTarget - this[lo].Y ) / ( this[hi].Y - this[lo].Y ) * - ( this[hi].X - this[lo].X ) + this[lo].X; - - } - - /// - /// Use linear regression to form a least squares fit of an existing - /// instance. - /// - /// The output will cover the - /// same X range of data as the original dataset. - /// - /// An instance containing - /// the data to be regressed. - /// The number of desired points to be included - /// in the resultant . - /// - /// A new containing the resultant - /// data fit. - /// - public PointPairList LinearRegression( IPointList points, int pointCount ) - { - double minX = double.MaxValue; - double maxX = double.MinValue; - - for ( int i=0; i maxX ? pt.X : maxX; - } - } - - return LinearRegression( points, pointCount, minX, maxX ); - } - - - /// - /// Use linear regression to form a least squares fit of an existing - /// instance. - /// - /// An instance containing - /// the data to be regressed. - /// The number of desired points to be included - /// in the resultant . - /// - /// The minimum X value of the resultant - /// . - /// The maximum X value of the resultant - /// . - /// A new containing the resultant - /// data fit. - /// - /// Brian Chappell - lazarusds - /// modified by John Champion - public PointPairList LinearRegression( IPointList points, int pointCount, - double minX, double maxX ) - { - double x = 0, y = 0, xx = 0, xy = 0, count = 0; - for ( int i = 0; i < points.Count; i++ ) - { - PointPair pt = points[i]; - if ( !pt.IsInvalid ) - { - x += points[i].X; - y += points[i].Y; - xx += points[i].X * points[i].X; - xy += points[i].X * points[i].Y; - count++; - } - } - - if ( count < 2 || maxX - minX < 1e-20 ) - return null; - - double slope = ( count * xy - x * y ) / ( count * xx - x * x ); - double intercept = ( y - slope * x ) / count; - - PointPairList newPoints = new PointPairList(); - double stepSize = ( maxX - minX ) / pointCount; - double value = minX; - for ( int i = 0; i < pointCount; i++ ) - { - newPoints.Add( new PointPair( value, value * slope + intercept ) ); - value += stepSize; - } - - return newPoints; - } - - - #endregion - } -} - - diff --git a/SDK/ZedGraphs/ZedGraph/PolyObj.cs b/SDK/ZedGraphs/ZedGraph/PolyObj.cs deleted file mode 100644 index 9b329b4..0000000 --- a/SDK/ZedGraphs/ZedGraph/PolyObj.cs +++ /dev/null @@ -1,336 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that represents a bordered and/or filled polygon object on - /// the graph. A list of objects is maintained by - /// the collection class. - /// - /// - /// John Champion - /// $Revision: 3.4 $ $Date: 2007-01-25 07:56:09 $ - [Serializable] - public class PolyObj : BoxObj, ICloneable, ISerializable - { - - #region Fields - - private PointD[] _points; - - /// - /// private value that determines if the polygon will be automatically closed. - /// true to close the figure, false to leave it "open." Use the public property - /// to access this value. - /// - private bool _isClosedFigure = true; - - #endregion - - #region Properties - - /// - /// Gets or sets the array that defines - /// the polygon. This will be in units determined by - /// . - /// - public PointD[] Points - { - get { return _points; } - set { _points = value; } - } - - /// - /// Gets or sets a value that determines if the polygon will be automatically closed. - /// true to close the figure, false to leave it "open." - /// - /// - /// This boolean determines whether or not the CloseFigure() method will be called - /// to fully close the path of the polygon. This value defaults to true, and for any - /// closed figure it should fine. If you want to draw a line that does not close into - /// a shape, then you should set this value to false. For a figure that is naturally - /// closed (e.g., the first point of the polygon is the same as the last point), - /// leaving this value set to false may result in minor pixel artifacts due to - /// rounding. - /// - public bool IsClosedFigure - { - get { return _isClosedFigure; } - set { _isClosedFigure = value; } - } - - #endregion - - #region Constructors - /// Constructors for the object - /// - /// A constructor that allows the position, border color, and solid fill color - /// of the to be pre-specified. - /// - /// An arbitrary specification - /// for the box border - /// An arbitrary specification - /// for the box fill (will be a solid color fill) - /// The array that defines - /// the polygon. This will be in units determined by - /// . - /// - public PolyObj( PointD[] points, Color borderColor, Color fillColor ) : - base( 0, 0, 1, 1, borderColor, fillColor ) - { - _points = points; - } - - /// - /// A constructor that allows the position - /// of the to be pre-specified. Other properties are defaulted. - /// - /// The array that defines - /// the polygon. This will be in units determined by - /// . - /// - public PolyObj( PointD[] points ) : base( 0, 0, 1, 1 ) - { - _points = points; - } - - /// - /// A default constructor that creates a from an empty - /// array. Other properties are defaulted. - /// - public PolyObj() : this( new PointD[0] ) - { - } - - /// - /// A constructor that allows the position, border color, and two-color - /// gradient fill colors - /// of the to be pre-specified. - /// - /// An arbitrary specification - /// for the box border - /// An arbitrary specification - /// for the start of the box gradient fill - /// An arbitrary specification - /// for the end of the box gradient fill - /// The array that defines - /// the polygon. This will be in units determined by - /// . - /// - public PolyObj( PointD[] points, Color borderColor, - Color fillColor1, Color fillColor2 ) : - base( 0, 0, 1, 1, borderColor, fillColor1, fillColor2 ) - { - _points = points; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public PolyObj( PolyObj rhs ) : base( rhs ) - { - rhs._points = (PointD[]) _points.Clone(); - rhs._isClosedFigure = _isClosedFigure; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new PolyObj Clone() - { - return new PolyObj( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected PolyObj( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema3" ); - - _points = (PointD[]) info.GetValue( "points", typeof(PointD[]) ); - - if ( schema3 >= 11 ) - _isClosedFigure = info.GetBoolean( "isClosedFigure" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema3", schema3 ); - - info.AddValue( "points", _points ); - info.AddValue( "isClosedFigure", _isClosedFigure ); - } - #endregion - - #region Rendering Methods - /// - /// Render this object to the specified device. - /// - /// - /// This method is normally only called by the Draw method - /// of the parent collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) - { - if ( _points != null && _points.Length > 1 ) - { - using ( GraphicsPath path = MakePath( pane ) ) - { - // Fill or draw the symbol as required - if ( _fill.IsVisible ) - { - using ( Brush brush = this.Fill.MakeBrush( path.GetBounds() ) ) - g.FillPath( brush, path ); - } - - if ( _border.IsVisible ) - { - using ( Pen pen = _border.GetPen( pane, scaleFactor ) ) - g.DrawPath( pen, path ); - } - } - } - } - - internal GraphicsPath MakePath( PaneBase pane ) - { - GraphicsPath path = new GraphicsPath(); - bool first = true; - PointF lastPt = new PointF(); - - foreach( PointD pt in _points ) - { - // Convert the coordinates from the user coordinate system - // to the screen coordinate system - // Offset the points by the location value - PointF pixPt = Location.Transform( pane, pt.X + _location.X, pt.Y + _location.Y, - _location.CoordinateFrame ); - - if ( Math.Abs( pixPt.X ) < 100000 && - Math.Abs( pixPt.Y ) < 100000 ) - { - if ( first ) - first = false; - else - path.AddLine( lastPt, pixPt ); - - lastPt = pixPt; - } - } - - if ( _isClosedFigure ) - path.CloseFigure(); - - return path; - } - - /// - /// Determine if the specified screen point lies inside the bounding box of this - /// . - /// - /// The screen point, in pixels - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// true if the point lies in the bounding box, false otherwise - override public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) - { - if ( _points != null && _points.Length > 1 ) - { - if ( ! base.PointInBox(pt, pane, g, scaleFactor ) ) - return false; - - using ( GraphicsPath path = MakePath( pane ) ) - return path.IsVisible( pt ); - } - else - return false; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/RadarPointList.cs b/SDK/ZedGraphs/ZedGraph/RadarPointList.cs deleted file mode 100644 index c379a5c..0000000 --- a/SDK/ZedGraphs/ZedGraph/RadarPointList.cs +++ /dev/null @@ -1,216 +0,0 @@ -//============================================================================ -//RadarPointList Class -//Copyright 2006 John Champion, Jerry Vos -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections.Generic; - -namespace ZedGraph -{ - /// - /// A class containing a set of data values to be plotted as a RadarPlot. - /// This class will effectively convert the data into objects - /// by converting the polar coordinates to rectangular coordinates - /// - /// - /// - /// - /// - /// Jerry Vos and John Champion - /// $Revision: 3.5 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - public class RadarPointList : List, IPointList, IPointListEdit - { - - #region Fields - /// - /// Default to clockwise rotation as this is the standard for radar charts - /// - private bool _clockwise = true; - - /// - /// Default to 90 degree rotation so main axis is in the 12 o'clock position, - /// which is the standard for radar charts. - /// - private double _rotation = 90; - #endregion - - #region Properties - - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. This method does the calculations - /// to convert the data from polar to rectangular coordinates. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public new PointPair this[int index] - { - get - { - int count = this.Count; - // The last point is a repeat of the first point - if ( index == count - 1 ) - index = 0; - - if ( index < 0 || index >= count ) - return null; - - PointPair pt = (PointPair)base[index]; -// double theta = (double) index / (double) count * 2.0 * Math.PI; - double rotationRadians = _rotation * Math.PI / 180; - double theta = rotationRadians + ( _clockwise ? -1.0d : 1.0d ) * - ( (double) index / (double) (count-1) * 2.0 * Math.PI); - double x = pt.Y * Math.Cos( theta ); - double y = pt.Y * Math.Sin( theta ); - return new PointPair( x, y, pt.Z, (string) pt.Tag ); - } - set - { - int count = this.Count; - // The last point is a repeat of the first point - if ( index == count - 1 ) - index = 0; - - if ( index < 0 || index >= count ) - return; - - PointPair pt = (PointPair)base[index]; - pt.Y = Math.Sqrt( value.X * value.X + value.Y * value.Y ); - } - } - - /// - /// Indicates if points should be added in clockwise or counter-clockwise order - /// - public bool Clockwise - { - get { return _clockwise; } - set { _clockwise = value; } - } - - /// - /// Sets the angular rotation (starting angle) for the initial axis - /// - public double Rotation - { - get { return _rotation; } - set { _rotation = value; } - } - - /// - /// Get the raw data - /// - /// - /// - private PointPair GetAt( int index ) - { - return base[index]; - } - - /// - /// gets the number of points available in the list - /// - public new int Count - { - get { return base.Count + 1; } - } - - #endregion - - #region Constructors - /// - /// Default Constructor - /// - public RadarPointList() : base() - { - } - - /// - /// Copy Constructor - /// - public RadarPointList( RadarPointList rhs ) - { - for ( int i = 0; i < rhs.Count; i++ ) - this.Add( rhs.GetAt(i) ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public RadarPointList Clone() - { - return new RadarPointList( this ); - } - - - #endregion - - #region Methods -/* - * /// - /// Add the specified PointPair to the collection. - /// - /// The PointPair to be added - /// The ordinal position in the list where the point was added - public int Add( PointPair pt ) - { - return List.Add( pt ); - } - - /// - /// Add a single point to the from a value of type double. - /// - /// The radial coordinate value - /// The zero-based ordinal index where the point was added in the list. - /// - public int Add( double r ) - { - return List.Add( new PointPair( PointPair.Missing, r ) ); - } -*/ - /// - /// Add a single point to the from two values of type double. - /// - /// The radial coordinate value - /// The 'Z' coordinate value, which is not normally used for plotting, - /// but can be used for type fills - /// The zero-based ordinal index where the point was added in the list. - public void Add( double r, double z ) - { - Add( new PointPair( PointPair.Missing, r, z ) ); - } - - #endregion - } -} - - diff --git a/SDK/ZedGraphs/ZedGraph/RollingPointPairList.cs b/SDK/ZedGraphs/ZedGraph/RollingPointPairList.cs deleted file mode 100644 index 931e786..0000000 --- a/SDK/ZedGraphs/ZedGraph/RollingPointPairList.cs +++ /dev/null @@ -1,655 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2006 John Champion -//RollingPointPairList class Copyright 2006 by Colin Green -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= -using System; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that provides a rolling list of objects. - /// This is essentially a - /// first-in-first-out (FIFO) queue with a fixed capacity which allows 'rolling' - /// (or oscilloscope like) graphs to be be animated without having the overhead of an - /// ever-growing ArrayList. - /// - /// The queue is constructed with a fixed capacity and new points can be enqueued. When the - /// capacity is reached the oldest (first in) PointPair is overwritten. However, when - /// accessing via , the objects are - /// seen in the order in which they were enqeued. - /// - /// RollingPointPairList supports data editing through the - /// interface. - /// - /// Colin Green with mods by John Champion - /// $Date: 2007-11-05 04:33:26 $ - /// - [Serializable] - public class RollingPointPairList : IPointList, ISerializable, IPointListEdit - { - - #region Fields - - /// - /// An array of PointPair objects that acts as the underlying buffer. - /// - protected PointPair[] _mBuffer; - - /// - /// The index of the previously enqueued item. -1 if buffer is empty. - /// - protected int _headIdx; - - /// - /// The index of the next item to be dequeued. -1 if buffer is empty. - /// - protected int _tailIdx; - - #endregion - - #region Constructors - - /// - /// Constructs an empty buffer with the specified capacity. - /// - /// Number of elements in the rolling list. This number - /// cannot be changed once the RollingPointPairList is constructed. - public RollingPointPairList( int capacity ) - : this( capacity, false ) - { - _mBuffer = new PointPair[capacity]; - _headIdx = _tailIdx = -1; - } - - /// - /// Constructs an empty buffer with the specified capacity. Pre-allocates space - /// for all PointPair's in the list if is true. - /// - /// Number of elements in the rolling list. This number - /// cannot be changed once the RollingPointPairList is constructed. - /// true to pre-allocate all PointPair instances in - /// the list, false otherwise. Note that in order to be memory efficient, - /// the method should be used to add - /// data. Avoid the method. - /// - /// - public RollingPointPairList( int capacity, bool preLoad ) - { - _mBuffer = new PointPair[capacity]; - _headIdx = _tailIdx = -1; - - if ( preLoad ) - for ( int i = 0; i < capacity; i++ ) - _mBuffer[i] = new PointPair(); - } - - /// - /// Constructs a buffer with a copy of the items within the provided - /// . - /// The is set to the length of the provided list. - /// - /// The to be copied. - public RollingPointPairList( IPointList rhs ) - { - _mBuffer = new PointPair[rhs.Count]; - - for ( int i = 0; i < rhs.Count; i++ ) - { - _mBuffer[i] = new PointPair( rhs[i] ); - } - - _headIdx = rhs.Count - 1; - _tailIdx = 0; - } - - #endregion - - #region Properties - - /// - /// Gets the capacity of the rolling buffer. - /// - public int Capacity - { - get { return _mBuffer.Length; } - } - - /// - /// Gets the count of items within the rolling buffer. Note that this may be less than - /// the capacity. - /// - public int Count - { - get - { - if ( _headIdx == -1 ) - return 0; - - if ( _headIdx > _tailIdx ) - return ( _headIdx - _tailIdx ) + 1; - - if ( _tailIdx > _headIdx ) - return ( _mBuffer.Length - _tailIdx ) + _headIdx + 1; - - return 1; - } - } - - /// - /// Gets a bolean that indicates if the buffer is empty. - /// Alternatively you can test Count==0. - /// - public bool IsEmpty - { - get { return _headIdx == -1; } - } - - /// - /// Gets or sets the at the specified index in the buffer. - /// - /// - /// Index must be within the current size of the buffer, e.g., the set - /// method will not expand the buffer even if is available - /// - public PointPair this[int index] - { - get - { - if ( index >= Count || index < 0 ) - throw new ArgumentOutOfRangeException(); - - index += _tailIdx; - if ( index >= _mBuffer.Length ) - index -= _mBuffer.Length; - - return _mBuffer[index]; - } - set - { - if ( index >= Count || index < 0 ) - throw new ArgumentOutOfRangeException(); - - index += _tailIdx; - if ( index >= _mBuffer.Length ) - index -= _mBuffer.Length; - - _mBuffer[index] = value; - } - - } - - #endregion - - #region Public Methods - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public RollingPointPairList Clone() - { - return new RollingPointPairList( this ); - } - - /// - /// Clear the buffer of all objects. - /// Note that the remains unchanged. - /// - public void Clear() - { - _headIdx = _tailIdx = -1; - } - - /// - /// Calculate that the next index in the buffer that should receive a new data point. - /// Note that this method actually advances the buffer, so a datapoint should be - /// added at _mBuffer[_headIdx]. - /// - /// The index position of the new head element - private int GetNextIndex() - { - if ( _headIdx == -1 ) - { // buffer is currently empty. - _headIdx = _tailIdx = 0; - } - else - { - // Determine the index to write to. - if ( ++_headIdx == _mBuffer.Length ) - { // Wrap around. - _headIdx = 0; - } - - if ( _headIdx == _tailIdx ) - { // Buffer overflow. Increment tailIdx. - if ( ++_tailIdx == _mBuffer.Length ) - { // Wrap around. - _tailIdx = 0; - } - } - } - - return _headIdx; - } - - /// - /// Add a onto the head of the queue, - /// overwriting old values if the buffer is full. - /// - /// The to be added. - public void Add( PointPair item ) - { - _mBuffer[ GetNextIndex() ] = item; - } - - /// - /// Add an object to the head of the queue. - /// - /// A reference to the object to - /// be added - public void Add( IPointList pointList ) - { // A slightly more efficient approach would be to determine where the new points should placed within - // the buffer and to then copy them in directly - updating the head and tail indexes appropriately. - for ( int i = 0; i < pointList.Count; i++ ) - Add( pointList[i] ); - } - - /// - /// Remove an old item from the tail of the queue. - /// - /// The removed item. Throws an - /// if the buffer was empty. - /// Check the buffer's length () or the - /// property to avoid exceptions. - public PointPair Remove() - { - if ( _tailIdx == -1 ) - { // buffer is currently empty. - throw new InvalidOperationException( "buffer is empty." ); - } - - PointPair o = _mBuffer[_tailIdx]; - - if ( _tailIdx == _headIdx ) - { // The buffer is now empty. - _headIdx = _tailIdx = -1; - return o; - } - - if ( ++_tailIdx == _mBuffer.Length ) - { // Wrap around. - _tailIdx = 0; - } - - return o; - } - - /// - /// Remove the at the specified index - /// - /// - /// All items in the queue that lie after will - /// be shifted back by one, and the queue will be one item shorter. - /// - /// The ordinal position of the item to be removed. - /// Throws an if index is less than - /// zero or greater than or equal to - /// - public void RemoveAt( int index ) - { - int count = this.Count; - - if ( index >= count || index < 0 ) - throw new ArgumentOutOfRangeException(); - - // shift all the items that lie after index back by 1 - for ( int i = index + _tailIdx; i < _tailIdx + count - 1; i++ ) - { - i = ( i >= _mBuffer.Length ) ? 0 : i; - int j = i + 1; - j = ( j >= _mBuffer.Length ) ? 0 : j; - _mBuffer[i] = _mBuffer[j]; - } - - // Remove the item from the head (it's been duplicated already) - Pop(); - } - - /// - /// Remove a range of objects starting at the specified index - /// - /// - /// All items in the queue that lie after will - /// be shifted back, and the queue will be items shorter. - /// - /// The ordinal position of the item to be removed. - /// Throws an if index is less than - /// zero or greater than or equal to - /// - /// The number of items to be removed. Throws an - /// if is less than zero - /// or greater than the total available items in the queue - public void RemoveRange( int index, int count ) - { - int totalCount = this.Count; - - if ( index >= totalCount || index < 0 || count < 0 || count > totalCount ) - throw new ArgumentOutOfRangeException(); - - for ( int i = 0; i < count; i++ ) - this.RemoveAt( index ); - } - - /// - /// Pop an item off the head of the queue. - /// - /// The popped item. Throws an exception if the buffer was empty. - public PointPair Pop() - { - if ( _tailIdx == -1 ) - { // buffer is currently empty. - throw new InvalidOperationException( "buffer is empty." ); - } - - PointPair o = _mBuffer[_headIdx]; - - if ( _tailIdx == _headIdx ) - { // The buffer is now empty. - _headIdx = _tailIdx = -1; - return o; - } - - if ( --_headIdx == -1 ) - { // Wrap around. - _headIdx = _mBuffer.Length - 1; - } - - return o; - } - - /// - /// Peek at the item at the head of the queue. - /// - /// The item at the head of the queue. - /// Throws an if the buffer was empty. - /// - public PointPair Peek() - { - if ( _headIdx == -1 ) - { // buffer is currently empty. - throw new InvalidOperationException( "buffer is empty." ); - } - - return _mBuffer[_headIdx]; - } - - #endregion - - #region Auxilliary Methods - - /// - /// Add a set of values onto the head of the queue, - /// overwriting old values if the buffer is full. - /// - /// - /// This method is much more efficient that the Add(PointPair) - /// method, since it does not require that a new PointPair instance be provided. - /// If the buffer already contains a at the head position, - /// then the x, y, z, and tag values will be copied into the existing PointPair. - /// Otherwise, a new PointPair instance must be created. - /// In this way, each PointPair position in the rolling list will only be allocated one time. - /// To truly be memory efficient, the , , - /// and methods should be avoided. Also, the property - /// for this method should be null, since it is a reference type. - /// - /// The X value - /// The Y value - /// The Z value - /// The Tag value for the PointPair - public void Add( double x, double y, double z, object tag ) - { - // advance the rolling list - GetNextIndex(); - - if ( _mBuffer[_headIdx] == null ) - _mBuffer[_headIdx] = new PointPair( x, y, z, tag ); - else - { - _mBuffer[_headIdx].X = x; - _mBuffer[_headIdx].Y = y; - _mBuffer[_headIdx].Z = z; - _mBuffer[_headIdx].Tag = tag; - } - } - - /// - /// Add a set of values onto the head of the queue, - /// overwriting old values if the buffer is full. - /// - /// - /// This method is much more efficient that the Add(PointPair) - /// method, since it does not require that a new PointPair instance be provided. - /// If the buffer already contains a at the head position, - /// then the x, y, z, and tag values will be copied into the existing PointPair. - /// Otherwise, a new PointPair instance must be created. - /// In this way, each PointPair position in the rolling list will only be allocated one time. - /// To truly be memory efficient, the , , - /// and methods should be avoided. - /// - /// The X value - /// The Y value - public void Add( double x, double y ) - { - Add( x, y, PointPair.Missing, null ); - } - - /// - /// Add a set of values onto the head of the queue, - /// overwriting old values if the buffer is full. - /// - /// - /// This method is much more efficient that the Add(PointPair) - /// method, since it does not require that a new PointPair instance be provided. - /// If the buffer already contains a at the head position, - /// then the x, y, z, and tag values will be copied into the existing PointPair. - /// Otherwise, a new PointPair instance must be created. - /// In this way, each PointPair position in the rolling list will only be allocated one time. - /// To truly be memory efficient, the , , - /// and methods should be avoided. Also, the property - /// for this method should be null, since it is a reference type. - /// - /// The X value - /// The Y value - /// The Tag value for the PointPair - public void Add( double x, double y, object tag ) - { - Add( x, y, PointPair.Missing, tag ); - } - - /// - /// Add a set of values onto the head of the queue, - /// overwriting old values if the buffer is full. - /// - /// - /// This method is much more efficient that the Add(PointPair) - /// method, since it does not require that a new PointPair instance be provided. - /// If the buffer already contains a at the head position, - /// then the x, y, z, and tag values will be copied into the existing PointPair. - /// Otherwise, a new PointPair instance must be created. - /// In this way, each PointPair position in the rolling list will only be allocated one time. - /// To truly be memory efficient, the , , - /// and methods should be avoided. - /// - /// The X value - /// The Y value - /// The Z value - public void Add( double x, double y, double z ) - { - Add( x, y, z, null ); - } - - /// - /// Add a set of points to the - /// from two arrays of type double. - /// If either array is null, then a set of ordinal values is automatically - /// generated in its place (see ). - /// If the arrays are of different size, then the larger array prevails and the - /// smaller array is padded with values. - /// - /// A double[] array of X values - /// A double[] array of Y values - public void Add( double[] x, double[] y ) - { - int len = 0; - - if ( x != null ) - len = x.Length; - if ( y != null && y.Length > len ) - len = y.Length; - - for ( int i = 0; i < len; i++ ) - { - PointPair point = new PointPair( 0, 0, 0 ); - if ( x == null ) - point.X = (double)i + 1.0; - else if ( i < x.Length ) - point.X = x[i]; - else - point.X = PointPair.Missing; - - if ( y == null ) - point.Y = (double)i + 1.0; - else if ( i < y.Length ) - point.Y = y[i]; - else - point.Y = PointPair.Missing; - - Add( point ); - } - } - - /// - /// Add a set of points to the from - /// three arrays of type double. - /// If the X or Y array is null, then a set of ordinal values is automatically - /// generated in its place (see . - /// If the value - /// is null, then it is set to zero. - /// If the arrays are of different size, then the larger array prevails and the - /// smaller array is padded with values. - /// - /// A double[] array of X values - /// A double[] array of Y values - /// A double[] array of Z values - public void Add( double[] x, double[] y, double[] z ) - { - int len = 0; - - if ( x != null ) - len = x.Length; - if ( y != null && y.Length > len ) - len = y.Length; - if ( z != null && z.Length > len ) - len = z.Length; - - for ( int i = 0; i < len; i++ ) - { - PointPair point = new PointPair(); - - if ( x == null ) - point.X = (double)i + 1.0; - else if ( i < x.Length ) - point.X = x[i]; - else - point.X = PointPair.Missing; - - if ( y == null ) - point.Y = (double)i + 1.0; - else if ( i < y.Length ) - point.Y = y[i]; - else - point.Y = PointPair.Missing; - - if ( z == null ) - point.Z = (double)i + 1.0; - else if ( i < z.Length ) - point.Z = z[i]; - else - point.Z = PointPair.Missing; - - Add( point ); - } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected RollingPointPairList( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _headIdx = info.GetInt32( "headIdx" ); - _tailIdx = info.GetInt32( "tailIdx" ); - _mBuffer = (PointPair[])info.GetValue( "mBuffer", typeof( PointPair[] ) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "headIdx", _headIdx ); - info.AddValue( "tailIdx", _tailIdx ); - info.AddValue( "mBuffer", _mBuffer ); - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/SampleMultiPointList.cs b/SDK/ZedGraphs/ZedGraph/SampleMultiPointList.cs deleted file mode 100644 index dae77ad..0000000 --- a/SDK/ZedGraphs/ZedGraph/SampleMultiPointList.cs +++ /dev/null @@ -1,284 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Charting Library for .Net -//Copyright 2005 John Champion and Jerry Vos -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; - -namespace ZedGraph -{ - /// - /// An enum used to specify the X or Y data type of interest -- see - /// and . - /// - public enum PerfDataType - { - /// - /// The time (seconds) at which these data are measured - /// - Time, - /// - /// The distance traveled, meters - /// - Distance, - /// - /// The instantaneous velocity, meters per second - /// - Velocity, - /// - /// The instantaneous acceleration, meters per second squared - /// - Acceleration - }; - - /// - /// Sample data structure containing a variety of data values, in this case the values - /// are related in that they correspond to the same time value. - /// - public class PerformanceData - { - /// - /// The time (seconds) at which these data are measured - /// - public double time; - /// - /// The distance traveled, meters - /// - public double distance; - /// - /// The instantaneous velocity, meters per second - /// - public double velocity; - /// - /// The instantaneous acceleration, meters per second squared - /// - public double acceleration; - - /// - /// Constructor that specifies each data value in the PerformanceData struct - /// - /// The time (seconds) at which these data are measured - /// The distance traveled, meters - /// The instantaneous velocity, meters per second - /// The instantaneous acceleration, meters per second squared - public PerformanceData( double time, double distance, double velocity, double acceleration ) - { - this.time = time; - this.distance = distance; - this.velocity = velocity; - this.acceleration = acceleration; - } - - /// - /// Gets or sets the data value as specified by the enum - /// - /// The required data value type - public double this[ PerfDataType type ] - { - get - { - switch( type ) - { - default: - case PerfDataType.Time: - return time; - case PerfDataType.Distance: - return distance; - case PerfDataType.Velocity: - return velocity; - case PerfDataType.Acceleration: - return acceleration; - } - } - set - { - switch( type ) - { - case PerfDataType.Time: - time = value; - break; - case PerfDataType.Distance: - distance = value; - break; - case PerfDataType.Velocity: - velocity = value; - break; - case PerfDataType.Acceleration: - acceleration = value; - break; - } - } - } - } - - /// - /// A sample class that holds an internal collection, and implements the - /// interface so that it can be used by ZedGraph as curve data. - /// - /// - /// This particular class efficiently implements the data storage so that the class - /// can be cloned without duplicating the data points. For example, you can create - /// a , populate it with values, and set - /// = and - /// = . - /// You can then clone this to a new one, and set - /// = . - /// Each of these 's can then be used as an - /// argument, - /// thereby plotting a distance vs time curve and a velocity vs time curve. There - /// will still be only one copy of the data in memory. - /// - [Serializable] - public class SampleMultiPointList : IPointList - { - /// - /// This is where the data are stored. Duplicating the - /// copies the reference to this , but does not actually duplicate - /// the data. - /// - private ArrayList DataCollection; - - /// - /// Determines what X data will be returned by the indexer of this list. - /// - public PerfDataType XData; - /// - /// Determines what Y data will be returned by the indexer of this list. - /// - public PerfDataType YData; - - /// - /// Default constructor - /// - public SampleMultiPointList() - { - XData = PerfDataType.Time; - YData = PerfDataType.Distance; - DataCollection = new ArrayList(); - } - - /// - /// The Copy Constructor. This method does NOT duplicate the data, it merely makes - /// another "Window" into the same collection. You can make multiple copies and - /// set the and/or properties to different - /// values to plot different data, while maintaining only one copy of the original values. - /// - /// The from which to copy - public SampleMultiPointList( SampleMultiPointList rhs ) - { - DataCollection = rhs.DataCollection; - XData = rhs.XData; - YData = rhs.YData; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public SampleMultiPointList Clone() - { - return new SampleMultiPointList( this ); - } - - /// - /// Indexer to access the data. This gets the appropriate data and converts to - /// the struct that is compatible with ZedGraph. The - /// actual data returned depends on the values of and - /// . - /// - /// The ordinal position of the desired point in the list - /// A corresponding to the specified ordinal data position - public PointPair this[ int index ] - { - get - { - double xVal, yVal; - if ( index >= 0 && index < this.Count ) - { - // grab the specified PerformanceData struct - PerformanceData perfData = (PerformanceData) DataCollection[index]; - // extract the values from the struct according to the user-set - // enum values of XData and YData - xVal = perfData[XData]; - yVal = perfData[YData]; - } - else - { - xVal = PointPair.Missing; - yVal = PointPair.Missing; - } - - // insert the values into a pointpair and return - return new PointPair( xVal, yVal, PointPair.Missing, null ); - } - } - - /// - /// Gets the number of data points in the collection - /// - public int Count - { - get { return DataCollection.Count; } - } - - /// - /// Adds the specified struct to the end of the collection. - /// - /// A struct to be added - /// The ordinal position in the collection where the values were added - public int Add( PerformanceData perfData ) - { - return DataCollection.Add( perfData ); - } - - /// - /// Remove the struct from the list at the specified - /// ordinal location. - /// - /// The ordinal location of the - /// struct to be removed - public void RemoveAt( int index ) - { - DataCollection.RemoveAt( index ); - } - - /// - /// Insert the specified struct into the list at - /// the specified ordinal location. - /// - /// The ordinal location at which to insert - /// The struct to be inserted - public void Insert( int index, PerformanceData perfData ) - { - DataCollection.Insert( index, perfData ); - } - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/SamplePointList.cs b/SDK/ZedGraphs/ZedGraph/SamplePointList.cs deleted file mode 100644 index 811d65c..0000000 --- a/SDK/ZedGraphs/ZedGraph/SamplePointList.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System; -using System.Collections; -using System.Text; - -namespace ZedGraph -{ - /// - /// enumeration used to indicate which type of data will be plotted. - /// - public enum SampleType - { - /// - /// Designates the "Time" property will be used - /// - Time, - /// - /// Designates the "Position" property will be used - /// - Position, - /// - /// Designates the Instantaneous Velocity property will be used - /// - VelocityInst, - /// - /// Designates the "Time since start" property will be used - /// - TimeDiff, - /// - /// Designates the Average Velocity property will be used - /// - VelocityAvg - }; - - /// - /// A simple storage class to maintain an individual sampling of data - /// - public class Sample : System.Object - { - private DateTime _time; - private double _position; - private double _velocity; - - /// - /// The time of the sample - /// - public DateTime Time - { - get { return _time; } - set { _time = value; } - } - /// - /// The position at sample time - /// - public double Position - { - get { return _position; } - set { _position = value; } - } - /// - /// The instantaneous velocity at sample time - /// - public double Velocity - { - get { return _velocity; } - set { _velocity = value; } - } - } - - /// - /// A collection class to maintain a set of samples - /// - [Serializable] - public class SamplePointList : IPointList - { - /// - /// Determines what data type gets plotted for the X values - /// - public SampleType XType; - /// - /// Determines what data type gets plotted for the Y values - /// - public SampleType YType; - - // Stores the collection of samples - private ArrayList list; - - /// - /// Indexer: get the Sample instance at the specified ordinal position in the list - /// - /// The ordinal position in the list of samples - /// Returns a instance containing the - /// data specified by and - /// - public PointPair this[int index] - { - get - { - PointPair pt = new PointPair(); - Sample sample = (Sample) list[index]; - pt.X = GetValue( sample, XType ); - pt.Y = GetValue( sample, YType ); - return pt; - } - } - - /// - /// Gets the number of samples in the collection - /// - public int Count - { - get { return list.Count; } - } - - /// - /// Get the specified data type from the specified sample - /// - /// The sample instance of interest - /// The data type to be extracted from the sample - /// A double value representing the requested data - public double GetValue( Sample sample, SampleType type ) - { - switch ( type ) - { - case SampleType.Position: - return sample.Position; - case SampleType.Time: - return sample.Time.ToOADate(); - case SampleType.TimeDiff: - return sample.Time.ToOADate() - ( (Sample)list[0] ).Time.ToOADate(); - case SampleType.VelocityAvg: - double timeDiff = sample.Time.ToOADate() - ( (Sample)list[0] ).Time.ToOADate(); - if ( timeDiff <= 0 ) - return PointPair.Missing; - else - return ( sample.Position - ( (Sample)list[0] ).Position ) / timeDiff; - case SampleType.VelocityInst: - return sample.Velocity; - default: - return PointPair.Missing; - } - } - - /// - /// Append a sample to the collection - /// - /// The sample to append - /// The ordinal position at which the sample was added - public int Add( Sample sample ) - { - return list.Add( sample ); - } - - // generic Clone: just call the typesafe version - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// typesafe clone method - /// - /// A new cloned SamplePointList. This returns a copy of the structure, - /// but it does not duplicate the data (it just keeps a reference to the original) - /// - public SamplePointList Clone() - { - return new SamplePointList( this ); - } - - /// - /// default constructor - /// - public SamplePointList() - { - XType = SampleType.Time; - YType = SampleType.Position; - list = new ArrayList(); - } - - /// - /// copy constructor -- this returns a copy of the structure, - /// but it does not duplicate the data (it just keeps a reference to the original) - /// - /// The SamplePointList to be copied - public SamplePointList( SamplePointList rhs ) - { - XType = rhs.XType; - YType = rhs.YType; - - // Don't duplicate the data values, just copy the reference to the ArrayList - this.list = rhs.list; - - //foreach ( Sample sample in rhs ) - // list.Add( sample ); - } - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Scale.cs b/SDK/ZedGraphs/ZedGraph/Scale.cs deleted file mode 100644 index afd6d78..0000000 --- a/SDK/ZedGraphs/ZedGraph/Scale.cs +++ /dev/null @@ -1,2930 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; -using System.Drawing; -using System.Drawing.Drawing2D; - -namespace ZedGraph -{ - /// - /// The Scale class is an abstract base class that encompasses the properties - /// and methods associated with a scale of data. - /// - /// This class is inherited by the - /// , , , - /// , , , - /// , and - /// classes to define specific characteristics for those types. - /// - /// - /// John Champion - /// $Revision: 1.33 $ $Date: 2007-09-19 06:41:56 $ - [Serializable] - abstract public class Scale : ISerializable - { - #region Fields - - /// Private fields for the scale definitions. - /// Use the public properties , , - /// , , and - /// for access to these values. - /// - internal double _min, - _max, - _majorStep, - _minorStep, - _exponent, - _baseTic; - - /// Private fields for the automatic scaling modes. - /// Use the public properties , , - /// , , - /// and - /// for access to these values. - /// - internal bool _minAuto, - _maxAuto, - _majorStepAuto, - _minorStepAuto, - _magAuto, - _formatAuto; - - /// Private fields for the "grace" settings. - /// These values determine how much extra space is left before the first data value - /// and after the last data value. - /// Use the public properties and - /// for access to these values. - /// - internal double _minGrace, - _maxGrace; - - - /// Private field for the scale value display. - /// Use the public property for access to this value. - /// - internal int _mag; - - /// Private fields for the attributes. - /// Use the public properties and - /// for access to these values. - /// - internal bool _isReverse, - _isPreventLabelOverlap, - _isUseTenPower, - _isLabelsInside, - _isSkipFirstLabel, - _isSkipLastLabel, - _isSkipCrossLabel, - _isVisible; - - /// Private field for the array of text labels. - /// This property is only used if is set to - /// - internal string[] _textLabels = null; - - /// Private field for the format of the tic labels. - /// Use the public property for access to this value. - /// - internal string _format; - - /// - /// Private fields for Unit types to be used for the major and minor tics. - /// See and for the corresponding - /// public properties. - /// These types only apply for date-time scales (). - /// - /// The value of these types is of enumeration type - /// - internal DateUnit _majorUnit, - _minorUnit; - - /// Private field for the alignment of the tic labels. - /// This fields controls whether the inside, center, or outside edges of the text labels are aligned. - /// Use the public property - /// for access to this value. - /// - internal AlignP _align; - - /// Private field for the alignment of the tic labels. - /// This fields controls whether the left, center, or right edges of the text labels are aligned. - /// Use the public property - /// for access to this value. - /// - internal AlignH _alignH; - - - /// Private fields for the font specificatios. - /// Use the public properties and - /// for access to these values. - internal FontSpec _fontSpec; - - /// - /// Internal field that stores the amount of space between the scale labels and the - /// major tics. Use the public property to access this - /// value. - /// - internal float _labelGap; - - /// - /// Data range temporary values, used by GetRange(). - /// - internal double _rangeMin, - _rangeMax, - _lBound, - _uBound; - - /// - /// Pixel positions at the minimum and maximum value for this scale. - /// These are temporary values used/valid only during the Draw process. - /// - internal float _minPix, - _maxPix; - - /// - /// Scale values for calculating transforms. These are temporary values - /// used ONLY during the Draw process. - /// - /// - /// These values are just and - /// for normal linear scales, but for log or exponent scales they will be a - /// linear representation. For , it is the - /// of the value, and for , - /// it is the - /// of the value. - /// - internal double _minLinTemp, - _maxLinTemp; - - /// - /// Gets or sets the linearized version of the scale range. - /// - /// - /// This value is valid at any time, whereas is an optimization - /// pre-set that is only valid during draw operations. - /// - internal double _minLinearized - { - get { return Linearize( _min ); } - set { _min = DeLinearize( value ); } - } - - /// - /// Gets or sets the linearized version of the scale range. - /// - /// - /// This value is valid at any time, whereas is an optimization - /// pre-set that is only valid during draw operations. - /// - internal double _maxLinearized - { - get { return Linearize( _max ); } - set { _max = DeLinearize( value ); } - } - - /// - /// private field that stores the owner Axis that contains this Scale instance. - /// - internal Axis _ownerAxis; - - #endregion - - #region Defaults - - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - /// - /// The default "zero lever" for automatically selecting the axis - /// scale range (see ). This number is - /// used to determine when an axis scale range should be extended to - /// include the zero value. This value is maintained only in the - /// class, and cannot be changed after compilation. - /// - public static double ZeroLever = 0.25; - /// The default "grace" value applied to the minimum data range. - /// This value is - /// expressed as a fraction of the total data range. For example, assume the data - /// range is from 4.0 to 16.0, leaving a range of 12.0. If MinGrace is set to - /// 0.1, then 10% of the range, or 1.2 will be subtracted from the minimum data value. - /// The scale will then be ranged to cover at least 2.8 to 16.0. - /// - /// - public static double MinGrace = 0.1; - /// The default "grace" value applied to the maximum data range. - /// This value is - /// expressed as a fraction of the total data range. For example, assume the data - /// range is from 4.0 to 16.0, leaving a range of 12.0. If MaxGrace is set to - /// 0.1, then 10% of the range, or 1.2 will be added to the maximum data value. - /// The scale will then be ranged to cover at least 4.0 to 17.2. - /// - /// - /// - public static double MaxGrace = 0.1; - /// - /// The maximum number of text labels (major tics) that will be allowed on the plot by - /// the automatic scaling logic. This value applies only to - /// axes. If there are more than MaxTextLabels on the plot, then - /// will be increased to reduce the number of labels. That is, - /// the step size might be increased to 2.0 to show only every other label. - /// - public static double MaxTextLabels = 12.0; - /// - /// The default target number of steps for automatically selecting the X axis - /// scale step size (see ). - /// This number is an initial target value for the number of major steps - /// on an axis. This value is maintained only in the - /// class, and cannot be changed after compilation. - /// - public static double TargetXSteps = 7.0; - /// - /// The default target number of steps for automatically selecting the Y or Y2 axis - /// scale step size (see ). - /// This number is an initial target value for the number of major steps - /// on an axis. This value is maintained only in the - /// class, and cannot be changed after compilation. - /// - public static double TargetYSteps = 7.0; - /// - /// The default target number of minor steps for automatically selecting the X axis - /// scale minor step size (see ). - /// This number is an initial target value for the number of minor steps - /// on an axis. This value is maintained only in the - /// class, and cannot be changed after compilation. - /// - public static double TargetMinorXSteps = 5.0; - /// - /// The default target number of minor steps for automatically selecting the Y or Y2 axis - /// scale minor step size (see ). - /// This number is an initial target value for the number of minor steps - /// on an axis. This value is maintained only in the - /// class, and cannot be changed after compilation. - /// - public static double TargetMinorYSteps = 5.0; - /// - /// The default reverse mode for the scale - /// ( property). true for a reversed scale - /// (X decreasing to the left, Y/Y2 decreasing upwards), false otherwise. - /// - public static bool IsReverse = false; - /// - /// The default setting for the scale format string - /// ( property). For numeric values, this value is - /// setting according to the format strings. For date - /// type values, this value is set as per the function. - /// - //public static string ScaleFormat = "&dd-&mmm-&yy &hh:&nn"; - public static string Format = "g"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 1825 days (5 years). - /// This value is used by the method. - /// - public static double RangeYearYear = 1825; // 5 years - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 730 days (2 years). - /// This value is used by the method. - /// - public static double RangeYearMonth = 730; // 2 years - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 300 days (10 months). - /// This value is used by the method. - /// - public static double RangeMonthMonth = 300; // 10 months - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 10 days. - /// This value is used by the method. - /// - public static double RangeDayDay = 10; // 10 days - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 3 days. - /// This value is used by the method. - /// - public static double RangeDayHour = 3; // 3 days - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 0.4167 days (10 hours). - /// This value is used by the method. - /// - public static double RangeHourHour = 0.4167; // 10 hours - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 0.125 days (3 hours). - /// This value is used by the method. - /// - public static double RangeHourMinute = 0.125; // 3 hours - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 6.94e-3 days (10 minutes). - /// This value is used by the method. - /// - public static double RangeMinuteMinute = 6.94e-3; // 10 Minutes - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 2.083e-3 days (3 minutes). - /// This value is used by the method. - /// - public static double RangeMinuteSecond = 2.083e-3; // 3 Minutes - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// If the total span of data exceeds this number (in days), then the auto-range - /// code will select = - /// and = . - /// This value normally defaults to 3.472e-5 days (3 seconds). - /// This value is used by the method. - /// - public static double RangeSecondSecond = 3.472e-5; // 3 Seconds - - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatYearYear = "yyyy"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatYearMonth = "MMM-yyyy"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatMonthMonth = "MMM-yyyy"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatDayDay = "d-MMM"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatDayHour = "d-MMM HH:mm"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatHourHour = "HH:mm"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatHourMinute = "HH:mm"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatMinuteMinute = "HH:mm"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatMinuteSecond = "mm:ss"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatSecondSecond = "mm:ss"; - /// - /// A default setting for the auto-ranging code. - /// This values applies only to Date-Time type axes. - /// This is the format used for the scale values when auto-ranging code - /// selects a of - /// for and for - /// for . - /// This value is used by the method. - /// - /// - public static string FormatMillisecond = "ss.fff"; - - /* Prior format assignments using original XDate.ToString() - this.scaleFormat = "&yyyy"; - this.scaleFormat = "&mmm-&yy"; - this.scaleFormat = "&mmm-&yy"; - scaleFormat = "&d-&mmm"; - this.scaleFormat = "&d-&mmm &hh:&nn"; - scaleFormat = "&hh:&nn"; - scaleFormat = "&hh:&nn"; - scaleFormat = "&hh:&nn"; - scaleFormat = "&nn:&ss"; - scaleFormat = "&nn:&ss"; - */ - /// The default alignment of the tic labels. - /// This value controls whether the inside, center, or outside edges of the text labels are aligned. - /// - /// - public static AlignP Align = AlignP.Center; - /// The default alignment of the tic labels. - /// This value controls whether the left, center, or right edges of the text labels are aligned. - /// - /// - public static AlignH AlignH = AlignH.Center; - /// - /// The default font family for the scale values - /// font specification - /// ( property). - /// - public static string FontFamily = "Arial"; - /// - /// The default font size for the scale values - /// font specification - /// ( property). Units are - /// in points (1/72 inch). - /// - public static float FontSize = 14; - /// - /// The default font color for the scale values - /// font specification - /// ( property). - /// - public static Color FontColor = Color.Black; - /// - /// The default font bold mode for the scale values - /// font specification - /// ( property). true - /// for a bold typeface, false otherwise. - /// - public static bool FontBold = false; - /// - /// The default font italic mode for the scale values - /// font specification - /// ( property). true - /// for an italic typeface, false otherwise. - /// - public static bool FontItalic = false; - /// - /// The default font underline mode for the scale values - /// font specification - /// ( property). true - /// for an underlined typeface, false otherwise. - /// - public static bool FontUnderline = false; - /// - /// The default color for filling in the scale text background - /// (see property). - /// - public static Color FillColor = Color.White; - /// - /// The default custom brush for filling in the scale text background - /// (see property). - /// - public static Brush FillBrush = null; - /// - /// The default fill mode for filling in the scale text background - /// (see property). - /// - public static FillType FillType = FillType.None; - /// - /// The default value for , which determines - /// whether or not the scale values are displayed. - /// - public static bool IsVisible = true; - /// - /// The default value for , which determines - /// whether or not the scale labels and title for the will appear - /// on the opposite side of the that it normally appears. - /// - public static bool IsLabelsInside = false; - /// - /// Determines the size of the band at the beginning and end of the axis that will have labels - /// omitted if the axis is shifted due to a non-default location using the - /// property. - /// - /// - /// This parameter applies only when is false. It is scaled according - /// to the size of the graph based on . When a non-default - /// axis location is selected, the first and last labels on that axis will overlap the opposing - /// axis frame. This parameter allows those labels to be omitted to avoid the overlap. Set this - /// parameter to zero to turn off the effect. - /// - public static float EdgeTolerance = 6; - - /// - /// The default setting for the gap between the outside tics (or the axis edge - /// if there are no outside tics) and the scale labels, expressed as a fraction of - /// the major tic size. - /// - public static float LabelGap = 0.3f; - } - - #endregion - - #region constructors - - /// - /// Basic constructor -- requires that the object be intialized with - /// a pre-existing owner . - /// - /// The object that is the owner of this - /// instance. - public Scale( Axis ownerAxis ) - { - _ownerAxis = ownerAxis; - - _min = 0.0; - _max = 1.0; - _majorStep = 0.1; - _minorStep = 0.1; - _exponent = 1.0; - _mag = 0; - _baseTic = PointPair.Missing; - - _minGrace = Default.MinGrace; - _maxGrace = Default.MaxGrace; - - _minAuto = true; - _maxAuto = true; - _majorStepAuto = true; - _minorStepAuto = true; - _magAuto = true; - _formatAuto = true; - - _isReverse = Default.IsReverse; - _isUseTenPower = true; - _isPreventLabelOverlap = true; - _isVisible = true; - _isSkipFirstLabel = false; - _isSkipLastLabel = false; - _isSkipCrossLabel = false; - - _majorUnit = DateUnit.Day; - _minorUnit = DateUnit.Day; - - _format = null; - _textLabels = null; - - _isLabelsInside = Default.IsLabelsInside; - _align = Default.Align; - _alignH = Default.AlignH; - - _fontSpec = new FontSpec( - Default.FontFamily, Default.FontSize, - Default.FontColor, Default.FontBold, - Default.FontUnderline, Default.FontItalic, - Default.FillColor, Default.FillBrush, - Default.FillType ); - - _fontSpec.Border.IsVisible = false; - _labelGap = Default.LabelGap; - } - - /// - /// Copy Constructor. Create a new object based on the specified - /// existing one. - /// - /// The object to be copied. - /// The object that will own the - /// new instance of - public Scale( Scale rhs, Axis owner ) - { - _ownerAxis = owner; - - _min = rhs._min; - _max = rhs._max; - _majorStep = rhs._majorStep; - _minorStep = rhs._minorStep; - _exponent = rhs._exponent; - _baseTic = rhs._baseTic; - - _minAuto = rhs._minAuto; - _maxAuto = rhs._maxAuto; - _majorStepAuto = rhs._majorStepAuto; - _minorStepAuto = rhs._minorStepAuto; - _magAuto = rhs._magAuto; - _formatAuto = rhs._formatAuto; - - _minGrace = rhs._minGrace; - _maxGrace = rhs._maxGrace; - - _mag = rhs._mag; - - _isUseTenPower = rhs._isUseTenPower; - _isReverse = rhs._isReverse; - _isPreventLabelOverlap = rhs._isPreventLabelOverlap; - _isVisible = rhs._isVisible; - _isSkipFirstLabel = rhs._isSkipFirstLabel; - _isSkipLastLabel = rhs._isSkipLastLabel; - _isSkipCrossLabel = rhs._isSkipCrossLabel; - - _majorUnit = rhs._majorUnit; - _minorUnit = rhs._minorUnit; - - _format = rhs._format; - - _isLabelsInside = rhs._isLabelsInside; - _align = rhs._align; - _alignH = rhs._alignH; - - _fontSpec = (FontSpec) rhs._fontSpec.Clone(); - - _labelGap = rhs._labelGap; - - if ( rhs._textLabels != null ) - _textLabels = (string[])rhs._textLabels.Clone(); - else - _textLabels = null; - } - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - abstract public Scale Clone( Axis owner ); -/* - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of Clone /> - /// - /// - /// Note that this method must be called with an explicit cast to ICloneable, and - /// that it is inherently virtual. For example: - /// - /// ParentClass foo = new ChildClass(); - /// ChildClass bar = (ChildClass) ((ICloneable)foo).Clone(); - /// - /// Assume that ChildClass is inherited from ParentClass. Even though foo is declared with - /// ParentClass, it is actually an instance of ChildClass. Calling the ICloneable implementation - /// of Clone() on foo actually calls ChildClass.Clone() as if it were a virtual function. - /// - /// A deep copy of this object - object ICloneable.Clone() - { - throw new NotImplementedException( "Can't clone an abstract base type -- child types must implement ICloneable" ); - //return new PaneBase( this ); - } -*/ - - /// - /// A construction method that creates a new object using the - /// properties of an existing object, but specifying a new - /// . - /// - /// - /// This constructor is used to change the type of an existing . - /// By specifying the old object, you are giving a set of properties - /// (which encompasses all fields associated with the scale, since the derived types - /// have no fields) to be used in creating a new object, only this - /// time having the newly specified object type. - /// The existing object from which to - /// copy the field data. - /// An representing the type of derived type - /// of new object to create. - /// The new object. - public Scale MakeNewScale( Scale oldScale, AxisType type ) - { - switch ( type ) - { - case AxisType.Linear: - return new LinearScale( oldScale, _ownerAxis ); - case AxisType.Date: - return new DateScale( oldScale, _ownerAxis ); - case AxisType.Log: - return new LogScale( oldScale, _ownerAxis ); - case AxisType.Exponent: - return new ExponentScale( oldScale, _ownerAxis ); - case AxisType.Ordinal: - return new OrdinalScale( oldScale, _ownerAxis ); - case AxisType.Text: - return new TextScale( oldScale, _ownerAxis ); - case AxisType.DateAsOrdinal: - return new DateAsOrdinalScale( oldScale, _ownerAxis ); - case AxisType.LinearAsOrdinal: - return new LinearAsOrdinalScale( oldScale, _ownerAxis ); - default: - throw new Exception( "Implementation Error: Invalid AxisType" ); - } - } - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - // schema changed to 2 with isScaleVisible - public const int schema = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Scale( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _min = info.GetDouble( "min" ); - _max = info.GetDouble( "max" ); - _majorStep = info.GetDouble( "majorStep" ); - _minorStep = info.GetDouble( "minorStep" ); - _exponent = info.GetDouble( "exponent" ); - _baseTic = info.GetDouble( "baseTic" ); - - - _minAuto = info.GetBoolean( "minAuto" ); - _maxAuto = info.GetBoolean( "maxAuto" ); - _majorStepAuto = info.GetBoolean( "majorStepAuto" ); - _minorStepAuto = info.GetBoolean( "minorStepAuto" ); - _magAuto = info.GetBoolean( "magAuto" ); - _formatAuto = info.GetBoolean( "formatAuto" ); - - _minGrace = info.GetDouble( "minGrace" ); - _maxGrace = info.GetDouble( "maxGrace" ); - - _mag = info.GetInt32( "mag" ); - - _isReverse = info.GetBoolean( "isReverse" ); - _isPreventLabelOverlap = info.GetBoolean( "isPreventLabelOverlap" ); - _isUseTenPower = info.GetBoolean( "isUseTenPower" ); - - _isVisible = true; - _isVisible = info.GetBoolean( "isVisible" ); - - _isSkipFirstLabel = info.GetBoolean( "isSkipFirstLabel" ); - _isSkipLastLabel = info.GetBoolean( "isSkipLastLabel" ); - _isSkipCrossLabel = info.GetBoolean( "isSkipCrossLabel" ); - - _textLabels = (string[]) info.GetValue( "textLabels", typeof(string[]) ); - _format = info.GetString( "format" ); - - _majorUnit = (DateUnit) info.GetValue( "majorUnit", typeof(DateUnit) ); - _minorUnit = (DateUnit) info.GetValue( "minorUnit", typeof(DateUnit) ); - - _isLabelsInside = info.GetBoolean( "isLabelsInside" ); - _align = (AlignP)info.GetValue( "align", typeof( AlignP ) ); - if ( schema >= 11 ) - _alignH = (AlignH)info.GetValue( "alignH", typeof( AlignH ) ); - - _fontSpec = (FontSpec)info.GetValue( "fontSpec", typeof( FontSpec ) ); - _labelGap = info.GetSingle( "labelGap" ); - - } - /// - /// Populates a instance with the data needed to - /// serialize the target object - /// - /// - /// You MUST set the _ownerAxis property after deserializing a BarSettings object. - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "min", _min ); - info.AddValue( "max", _max ); - info.AddValue( "majorStep", _majorStep ); - info.AddValue( "minorStep", _minorStep ); - info.AddValue( "exponent", _exponent ); - info.AddValue( "baseTic", _baseTic ); - - info.AddValue( "minAuto", _minAuto ); - info.AddValue( "maxAuto", _maxAuto ); - info.AddValue( "majorStepAuto", _majorStepAuto ); - info.AddValue( "minorStepAuto", _minorStepAuto ); - info.AddValue( "magAuto", _magAuto ); - info.AddValue( "formatAuto", _formatAuto ); - - info.AddValue( "minGrace", _minGrace ); - info.AddValue( "maxGrace", _maxGrace ); - - info.AddValue( "mag", _mag ); - info.AddValue( "isReverse", _isReverse ); - info.AddValue( "isPreventLabelOverlap", _isPreventLabelOverlap ); - info.AddValue( "isUseTenPower", _isUseTenPower ); - info.AddValue( "isVisible", _isVisible ); - info.AddValue( "isSkipFirstLabel", _isSkipFirstLabel ); - info.AddValue( "isSkipLastLabel", _isSkipLastLabel ); - info.AddValue( "isSkipCrossLabel", _isSkipCrossLabel ); - - - info.AddValue( "textLabels", _textLabels ); - info.AddValue( "format", _format ); - - info.AddValue( "majorUnit", _majorUnit ); - info.AddValue( "minorUnit", _minorUnit ); - - info.AddValue( "isLabelsInside", _isLabelsInside ); - info.AddValue( "align", _align ); - info.AddValue( "alignH", _alignH ); - info.AddValue( "fontSpec", _fontSpec ); - info.AddValue( "labelGap", _labelGap ); - } - #endregion - - #region properties - - /// - /// Get an enumeration that indicates the type of this scale. - /// - abstract public AxisType Type { get; } - - /// - /// True if this scale is , false otherwise. - /// - public bool IsLog { get { return this is LogScale; } } - /// - /// True if this scale is , false otherwise. - /// - public bool IsExponent { get { return this is ExponentScale; } } - /// - /// True if this scale is , false otherwise. - /// - public bool IsDate { get { return this is DateScale; } } - /// - /// True if this scale is , false otherwise. - /// - public bool IsText { get { return this is TextScale; } } - /// - /// True if this scale is , false otherwise. - /// - /// - /// Note that this is only true for an actual class. - /// This property will be false for other ordinal types such as - /// , , - /// or . Use the - /// as a "catchall" for all ordinal type axes. - /// - public bool IsOrdinal { get { return this is OrdinalScale; } } - - /// - /// Gets a value that indicates if this is of any of the - /// ordinal types in the enumeration. - /// - /// - public bool IsAnyOrdinal - { - get - { - AxisType type = this.Type; - - return type == AxisType.Ordinal || - type == AxisType.Text || - type == AxisType.LinearAsOrdinal || - type == AxisType.DateAsOrdinal; - } - } -/* - /// - /// The pixel position at the minimum value for this axis. This read-only - /// value is used/valid only during the Draw process. - /// - public float MinPix - { - get { return _minPix; } - } - /// - /// The pixel position at the maximum value for this axis. This read-only - /// value is used/valid only during the Draw process. - /// - public float MaxPix - { - get { return _maxPix; } - } -*/ - /// - /// Gets or sets the minimum scale value for this . - /// - /// This value can be set - /// automatically based on the state of . If - /// this value is set manually, then will - /// also be set to false. - /// - /// The value is defined in user scale units for - /// and axes. For - /// and axes, - /// this value is an ordinal starting with 1.0. For - /// axes, this value is in XL Date format (see , which is the - /// number of days since the reference date of January 1, 1900. - /// - /// - /// - /// - public virtual double Min - { - get { return _min; } - set { _min = value; _minAuto = false; } - } - /// - /// Gets or sets the maximum scale value for this . - /// - /// - /// This value can be set - /// automatically based on the state of . If - /// this value is set manually, then will - /// also be set to false. - /// - /// The value is defined in user scale units for - /// and axes. For - /// and axes, - /// this value is an ordinal starting with 1.0. For - /// axes, this value is in XL Date format (see , which is the - /// number of days since the reference date of January 1, 1900. - /// - /// - /// - /// - public virtual double Max - { - get { return _max; } - set { _max = value; _maxAuto = false; } - } - /// - /// Gets or sets the scale step size for this (the increment between - /// labeled axis values). - /// - /// - /// This value can be set - /// automatically based on the state of . If - /// this value is set manually, then will - /// also be set to false. This value is ignored for - /// axes. For axes, this - /// value is defined in units of . - /// - /// The value is defined in user scale units - /// - /// - /// - /// - /// - /// - /// - /// - public double MajorStep - { - get { return _majorStep; } - set - { - if ( value < 1e-300 ) - { - _majorStepAuto = true; - } - else - { - _majorStep = value; - _majorStepAuto = false; - } - } - } - /// - /// Gets or sets the scale minor step size for this (the spacing between - /// minor tics). - /// - /// This value can be set - /// automatically based on the state of . If - /// this value is set manually, then will - /// also be set to false. This value is ignored for and - /// axes. For axes, this - /// value is defined in units of . - /// - /// The value is defined in user scale units - /// - /// - /// - /// - public double MinorStep - { - get { return _minorStep; } - set - { - if ( value < 1e-300 ) - { - _minorStepAuto = true; - } - else - { - _minorStep = value; - _minorStepAuto = false; - } - } - } - /// - /// Gets or sets the scale exponent value. This only applies to . - /// - /// - /// - /// - /// - /// - /// - /// - /// - public double Exponent - { - get { return _exponent; } - set { _exponent = value; } - } - - /// - /// Gets or sets the scale value at which the first major tic label will appear. - /// - /// This property allows the scale labels to start at an irregular value. - /// For example, on a scale range with = 0, = 1000, - /// and = 200, a value of 50 would cause - /// the scale labels to appear at values 50, 250, 450, 650, and 850. Note that the - /// default value for this property is , which means the - /// value is not used. Setting this property to any value other than - /// will activate the effect. The value specified must - /// coincide with the first major tic. That is, if were set to - /// 650 in the example above, then the major tics would only occur at 650 and 850. This - /// setting may affect the minor tics, since the minor tics are always referenced to the - /// . That is, in the example above, if the - /// were set to 30 (making it a non-multiple of the major step), then the minor tics would - /// occur at 20, 50 (so it lines up with the BaseTic), 80, 110, 140, etc. - /// - /// The value is defined in user scale units - /// - /// - /// - /// - /// - public double BaseTic - { - get { return _baseTic; } - set { _baseTic = value; } - } - - /// - /// Gets or sets the type of units used for the major step size (). - /// - /// - /// This unit type only applies to Date-Time axes ( = true). - /// The axis is set to date type with the property. - /// The unit types are defined as . - /// - /// The value is a enum type - /// - /// - /// - /// - /// - public DateUnit MajorUnit - { - get { return _majorUnit; } - set { _majorUnit = value; } - } - /// - /// Gets or sets the type of units used for the minor step size (). - /// - /// - /// This unit type only applies to Date-Time axes ( = true). - /// The axis is set to date type with the property. - /// The unit types are defined as . - /// - /// The value is a enum type - /// - /// - /// - /// - /// - public DateUnit MinorUnit - { - get { return _minorUnit; } - set { _minorUnit = value; } - } - - /// - /// Gets the major unit multiplier for this scale type, if any. - /// - /// The major unit multiplier will correct the units of - /// to match the units of - /// and . This reflects the setting of - /// . - /// - virtual internal double MajorUnitMultiplier - { - get { return 1.0; } - } - - /// - /// Gets the minor unit multiplier for this scale type, if any. - /// - /// The minor unit multiplier will correct the units of - /// to match the units of - /// and . This reflects the setting of - /// . - /// - virtual internal double MinorUnitMultiplier - { - get { return 1.0; } - } - - /// - /// Gets or sets a value that determines whether or not the minimum scale value - /// is set automatically. - /// - /// - /// This value will be set to false if - /// is manually changed. - /// - /// true for automatic mode, false for manual mode - /// - public bool MinAuto - { - get { return _minAuto; } - set { _minAuto = value; } - } - /// - /// Gets or sets a value that determines whether or not the maximum scale value - /// is set automatically. - /// - /// - /// This value will be set to false if - /// is manually changed. - /// - /// true for automatic mode, false for manual mode - /// - public bool MaxAuto - { - get { return _maxAuto; } - set { _maxAuto = value; } - } - /// - /// Gets or sets a value that determines whether or not the scale step size - /// is set automatically. - /// - /// - /// This value will be set to false if - /// is manually changed. - /// - /// true for automatic mode, false for manual mode - /// - public bool MajorStepAuto - { - get { return _majorStepAuto; } - set { _majorStepAuto = value; } - } - /// - /// Gets or sets a value that determines whether or not the minor scale step size - /// is set automatically. - /// - /// - /// This value will be set to false if - /// is manually changed. - /// - /// true for automatic mode, false for manual mode - /// - public bool MinorStepAuto - { - get { return _minorStepAuto; } - set { _minorStepAuto = value; } - } - - /// - /// Determines whether or not the scale label format - /// is determined automatically based on the range of data values. - /// - /// - /// This value will be set to false if - /// is manually changed. - /// - /// true if will be set automatically, false - /// if it is to be set manually by the user - /// - /// - /// - public bool FormatAuto - { - get { return _formatAuto; } - set { _formatAuto = value; } - } - - /// - /// The format of the tic labels. - /// - /// - /// This property may be a date format or a numeric format, depending on the setting of - /// Scale.Type. - /// This property may be set automatically by ZedGraph, depending on the state of - /// . - /// - /// The format string conforms to the - /// for date formats, and - /// for numeric formats. - /// - /// - /// - /// - // /// - public string Format - { - get { return _format; } - set { _format = value; _formatAuto = false; } - } - - /// - /// The magnitude multiplier for scale values. - /// - /// - /// This is used to limit - /// the size of the displayed value labels. For example, if the value - /// is really 2000000, then the graph will display 2000 with a 10^3 - /// magnitude multiplier. This value can be determined automatically - /// depending on the state of . - /// If this value is set manually by the user, - /// then will also be set to false. - /// - /// The magnitude multiplier (power of 10) for the scale - /// value labels - /// - /// - /// - /// - // /// - public int Mag - { - get { return _mag; } - set { _mag = value; _magAuto = false; } - } - /// - /// Determines whether the value will be set - /// automatically based on the data, or manually by the user. - /// - /// - /// If the user manually sets the value, then this - /// flag will be set to false. - /// - /// true to have set automatically, - /// false otherwise - /// - /// - /// - public bool MagAuto - { - get { return _magAuto; } - set { _magAuto = value; } - } - - /// Gets or sets the "grace" value applied to the minimum data range. - /// - /// - /// This value is - /// expressed as a fraction of the total data range. For example, assume the data - /// range is from 4.0 to 16.0, leaving a range of 12.0. If MinGrace is set to - /// 0.1, then 10% of the range, or 1.2 will be subtracted from the minimum data value. - /// The scale will then be ranged to cover at least 2.8 to 16.0. - /// - /// - /// - /// - public double MinGrace - { - get { return _minGrace; } - set { _minGrace = value; } - } - /// Gets or sets the "grace" value applied to the maximum data range. - /// - /// - /// This values determines how much extra space is left after the last data value. - /// This value is - /// expressed as a fraction of the total data range. For example, assume the data - /// range is from 4.0 to 16.0, leaving a range of 12.0. If MaxGrace is set to - /// 0.1, then 10% of the range, or 1.2 will be added to the maximum data value. - /// The scale will then be ranged to cover at least 4.0 to 17.2. - /// - /// - /// - /// - public double MaxGrace - { - get { return _maxGrace; } - set { _maxGrace = value; } - } - - /// Controls the alignment of the tic labels. - /// - /// - /// This property controls whether the inside, center, or outside edges of the - /// text labels are aligned. - /// - public AlignP Align - { - get { return _align; } - set { _align = value; } - } - - /// Controls the alignment of the tic labels. - /// - /// - /// This property controls whether the left, center, or right edges of the - /// text labels are aligned. - /// - public AlignH AlignH - { - get { return _alignH; } - set { _alignH = value; } - } - - /// - /// Gets a reference to the class used to render - /// the scale values - /// - /// - /// - /// - /// - /// - /// - public FontSpec FontSpec - { - get { return _fontSpec; } - set - { - if ( value == null ) - throw new ArgumentNullException( "Uninitialized FontSpec in Scale" ); - _fontSpec = value; - } - } - - /// - /// The gap between the scale labels and the tics. - /// - public float LabelGap - { - get { return _labelGap; } - set { _labelGap = value; } - } - - /// - /// Gets or sets a value that causes the axis scale labels and title to appear on the - /// opposite side of the axis. - /// - /// - /// For example, setting this flag to true for the will shift the - /// axis labels and title to the right side of the instead of the - /// normal left-side location. Set this property to true for the , - /// and set the property for the to an arbitrarily - /// large value (assuming is false for the ) in - /// order to have the appear at the top of the . - /// - /// - /// - public bool IsLabelsInside - { - get { return _isLabelsInside; } - set { _isLabelsInside = value; } - } - - /// - /// Gets or sets a value that causes the first scale label for this to be - /// hidden. - /// - /// - /// Often, for axis that have an active setting (e.g., - /// is false), the first and/or last scale label are overlapped by opposing axes. Use this - /// property to hide the first scale label to avoid the overlap. Note that setting this value - /// to true will hide any scale label that appears within of the - /// beginning of the . - /// - public bool IsSkipFirstLabel - { - get { return _isSkipFirstLabel; } - set { _isSkipFirstLabel = value; } - } - - /// - /// Gets or sets a value that causes the last scale label for this to be - /// hidden. - /// - /// - /// Often, for axis that have an active setting (e.g., - /// is false), the first and/or last scale label are overlapped by opposing axes. Use this - /// property to hide the last scale label to avoid the overlap. Note that setting this value - /// to true will hide any scale label that appears within of the - /// end of the . - /// - public bool IsSkipLastLabel - { - get { return _isSkipLastLabel; } - set { _isSkipLastLabel = value; } - } - - /// - /// Gets or sets a value that causes the scale label that is located at the - /// value for this to be hidden. - /// - /// - /// For axes that have an active setting (e.g., - /// is false), the scale label at the value is overlapped by opposing axes. - /// Use this property to hide the scale label to avoid the overlap. - /// - public bool IsSkipCrossLabel - { - get { return _isSkipCrossLabel; } - set { _isSkipCrossLabel = value; } - } - - /// - /// Determines if the scale values are reversed for this - /// - /// true for the X values to decrease to the right or the Y values to - /// decrease upwards, false otherwise - /// . - public bool IsReverse - { - get { return _isReverse; } - set { _isReverse = value; } - } - /// - /// Determines if powers-of-ten notation will be used for the numeric value labels. - /// - /// - /// The powers-of-ten notation is just the text "10" followed by a superscripted value - /// indicating the magnitude. This mode is only valid for log scales (see - /// and ). - /// - /// boolean value; true to show the title as a power of ten, false to - /// show a regular numeric value (e.g., "0.01", "10", "1000") - public bool IsUseTenPower - { - get { return _isUseTenPower; } - set { _isUseTenPower = value; } - } - - /// - /// Gets or sets a value that determines if ZedGraph will check to - /// see if the scale labels are close enough to overlap. If so, - /// ZedGraph will adjust the step size to prevent overlap. - /// - /// - /// The process of checking for overlap is done during the - /// method call, and affects the selection of the major step size (). - /// - /// boolean value; true to check for overlap, false otherwise - public bool IsPreventLabelOverlap - { - get { return _isPreventLabelOverlap; } - set { _isPreventLabelOverlap = value; } - } - - /// - /// Gets or sets a property that determines whether or not the scale values will be shown. - /// - /// true to show the scale values, false otherwise - /// . - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - - /// - /// The text labels for this . - /// - /// - /// This property is only - /// applicable if is set to . - /// - public string[] TextLabels - { - get { return _textLabels; } - set { _textLabels = value; } - } - - #endregion -/* - #region events - - /// - /// A delegate that allows full custom formatting of the Axis labels - /// - /// The for which the label is to be - /// formatted - /// The for which the label is to be formatted - /// The value to be formatted - /// The zero-based index of the label to be formatted - /// - /// A string value representing the label, or null if the ZedGraph should go ahead - /// and generate the label according to the current settings - /// - public delegate string ScaleFormatHandler( GraphPane pane, Axis axis, double val, int index ); - - /// - /// Subscribe to this event to handle custom formatting of the scale labels. - /// - public event ScaleFormatHandler ScaleFormatEvent; - - #endregion -*/ - #region Methods - - /// - /// Setup some temporary transform values in preparation for rendering the - /// . - /// - /// - /// This method is typically called by the parent - /// object as part of the method. It is also - /// called by and - /// - /// methods to setup for coordinate transformations. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The parent for this - /// - virtual public void SetupScaleData( GraphPane pane, Axis axis ) - { - // save the ChartRect data for transforming scale values to pixels - if ( axis is XAxis || axis is X2Axis ) - { - _minPix = pane.Chart._rect.Left; - _maxPix = pane.Chart._rect.Right; - } - else - { - _minPix = pane.Chart._rect.Top; - _maxPix = pane.Chart._rect.Bottom; - } - - _minLinTemp = Linearize( _min ); - _maxLinTemp = Linearize( _max ); - - } - -/* internal void ResetScaleData() - { - _minPix = float.NaN; - _maxPix = float.NaN; - _minLinTemp = double.NaN; - _maxLinTemp = double.NaN; - } -*/ - /// - /// Convert a value to its linear equivalent for this type of scale. - /// - /// - /// The default behavior is to just return the value unchanged. However, - /// for and , - /// it returns the log or power equivalent. - /// - /// The value to be converted - virtual public double Linearize( double val ) - { - return val; - } - - /// - /// Convert a value from its linear equivalent to its actual scale value - /// for this type of scale. - /// - /// - /// The default behavior is to just return the value unchanged. However, - /// for and , - /// it returns the anti-log or inverse-power equivalent. - /// - /// The value to be converted - virtual public double DeLinearize( double val ) - { - return val; - } -/* - /// - /// Make a value label for the axis at the specified ordinal position. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log () - /// and text () type axes. - /// - /// The resulting value label as a - virtual internal string MakeLabel( GraphPane pane, int index, double dVal ) - { - if ( this.ScaleFormatEvent != null ) - { - string label; - - label = this.ScaleFormatEvent( pane, _ownerAxis, dVal, index ); - if ( label != null ) - return label; - } - - if ( _format == null ) - _format = Scale.Default.Format; - - // linear or ordinal is the default behavior - // this method is overridden for other Scale types - - double scaleMult = Math.Pow( (double) 10.0, _mag ); - - return ( dVal / scaleMult ).ToString( _format ); - } -*/ - - /// - /// Make a value label for the axis at the specified ordinal position. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log () - /// and text () type axes. - /// - /// The resulting value label as a - virtual internal string MakeLabel( GraphPane pane, int index, double dVal ) - { - if ( _format == null ) - _format = Scale.Default.Format; - - // linear or ordinal is the default behavior - // this method is overridden for other Scale types - - double scaleMult = Math.Pow( (double)10.0, _mag ); - - return ( dVal / scaleMult ).ToString( _format ); - } - - /// - /// Get the maximum width of the scale value text that is required to label this - /// . - /// The results of this method are used to determine how much space is required for - /// the axis labels. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// true to get the bounding box of the text using the , - /// false to just get the bounding box without rotation - /// - /// the maximum width of the text in pixel units - internal SizeF GetScaleMaxSpace( Graphics g, GraphPane pane, float scaleFactor, - bool applyAngle ) - { - if ( _isVisible ) - { - double dVal, - scaleMult = Math.Pow( (double)10.0, _mag ); - int i; - - float saveAngle = _fontSpec.Angle; - if ( !applyAngle ) - _fontSpec.Angle = 0; - - int nTics = CalcNumTics(); - - double startVal = CalcBaseTic(); - - SizeF maxSpace = new SizeF( 0, 0 ); - - // Repeat for each tic - for ( i = 0; i < nTics; i++ ) - { - dVal = CalcMajorTicValue( startVal, i ); - - // draw the label - //string tmpStr = MakeLabel( pane, i, dVal ); - string tmpStr = _ownerAxis.MakeLabelEventWorks( pane, i, dVal ); - - SizeF sizeF; - if ( this.IsLog && _isUseTenPower ) - sizeF = _fontSpec.BoundingBoxTenPower( g, tmpStr, - scaleFactor ); - else - sizeF = _fontSpec.BoundingBox( g, tmpStr, - scaleFactor ); - - if ( sizeF.Height > maxSpace.Height ) - maxSpace.Height = sizeF.Height; - if ( sizeF.Width > maxSpace.Width ) - maxSpace.Width = sizeF.Width; - } - - _fontSpec.Angle = saveAngle; - - return maxSpace; - } - else - return new SizeF(0,0); - } - - /// - /// Determine the value for any major tic. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// The value of the first major tic (floating point double) - /// - /// - /// The major tic number (0 = first major tic). For log scales, this is the actual power of 10. - /// - /// - /// The specified major tic value (floating point double). - /// - virtual internal double CalcMajorTicValue( double baseVal, double tic ) - { - // Default behavior is a normal linear scale (also works for ordinal types) - return baseVal + (double) _majorStep * tic; - } - - /// - /// Determine the value for any minor tic. - /// - /// - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// The value of the first major tic (floating point double). This tic value is the base - /// reference for all tics (including minor ones). - /// - /// - /// The major tic number (0 = first major tic). For log scales, this is the actual power of 10. - /// - /// - /// The specified minor tic value (floating point double). - /// - virtual internal double CalcMinorTicValue( double baseVal, int iTic ) - { - // default behavior is a linear axis (works for ordinal types too - return baseVal + (double) _minorStep * (double) iTic; - } - - /// - /// Internal routine to determine the ordinals of the first minor tic mark - /// - /// - /// The value of the first major tic for the axis. - /// - /// - /// The ordinal position of the first minor tic, relative to the first major tic. - /// This value can be negative (e.g., -3 means the first minor tic is 3 minor step - /// increments before the first major tic. - /// - virtual internal int CalcMinorStart( double baseVal ) - { - // Default behavior is for a linear scale (works for ordinal as well - return (int) ( ( _min - baseVal ) / _minorStep ); - } - - /// - /// Determine the value for the first major tic. - /// - /// - /// This is done by finding the first possible value that is an integral multiple of - /// the step size, taking into account the date/time units if appropriate. - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// First major tic value (floating point double). - /// - virtual internal double CalcBaseTic() - { - if ( _baseTic != PointPair.Missing ) - return _baseTic; - else if ( IsAnyOrdinal ) - { - // basetic is always 1 for ordinal types - return 1; - } - else - { - // default behavior is linear or ordinal type - // go to the nearest even multiple of the step size - return Math.Ceiling( (double)_min / (double)_majorStep - 0.00000001 ) - * (double)_majorStep; - } - } - - /// - /// Draw the value labels, tic marks, and grid lines as - /// required for this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The first major tic value for the axis - /// - /// - /// The total number of major tics for the axis - /// - /// - /// The pixel location of the far side of the ChartRect from this axis. - /// This value is the ChartRect.Height for the XAxis, or the ChartRect.Width - /// for the YAxis and Y2Axis. - /// - /// The number of pixels to shift this axis, based on the - /// value of . A positive value is into the ChartRect relative to - /// the default axis position. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - internal void DrawLabels( Graphics g, GraphPane pane, double baseVal, int nTics, - float topPix, float shift, float scaleFactor ) - { - MajorTic tic = _ownerAxis._majorTic; -// MajorGrid grid = _ownerAxis._majorGrid; - - double dVal, dVal2; - float pixVal, pixVal2; - float scaledTic = tic.ScaledTic( scaleFactor ); - - double scaleMult = Math.Pow( (double)10.0, _mag ); - - using ( Pen ticPen = tic.GetPen( pane, scaleFactor ) ) -// using ( Pen gridPen = grid.GetPen( pane, scaleFactor ) ) - { - // get the Y position of the center of the axis labels - // (the axis itself is referenced at zero) - SizeF maxLabelSize = GetScaleMaxSpace( g, pane, scaleFactor, true ); - float charHeight = _fontSpec.GetHeight( scaleFactor ); - float maxSpace = maxLabelSize.Height; - - float edgeTolerance = Default.EdgeTolerance * scaleFactor; - double rangeTol = ( _maxLinTemp - _minLinTemp ) * 0.001; - - int firstTic = (int)( ( _minLinTemp - baseVal ) / _majorStep + 0.99 ); - if ( firstTic < 0 ) - firstTic = 0; - - // save the position of the previous tic - float lastPixVal = -10000; - - // loop for each major tic - for ( int i = firstTic; i < nTics + firstTic; i++ ) - { - dVal = CalcMajorTicValue( baseVal, i ); - - // If we're before the start of the scale, just go to the next tic - if ( dVal < _minLinTemp ) - continue; - // if we've already past the end of the scale, then we're done - if ( dVal > _maxLinTemp + rangeTol ) - break; - - // convert the value to a pixel position - pixVal = LocalTransform( dVal ); - - // see if the tic marks will be drawn between the labels instead of at the labels - // (this applies only to AxisType.Text - if ( tic._isBetweenLabels && IsText ) - { - // We need one extra tic in order to draw the tics between labels - // so provide an exception here - if ( i == 0 ) - { - dVal2 = CalcMajorTicValue( baseVal, -0.5 ); - if ( dVal2 >= _minLinTemp ) - { - pixVal2 = LocalTransform( dVal2 ); - tic.Draw( g, pane, ticPen, pixVal2, topPix, shift, scaledTic ); - -// grid.Draw( g, gridPen, pixVal2, topPix ); - } - } - - dVal2 = CalcMajorTicValue( baseVal, (double)i + 0.5 ); - if ( dVal2 > _maxLinTemp ) - break; - pixVal2 = LocalTransform( dVal2 ); - } - else - pixVal2 = pixVal; - - tic.Draw( g, pane, ticPen, pixVal2, topPix, shift, scaledTic ); - - // draw the grid -// grid.Draw( g, gridPen, pixVal2, topPix ); - - bool isMaxValueAtMaxPix = ( ( _ownerAxis is XAxis || _ownerAxis is Y2Axis ) && - !IsReverse ) || - ( _ownerAxis is Y2Axis && IsReverse ); - - bool isSkipZone = ( ( ( _isSkipFirstLabel && isMaxValueAtMaxPix ) || - ( _isSkipLastLabel && !isMaxValueAtMaxPix ) ) && - pixVal < edgeTolerance ) || - ( ( ( _isSkipLastLabel && isMaxValueAtMaxPix ) || - ( _isSkipFirstLabel && !isMaxValueAtMaxPix ) ) && - pixVal > _maxPix - _minPix - edgeTolerance ); - - bool isSkipCross = _isSkipCrossLabel && !_ownerAxis._crossAuto && - Math.Abs( _ownerAxis._cross - dVal ) < rangeTol * 10.0; - - isSkipZone = isSkipZone || isSkipCross; - - if ( _isVisible && !isSkipZone ) - { - // For exponential scales, just skip any label that would overlap with the previous one - // This is because exponential scales have varying label spacing - if ( IsPreventLabelOverlap && - Math.Abs( pixVal - lastPixVal ) < maxLabelSize.Width ) - continue; - - DrawLabel( g, pane, i, dVal, pixVal, shift, maxSpace, scaledTic, charHeight, scaleFactor ); - - lastPixVal = pixVal; - } - } - } - } - - internal void DrawGrid( Graphics g, GraphPane pane, double baseVal, float topPix, float scaleFactor ) - { - MajorTic tic = _ownerAxis._majorTic; - MajorGrid grid = _ownerAxis._majorGrid; - - int nTics = CalcNumTics(); - - double dVal, dVal2; - float pixVal, pixVal2; - - using ( Pen gridPen = grid.GetPen( pane, scaleFactor ) ) - { - // get the Y position of the center of the axis labels - // (the axis itself is referenced at zero) -// SizeF maxLabelSize = GetScaleMaxSpace( g, pane, scaleFactor, true ); -// float charHeight = _fontSpec.GetHeight( scaleFactor ); -// float maxSpace = maxLabelSize.Height; - -// float edgeTolerance = Default.EdgeTolerance * scaleFactor; - double rangeTol = ( _maxLinTemp - _minLinTemp ) * 0.001; - - int firstTic = (int)( ( _minLinTemp - baseVal ) / _majorStep + 0.99 ); - if ( firstTic < 0 ) - firstTic = 0; - - // save the position of the previous tic -// float lastPixVal = -10000; - - // loop for each major tic - for ( int i = firstTic; i < nTics + firstTic; i++ ) - { - dVal = CalcMajorTicValue( baseVal, i ); - - // If we're before the start of the scale, just go to the next tic - if ( dVal < _minLinTemp ) - continue; - // if we've already past the end of the scale, then we're done - if ( dVal > _maxLinTemp + rangeTol ) - break; - - // convert the value to a pixel position - pixVal = LocalTransform( dVal ); - - // see if the tic marks will be drawn between the labels instead of at the labels - // (this applies only to AxisType.Text - if ( tic._isBetweenLabels && IsText ) - { - // We need one extra tic in order to draw the tics between labels - // so provide an exception here - if ( i == 0 ) - { - dVal2 = CalcMajorTicValue( baseVal, -0.5 ); - if ( dVal2 >= _minLinTemp ) - { - pixVal2 = LocalTransform( dVal2 ); - grid.Draw( g, gridPen, pixVal2, topPix ); - } - } - - dVal2 = CalcMajorTicValue( baseVal, (double)i + 0.5 ); - if ( dVal2 > _maxLinTemp ) - break; - pixVal2 = LocalTransform( dVal2 ); - } - else - pixVal2 = pixVal; - - // draw the grid - grid.Draw( g, gridPen, pixVal2, topPix ); - } - } - } - - internal void DrawLabel( Graphics g, GraphPane pane, int i, double dVal, float pixVal, - float shift, float maxSpace, float scaledTic, float charHeight, float scaleFactor ) - { - float textTop, textCenter; - if ( _ownerAxis.MajorTic.IsOutside ) - textTop = scaledTic + charHeight * _labelGap; - else - textTop = charHeight * _labelGap; - - // draw the label - //string tmpStr = MakeLabel( pane, i, dVal ); - string tmpStr = _ownerAxis.MakeLabelEventWorks( pane, i, dVal ); - - float height; - if ( this.IsLog && _isUseTenPower ) - height = _fontSpec.BoundingBoxTenPower( g, tmpStr, scaleFactor ).Height; - else - height = _fontSpec.BoundingBox( g, tmpStr, scaleFactor ).Height; - - if ( _align == AlignP.Center ) - textCenter = textTop + maxSpace / 2.0F; - else if ( _align == AlignP.Outside ) - textCenter = textTop + maxSpace - height / 2.0F; - else // inside - textCenter = textTop + height / 2.0F; - - if ( _isLabelsInside ) - textCenter = shift - textCenter; - else - textCenter = shift + textCenter; - - AlignV av = AlignV.Center; - AlignH ah = AlignH.Center; - - if ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) - ah = _alignH; - else - av = _alignH == AlignH.Left ? AlignV.Top : ( _alignH == AlignH.Right ? AlignV.Bottom : AlignV.Center ); - - if ( this.IsLog && _isUseTenPower ) - _fontSpec.DrawTenPower( g, pane, tmpStr, - pixVal, textCenter, - ah, av, - scaleFactor ); - else - _fontSpec.Draw( g, pane, tmpStr, - pixVal, textCenter, - ah, av, - scaleFactor ); - } - - /// - /// Draw the scale, including the tic marks, value labels, and grid lines as - /// required for this . - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// The number of pixels to shift to account for non-primary axis position (e.g., - /// the second, third, fourth, etc. or . - /// - internal void Draw( Graphics g, GraphPane pane, float scaleFactor, float shiftPos ) - { - MajorGrid majorGrid = _ownerAxis._majorGrid; - MajorTic majorTic = _ownerAxis._majorTic; - MinorTic minorTic = _ownerAxis._minorTic; - - float rightPix, - topPix; - - GetTopRightPix( pane, out topPix, out rightPix ); - - // calculate the total number of major tics required - int nTics = CalcNumTics(); - - // get the first major tic value - double baseVal = CalcBaseTic(); - - using ( Pen pen = new Pen( _ownerAxis.Color, - pane.ScaledPenWidth( majorTic._penWidth, scaleFactor ) ) ) - { - - // redraw the axis border - if ( _ownerAxis.IsAxisSegmentVisible ) - g.DrawLine( pen, 0.0F, shiftPos, rightPix, shiftPos ); - - // Draw a zero-value line if needed - if ( majorGrid._isZeroLine && _min < 0.0 && _max > 0.0 ) - { - float zeroPix = LocalTransform( 0.0 ); - g.DrawLine( pen, zeroPix, 0.0F, zeroPix, topPix ); - } - } - - // draw the major tics and labels - DrawLabels( g, pane, baseVal, nTics, topPix, shiftPos, scaleFactor ); - -// _ownerAxis.DrawMinorTics( g, pane, baseVal, shiftPos, scaleFactor, topPix ); - - _ownerAxis.DrawTitle( g, pane, shiftPos, scaleFactor ); - } - - internal void GetTopRightPix( GraphPane pane, out float topPix, out float rightPix ) - { - if ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) - { - rightPix = pane.Chart._rect.Width; - topPix = -pane.Chart._rect.Height; - } - else - { - rightPix = pane.Chart._rect.Height; - topPix = -pane.Chart._rect.Width; - } - - // sanity check - if ( _min >= _max ) - return; - - // if the step size is outrageous, then quit - // (step size not used for log scales) - if ( !IsLog ) - { - if ( _majorStep <= 0 || _minorStep <= 0 ) - return; - - double tMajor = ( _max - _min ) / ( _majorStep * MajorUnitMultiplier ); - double tMinor = ( _max - _min ) / ( _minorStep * MinorUnitMultiplier ); - - MinorTic minorTic = _ownerAxis._minorTic; - - if ( tMajor > 1000 || - ( ( minorTic.IsOutside || minorTic.IsInside || minorTic.IsOpposite ) - && tMinor > 5000 ) ) - return; - } - } - - /// - /// Determine the width, in pixel units, of each bar cluster including - /// the cluster gaps and bar gaps. - /// - /// - /// This method uses the for - /// non-ordinal axes, or a cluster width of 1.0 for ordinal axes. - /// - /// A reference to the object - /// associated with this - /// The width of each bar cluster, in pixel units - public float GetClusterWidth( GraphPane pane ) - { - double basisVal = _min; - return Math.Abs( Transform( basisVal + - ( IsAnyOrdinal ? 1.0 : pane._barSettings._clusterScaleWidth ) ) - - Transform( basisVal ) ); - } - - /// - /// Calculates the cluster width, in pixels, by transforming the specified - /// clusterScaleWidth. - /// - /// The width in user scale units of each - /// bar cluster - /// The equivalent pixel size of the bar cluster - public float GetClusterWidth( double clusterScaleWidth ) - { - double basisVal = _min; - return Math.Abs( Transform( basisVal + clusterScaleWidth ) - - Transform( basisVal ) ); - } - - #endregion - - #region Scale Picker Methods - - /// - /// Select a reasonable scale given a range of data values. - /// - /// - /// The scale range is chosen - /// based on increments of 1, 2, or 5 (because they are even divisors of 10). This - /// routine honors the , , - /// and autorange settings as well as the - /// setting. In the event that any of the autorange settings are false, the - /// corresponding , , or - /// setting is explicitly honored, and the remaining autorange settings (if any) will - /// be calculated to accomodate the non-autoranged values. The basic defaults for - /// scale selection are defined using , - /// , and - /// from the default class. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to scale minor step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - virtual public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - double minVal = _rangeMin; - double maxVal = _rangeMax; - - // Make sure that minVal and maxVal are legitimate values - if ( Double.IsInfinity( minVal ) || Double.IsNaN( minVal ) || minVal == Double.MaxValue ) - minVal = 0.0; - if ( Double.IsInfinity( maxVal ) || Double.IsNaN( maxVal ) || maxVal == Double.MaxValue ) - maxVal = 0.0; - - // if the scales are autoranged, use the actual data values for the range - double range = maxVal - minVal; - - // "Grace" is applied to the numeric axis types only - bool numType = !this.IsAnyOrdinal; - - // For autoranged values, assign the value. If appropriate, adjust the value by the - // "Grace" value. - if ( _minAuto ) - { - _min = minVal; - // Do not let the grace value extend the axis below zero when all the values were positive - if ( numType && ( _min < 0 || minVal - _minGrace * range >= 0.0 ) ) - _min = minVal - _minGrace * range; - } - if ( _maxAuto ) - { - _max = maxVal; - // Do not let the grace value extend the axis above zero when all the values were negative - if ( numType && ( _max > 0 || maxVal + _maxGrace * range <= 0.0 ) ) - _max = maxVal + _maxGrace * range; - } - - if ( _max == _min && _maxAuto && _minAuto ) - { - if ( Math.Abs( _max ) > 1e-100 ) - { - _max *= ( _min < 0 ? 0.95 : 1.05 ); - _min *= ( _min < 0 ? 1.05 : 0.95 ); - } - else - { - _max = 1.0; - _min = -1.0; - } - } - - if ( _max <= _min ) - { - if ( _maxAuto ) - _max = _min + 1.0; - else if ( _minAuto ) - _min = _max - 1.0; - } - - } - - /// - /// Calculate the maximum number of labels that will fit on this axis. - /// - /// - /// This method works for - /// both X and Y direction axes, and it works for angled text (assuming that a bounding box - /// is an appropriate measure). Technically, labels at 45 degree angles could fit better than - /// the return value of this method since the bounding boxes can overlap without the labels actually - /// overlapping. - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - public int CalcMaxLabels( Graphics g, GraphPane pane, float scaleFactor ) - { - SizeF size = this.GetScaleMaxSpace( g, pane, scaleFactor, false ); - - // The font angles are already set such that the Width is parallel to the appropriate (X or Y) - // axis. Therefore, we always use size.Width. - // use the minimum of 1/4 the max Width or 1 character space - // double allowance = this.Scale.FontSpec.GetWidth( g, scaleFactor ); - // if ( allowance > size.Width / 4 ) - // allowance = size.Width / 4; - - - float maxWidth = 1000; - float temp = 1000; - float costh = (float) Math.Abs( Math.Cos( _fontSpec.Angle * Math.PI / 180.0 ) ); - float sinth = (float) Math.Abs( Math.Sin( _fontSpec.Angle * Math.PI / 180.0 ) ); - - if ( costh > 0.001 ) - maxWidth = size.Width / costh; - if ( sinth > 0.001 ) - temp = size.Height / sinth; - if ( temp < maxWidth ) - maxWidth = temp; - - - //maxWidth = size.Width; - /* - if ( this is XAxis ) - // Add an extra character width to leave a minimum of 1 character space between labels - maxWidth = size.Width + this.Scale.FontSpec.GetWidth( g, scaleFactor ); - else - // For vertical spacing, we only need 1/2 character - maxWidth = size.Width + this.Scale.FontSpec.GetWidth( g, scaleFactor ) / 2.0; - */ - if ( maxWidth <= 0 ) - maxWidth = 1; - - - // Calculate the maximum number of labels - double width; - RectangleF chartRect = pane.Chart._rect; - if ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) - width = ( chartRect.Width == 0 ) ? pane.Rect.Width * 0.75 : chartRect.Width; - else - width = ( chartRect.Height == 0 ) ? pane.Rect.Height * 0.75 : chartRect.Height; - - int maxLabels = (int) ( width / maxWidth ); - if ( maxLabels <= 0 ) - maxLabels = 1; - - return maxLabels; - } - - internal void SetScaleMag( double min, double max, double step ) - { - // set the scale magnitude if required - if ( _magAuto ) - { - // Find the optimal scale display multiple - double mag = -100; - double mag2 = -100; - - if ( Math.Abs( _min ) > 1.0e-30 ) - mag = Math.Floor( Math.Log10( Math.Abs( _min ) ) ); - if ( Math.Abs( _max ) > 1.0e-30 ) - mag2 = Math.Floor( Math.Log10( Math.Abs( _max ) ) ); - - mag = Math.Max( mag2, mag ); - - // Do not use scale multiples for magnitudes below 4 - if ( mag == -100 || Math.Abs( mag ) <= 3 ) - mag = 0; - - // Use a power of 10 that is a multiple of 3 (engineering scale) - _mag = (int) ( Math.Floor( mag / 3.0 ) * 3.0 ); - } - - // Calculate the appropriate number of dec places to display if required - if ( _formatAuto ) - { - int numDec = 0 - (int) ( Math.Floor( Math.Log10( _majorStep ) ) - _mag ); - if ( numDec < 0 ) - numDec = 0; - _format = "f" + numDec.ToString(); - } - } - - /// - /// Calculate a step size based on a data range. - /// - /// - /// This utility method - /// will try to honor the and - /// number of - /// steps while using a rational increment (1, 2, or 5 -- which are - /// even divisors of 10). This method is used by . - /// - /// The range of data in user scale units. This can - /// be a full range of the data for the major step size, or just the - /// value of the major step size to calculate the minor step size - /// The desired "typical" number of steps - /// to divide the range into - /// The calculated step size for the specified data range. - protected static double CalcStepSize( double range, double targetSteps ) - { - // Calculate an initial guess at step size - double tempStep = range / targetSteps; - - // Get the magnitude of the step size - double mag = Math.Floor( Math.Log10( tempStep ) ); - double magPow = Math.Pow( (double) 10.0, mag ); - - // Calculate most significant digit of the new step size - double magMsd = ( (int) ( tempStep / magPow + .5 ) ); - - // promote the MSD to either 1, 2, or 5 - if ( magMsd > 5.0 ) - magMsd = 10.0; - else if ( magMsd > 2.0 ) - magMsd = 5.0; - else if ( magMsd > 1.0 ) - magMsd = 2.0; - - return magMsd * magPow; - } - - /// - /// Calculate a step size based on a data range, limited to a maximum number of steps. - /// - /// - /// This utility method - /// will calculate a step size, of no more than maxSteps, - /// using a rational increment (1, 2, or 5 -- which are - /// even divisors of 10). This method is used by . - /// - /// The range of data in user scale units. This can - /// be a full range of the data for the major step size, or just the - /// value of the major step size to calculate the minor step size - /// The maximum allowable number of steps - /// to divide the range into - /// The calculated step size for the specified data range. - protected double CalcBoundedStepSize( double range, double maxSteps ) - { - // Calculate an initial guess at step size - double tempStep = range / maxSteps; - - // Get the magnitude of the step size - double mag = Math.Floor( Math.Log10( tempStep ) ); - double magPow = Math.Pow( (double) 10.0, mag ); - - // Calculate most significant digit of the new step size - double magMsd = Math.Ceiling( tempStep / magPow ); - - // promote the MSD to either 1, 2, or 5 - if ( magMsd > 5.0 ) - magMsd = 10.0; - else if ( magMsd > 2.0 ) - magMsd = 5.0; - else if ( magMsd > 1.0 ) - magMsd = 2.0; - - return magMsd * magPow; - } - - /// - /// Internal routine to determine the ordinals of the first and last major axis label. - /// - /// - /// This is the total number of major tics for this axis. - /// - virtual internal int CalcNumTics() - { - int nTics = 1; - - // default behavior is for a linear or ordinal scale - nTics = (int) ( ( _max - _min ) / _majorStep + 0.01 ) + 1; - - if ( nTics < 1 ) - nTics = 1; - else if ( nTics > 1000 ) - nTics = 1000; - - return nTics; - } - - /// - /// Calculate the modulus (remainder) in a safe manner so that divide - /// by zero errors are avoided - /// - /// The divisor - /// The dividend - /// the value of the modulus, or zero for the divide-by-zero - /// case - protected double MyMod( double x, double y ) - { - double temp; - - if ( y == 0 ) - return 0; - - temp = x / y; - return y * ( temp - Math.Floor( temp ) ); - } - - /// - /// Define suitable default ranges for an axis in the event that - /// no data were available - /// - /// The of interest - /// The for which to set the range - internal void SetRange( GraphPane pane, Axis axis ) - { - if ( _rangeMin >= Double.MaxValue || _rangeMax <= Double.MinValue ) - { - // If this is a Y axis, and the main Y axis is valid, use it for defaults - if ( axis != pane.XAxis && axis != pane.X2Axis && - pane.YAxis.Scale._rangeMin < double.MaxValue && pane.YAxis.Scale._rangeMax > double.MinValue ) - { - _rangeMin = pane.YAxis.Scale._rangeMin; - _rangeMax = pane.YAxis.Scale._rangeMax; - } - // Otherwise, if this is a Y axis, and the main Y2 axis is valid, use it for defaults - else if ( axis != pane.XAxis && axis != pane.X2Axis && - pane.Y2Axis.Scale._rangeMin < double.MaxValue && pane.Y2Axis.Scale._rangeMax > double.MinValue ) - { - _rangeMin = pane.Y2Axis.Scale._rangeMin; - _rangeMax = pane.Y2Axis.Scale._rangeMax; - } - // Otherwise, just use 0 and 1 - else - { - _rangeMin = 0; - _rangeMax = 1; - } - - } - - /* - if ( yMinVal >= Double.MaxValue || yMaxVal <= Double.MinValue ) - { - if ( y2MinVal < Double.MaxValue && y2MaxVal > Double.MinValue ) - { - yMinVal = y2MinVal; - yMaxVal = y2MaxVal; - } - else - { - yMinVal = 0; - yMaxVal = 0.01; - } - } - - if ( y2MinVal >= Double.MaxValue || y2MaxVal <= Double.MinValue ) - { - if ( yMinVal < Double.MaxValue && yMaxVal > Double.MinValue ) - { - y2MinVal = yMinVal; - y2MaxVal = yMaxVal; - } - else - { - y2MinVal = 0; - y2MaxVal = 1; - } - } - */ - } - - #endregion - - #region Coordinate Transform Methods - - /// - /// Transform the coordinate value from user coordinates (scale value) - /// to graphics device coordinates (pixels). - /// - /// This method takes into - /// account the scale range ( and ), - /// logarithmic state (), scale reverse state - /// () and axis type (, - /// , or ). - /// Note that the must be valid, and - /// must be called for the - /// current configuration before using this method (this is called everytime - /// the graph is drawn (i.e., is called). - /// - /// The coordinate value, in user scale units, to - /// be transformed - /// the coordinate value transformed to screen coordinates - /// for use in calling the draw routines - public float Transform( double x ) - { - // Must take into account Log, and Reverse Axes - double denom = ( _maxLinTemp - _minLinTemp ); - double ratio; - if ( denom > 1e-100 ) - ratio = ( Linearize( x ) - _minLinTemp ) / denom; - else - ratio = 0; - - // _isReverse axisType Eqn - // T XAxis _maxPix - ... - // F YAxis _maxPix - ... - // F Y2Axis _maxPix - ... - - // T YAxis _minPix + ... - // T Y2Axis _minPix + ... - // F XAxis _minPix + ... - - if ( _isReverse == ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) ) - return (float) ( _maxPix - ( _maxPix - _minPix ) * ratio ); - else - return (float) ( _minPix + ( _maxPix - _minPix ) * ratio ); - } - - /// - /// Transform the coordinate value from user coordinates (scale value) - /// to graphics device coordinates (pixels). - /// - /// - /// This method takes into - /// account the scale range ( and ), - /// logarithmic state (), scale reverse state - /// () and axis type (, - /// , or ). - /// Note that the must be valid, and - /// must be called for the - /// current configuration before using this method (this is called everytime - /// the graph is drawn (i.e., is called). - /// - /// true to force the axis to honor the data - /// value, rather than replacing it with the ordinal value - /// The ordinal value of this point, just in case - /// this is an axis - /// The coordinate value, in user scale units, to - /// be transformed - /// the coordinate value transformed to screen coordinates - /// for use in calling the draw routines - public float Transform( bool isOverrideOrdinal, int i, double x ) - { - // ordinal types ignore the X value, and just use the ordinal position - if ( this.IsAnyOrdinal && i >= 0 && !isOverrideOrdinal ) - x = (double) i + 1.0; - return Transform( x ); - - } - - /// - /// Reverse transform the user coordinates (scale value) - /// given a graphics device coordinate (pixels). - /// - /// - /// This method takes into - /// account the scale range ( and ), - /// logarithmic state (), scale reverse state - /// () and axis type (, - /// , or ). - /// Note that the must be valid, and - /// must be called for the - /// current configuration before using this method (this is called everytime - /// the graph is drawn (i.e., is called). - /// - /// The screen pixel value, in graphics device coordinates to - /// be transformed - /// The user scale value that corresponds to the screen pixel location - public double ReverseTransform( float pixVal ) - { - double val; - - // see if the sign of the equation needs to be reversed - if ( ( _isReverse ) == ( _ownerAxis is XAxis || _ownerAxis is X2Axis ) ) - val = (double) ( pixVal - _maxPix ) - / (double) ( _minPix - _maxPix ) - * ( _maxLinTemp - _minLinTemp ) + _minLinTemp; - else - val = (double) ( pixVal - _minPix ) - / (double) ( _maxPix - _minPix ) - * ( _maxLinTemp - _minLinTemp ) + _minLinTemp; - - return DeLinearize( val ); - } - - - /// - /// Transform the coordinate value from user coordinates (scale value) - /// to graphics device coordinates (pixels). - /// - /// Assumes that the origin - /// has been set to the "left" of this axis, facing from the label side. - /// Note that the left side corresponds to the scale minimum for the X and - /// Y2 axes, but it is the scale maximum for the Y axis. - /// This method takes into - /// account the scale range ( and ), - /// logarithmic state (), scale reverse state - /// () and axis type (, - /// , or ). Note that - /// the must be valid, and - /// must be called for the - /// current configuration before using this method. - /// - /// The coordinate value, in linearized user scale units, to - /// be transformed - /// the coordinate value transformed to screen coordinates - /// for use in calling the method - public float LocalTransform( double x ) - { - // Must take into account Log, and Reverse Axes - double ratio; - float rv; - - // Coordinate values for log scales are already in exponent form, so no need - // to take the log here - ratio = ( x - _minLinTemp ) / - ( _maxLinTemp - _minLinTemp ); - - if ( _isReverse == ( _ownerAxis is YAxis || _ownerAxis is X2Axis ) ) - rv = (float) ( ( _maxPix - _minPix ) * ratio ); - else - rv = (float)( ( _maxPix - _minPix ) * ( 1.0F - ratio ) ); - - return rv; - } - - /// - /// Calculate a base 10 logarithm in a safe manner to avoid math exceptions - /// - /// The value for which the logarithm is to be calculated - /// The value of the logarithm, or 0 if the - /// argument was negative or zero - public static double SafeLog( double x ) - { - if ( x > 1.0e-20 ) - return Math.Log10( x ); - else - return 0.0; - } - - /// - ///Calculate an exponential in a safe manner to avoid math exceptions - /// - /// The value for which the exponential is to be calculated - /// The exponent value to use for calculating the exponential. - public static double SafeExp( double x, double exponent ) - { - if ( x > 1.0e-20 ) - return Math.Pow( x, exponent ); - else - return 0.0; - } - - #endregion - - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ScaleState.cs b/SDK/ZedGraphs/ZedGraph/ScaleState.cs deleted file mode 100644 index da3210f..0000000 --- a/SDK/ZedGraphs/ZedGraph/ScaleState.cs +++ /dev/null @@ -1,186 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Text; - -#endregion - -namespace ZedGraph -{ - /// - /// A class that captures an scale range. - /// - /// This structure is used by the class to store - /// scale range settings in a collection for later retrieval. - /// The class stores the , , - /// , and properties, along with - /// the corresponding auto-scale settings: , - /// , , - /// and . - /// John Champion - /// $Revision: 3.2 $ $Date: 2007-02-19 08:05:24 $ - public class ScaleState : ICloneable - { - /// - /// The axis range data for , , - /// , and - /// - private double _min, _minorStep, _majorStep, _max; - /// - /// The status of , - /// , , - /// and - /// - private bool _minAuto, _minorStepAuto, - _majorStepAuto, _maxAuto, - _formatAuto, _magAuto; - - /// - /// The status of and - /// - private DateUnit _minorUnit, _majorUnit; - - private string _format; - private int _mag; - - /// - /// Construct a from the specified - /// - /// The from which to collect the scale - /// range settings. - public ScaleState( Axis axis ) - { - _min = axis._scale._min; - _minorStep = axis._scale._minorStep; - _majorStep = axis._scale._majorStep; - _max = axis._scale._max; - _majorUnit = axis._scale._majorUnit; - _minorUnit = axis._scale._minorUnit; - - _format = axis._scale._format; - _mag = axis._scale._mag; - //this.numDec = axis.NumDec; - - _minAuto = axis._scale._minAuto; - _majorStepAuto = axis._scale._majorStepAuto; - _minorStepAuto = axis._scale._minorStepAuto; - _maxAuto = axis._scale._maxAuto; - - _formatAuto = axis._scale._formatAuto; - _magAuto = axis._scale._magAuto; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ScaleState( ScaleState rhs ) - { - _min = rhs._min; - _majorStep = rhs._majorStep; - _minorStep = rhs._minorStep; - _max = rhs._max; - _majorUnit = rhs._majorUnit; - _minorUnit = rhs._minorUnit; - - _format = rhs._format; - _mag = rhs._mag; - - _minAuto = rhs._minAuto; - _majorStepAuto = rhs._majorStepAuto; - _minorStepAuto = rhs._minorStepAuto; - _maxAuto = rhs._maxAuto; - - _formatAuto = rhs._formatAuto; - _magAuto = rhs._magAuto; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public ScaleState Clone() - { - return new ScaleState( this ); - } - - /// - /// Copy the properties from this out to the specified . - /// - /// The reference to which the properties should be - /// copied - public void ApplyScale( Axis axis ) - { - axis._scale._min = _min; - axis._scale._majorStep = _majorStep; - axis._scale._minorStep = _minorStep; - axis._scale._max = _max; - axis._scale._majorUnit = _majorUnit; - axis._scale._minorUnit = _minorUnit; - - axis._scale._format = _format; - axis._scale._mag = _mag; - - // The auto settings must be made after the min/step/max settings, since setting those - // properties actually affects the auto settings. - axis._scale._minAuto = _minAuto; - axis._scale._minorStepAuto = _minorStepAuto; - axis._scale._majorStepAuto = _majorStepAuto; - axis._scale._maxAuto = _maxAuto; - - axis._scale._formatAuto = _formatAuto; - axis._scale._magAuto = _magAuto; - - } - - /// - /// Determine if the state contained in this object is different from - /// the state of the specified . - /// - /// The object with which to compare states. - /// true if the states are different, false otherwise - public bool IsChanged( Axis axis ) - { - return axis._scale._min != _min || - axis._scale._majorStep != _majorStep || - axis._scale._minorStep != _minorStep || - axis._scale._max != _max || - axis._scale._minorUnit != _minorUnit || - axis._scale._majorUnit != _majorUnit || - axis._scale._minAuto != _minAuto || - axis._scale._minorStepAuto != _minorStepAuto || - axis._scale._majorStepAuto != _majorStepAuto || - axis._scale._maxAuto != _maxAuto; - } - - } -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ScaleStateList.cs b/SDK/ZedGraphs/ZedGraph/ScaleStateList.cs deleted file mode 100644 index 71b1915..0000000 --- a/SDK/ZedGraphs/ZedGraph/ScaleStateList.cs +++ /dev/null @@ -1,178 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Collections.Generic; -using System.Text; - -#endregion - -namespace ZedGraph -{ - /// - /// A collection class that maintains a list of - /// objects, corresponding to the list of objects - /// from or . - /// - public class ScaleStateList : List, ICloneable - { - /// - /// Construct a new automatically from an - /// existing . - /// - /// The (a list of Y axes), - /// from which to retrieve the state and create the - /// objects. - public ScaleStateList( YAxisList list ) - { - foreach ( Axis axis in list ) - this.Add( new ScaleState( axis ) ); - } - - /// - /// Construct a new automatically from an - /// existing . - /// - /// The (a list of Y axes), - /// from which to retrieve the state and create the - /// objects. - public ScaleStateList( Y2AxisList list ) - { - foreach ( Axis axis in list ) - this.Add( new ScaleState( axis ) ); - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ScaleStateList( ScaleStateList rhs ) - { - foreach ( ScaleState item in rhs ) - { - this.Add( item.Clone() ); - } - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public ScaleStateList Clone() - { - return new ScaleStateList( this ); - } - - /// - /// Iterate through the list of objects, comparing them - /// to the state of the specified - /// objects. - /// - /// A object specifying a list of - /// objects to be compared with this . - /// - /// true if a difference is found, false otherwise - public bool IsChanged( YAxisList list ) - { - int count = Math.Min( list.Count, this.Count ); - for ( int i = 0; i < count; i++ ) - if ( this[i].IsChanged( list[i] ) ) - return true; - - return false; - } - - /// - /// Iterate through the list of objects, comparing them - /// to the state of the specified - /// objects. - /// - /// A object specifying a list of - /// objects to be compared with this . - /// - /// true if a difference is found, false otherwise - public bool IsChanged( Y2AxisList list ) - { - int count = Math.Min( list.Count, this.Count ); - for ( int i = 0; i < count; i++ ) - if ( this[i].IsChanged( list[i] ) ) - return true; - - return false; - } - /* - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public ScaleState this[ int index ] - { - get { return (ScaleState) List[index]; } - set { List[index] = value; } - } - /// - /// Add a object to the collection at the end of the list. - /// - /// A reference to the object to - /// be added - /// - public void Add( ScaleState state ) - { - List.Add( state ); - } - */ - - /// - /// - /// - /// - public void ApplyScale( YAxisList list ) - { - int count = Math.Min( list.Count, this.Count ); - for ( int i = 0; i < count; i++ ) - this[i].ApplyScale( list[i] ); - } - - /// - /// - /// - /// - public void ApplyScale( Y2AxisList list ) - { - int count = Math.Min( list.Count, this.Count ); - for ( int i = 0; i < count; i++ ) - this[i].ApplyScale( list[i] ); - } - } -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ScrollRange.cs b/SDK/ZedGraphs/ZedGraph/ScrollRange.cs deleted file mode 100644 index b3145e0..0000000 --- a/SDK/ZedGraphs/ZedGraph/ScrollRange.cs +++ /dev/null @@ -1,97 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; - -namespace ZedGraph -{ - /// - /// A simple struct to store minimum and maximum type - /// values for the scroll range - /// - public struct ScrollRange - { - private bool _isScrollable; - private double _min; - private double _max; - - /// - /// Construct a object given the specified data values. - /// - /// The minimum axis value limit for the scroll bar - /// The maximum axis value limit for the scroll bar - /// true to make this item scrollable, false otherwise - public ScrollRange( double min, double max, bool isScrollable ) - { - _min = min; - _max = max; - _isScrollable = isScrollable; - } - - /// - /// Sets the scroll range to default values of zero, and sets the - /// property as specified. - /// - /// true to make this item scrollable, false otherwise - public ScrollRange( bool isScrollable ) - { - _min = 0.0; - _max = 0.0; - _isScrollable = isScrollable; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ScrollRange( ScrollRange rhs ) - { - _min = rhs._min; - _max = rhs._max; - _isScrollable = rhs._isScrollable; - } - - /// - /// Gets or sets a property that determines if the corresponding to - /// this object can be scrolled. - /// - public bool IsScrollable - { - get { return _isScrollable; } - set { _isScrollable = value; } - } - - /// - /// The minimum axis value limit for the scroll bar. - /// - public double Min - { - get { return _min; } - set { _min = value; } - } - /// - /// The maximum axis value limit for the scroll bar. - /// - public double Max - { - get { return _max; } - set { _max = value; } - } - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ScrollRangeList.cs b/SDK/ZedGraphs/ZedGraph/ScrollRangeList.cs deleted file mode 100644 index 2c5c611..0000000 --- a/SDK/ZedGraphs/ZedGraph/ScrollRangeList.cs +++ /dev/null @@ -1,129 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects. - /// - /// - /// John Champion - /// $Revision: 3.3 $ $Date: 2006-06-24 20:26:43 $ - public class ScrollRangeList : List, ICloneable - { - - #region Constructors - - /// - /// Default constructor for the collection class. - /// - public ScrollRangeList() - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ScrollRangeList( ScrollRangeList rhs ) - { - foreach ( ScrollRange item in rhs ) - this.Add( new ScrollRange( item ) ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public ScrollRangeList Clone() - { - return new ScrollRangeList( this ); - } - - - #endregion - - #region List Methods - - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object instance - public new ScrollRange this[ int index ] - { - get - { - if ( index < 0 || index >= this.Count ) - return new ScrollRange( false ); - else - return (ScrollRange) base[index]; - } - set { base[index] = value; } - } - - /* /// - /// Add a object to the collection at the end of the list. - /// - /// The object to be added - /// - public int Add( ScrollRange item ) - { - return List.Add( item ); - } - /// - /// Insert a object into the collection at the specified - /// zero-based index location. - /// - /// The zero-based index location for insertion. - /// The object that is to be - /// inserted. - /// - public void Insert( int index, ScrollRange item ) - { - List.Insert( index, item ); - } - */ - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Selection.cs b/SDK/ZedGraphs/ZedGraph/Selection.cs deleted file mode 100644 index dc0d2cb..0000000 --- a/SDK/ZedGraphs/ZedGraph/Selection.cs +++ /dev/null @@ -1,258 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2007 John Champion and JCarpenter -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections; - -namespace ZedGraph -{ - /// - /// - /// - /// - /// - /// John Champion and JCarpenter - /// $Revision: 3.5 $ $Date: 2007-03-11 02:08:16 $ - public class Selection : CurveList - { - // Revision: JCarpenter 10/06 - /// - /// Subscribe to this event to receive notice - /// that the list of selected CurveItems has changed - /// - public event EventHandler SelectionChangedEvent; - - #region static properties - - /// - /// The type to be used for drawing "selected" - /// , , , - /// , and item types. - /// - public static Border Border = new Border( Color.Gray, 1.0f ); - /// - /// The type to be used for drawing "selected" - /// , , , - /// and item types. - /// - public static Fill Fill = new Fill( Color.Gray ); - /// - /// The type to be used for drawing "selected" - /// and types - /// - public static Line Line = new Line( Color.Gray ); - // public static ErrorBar ErrorBar = new ErrorBar( Color.Gray ); - /// - /// The type to be used for drawing "selected" - /// and types. - /// - public static Symbol Symbol = new Symbol( SymbolType.Circle, Color.Gray ); - - //public static Color SelectedSymbolColor = Color.Gray; - - #endregion - - #region Methods - - /// - /// Place a in the selection list, removing all other - /// items. - /// - /// The that is the "owner" - /// of the 's. - /// The to be added to the list. - public void Select( MasterPane master, CurveItem ci ) - { - //Clear the selection, but don't send the event, - //the event will be sent in "AddToSelection" by calling "UpdateSelection" - ClearSelection( master, false ); - - AddToSelection( master, ci ); - } - - /// - /// Place a list of 's in the selection list, removing all other - /// items. - /// - /// The that is the "owner" - /// of the 's. - /// The list of to be added to the list. - public void Select( MasterPane master, CurveList ciList ) - { - //Clear the selection, but don't send the event, - //the event will be sent in "AddToSelection" by calling "UpdateSelection" - ClearSelection( master, false ); - - AddToSelection( master, ciList ); - } - - /// - /// Add a to the selection list. - /// - /// The that is the "owner" - /// of the 's. - /// The to be added to the list. - public void AddToSelection( MasterPane master, CurveItem ci ) - { - if ( this.Contains( ci ) == false ) - Add( ci ); - - UpdateSelection( master ); - } - - /// - /// Add a list of 's to the selection list. - /// - /// The that is the "owner" - /// of the 's. - /// The list of 's to be added to the list. - public void AddToSelection( MasterPane master, CurveList ciList ) - { - foreach ( CurveItem ci in ciList ) - { - if ( this.Contains( ci ) == false ) - this.Add( ci ); - } - - UpdateSelection( master ); - } - -#if ( DOTNET1 ) - - // Define a "Contains" method so that this class works with .Net 1.1 or 2.0 - internal bool Contains( CurveItem item ) - { - foreach ( CurveItem ci in this ) - if ( item == ci ) - return true; - - return false; - } -#endif - - /// - /// Remove the specified from the selection list. - /// - /// The that is the "owner" - /// of the 's. - /// The to be removed from the list. - public void RemoveFromSelection( MasterPane master, CurveItem ci ) - { - if ( this.Contains( ci ) ) - this.Remove( ci ); - - UpdateSelection( master ); - - } - - /// - /// Clear the selection list and trigger a . - /// - /// The that "owns" the selection list. - public void ClearSelection( MasterPane master ) - { - ClearSelection( master, true ); - } - - /// - /// Clear the selection list and optionally trigger a . - /// - /// The that "owns" the selection list. - /// true to trigger a , - /// false otherwise. - public void ClearSelection( MasterPane master, bool sendEvent ) - { - this.Clear(); - - foreach ( GraphPane pane in master.PaneList ) - { - foreach ( CurveItem ci in pane.CurveList ) - { - ci.IsSelected = false; - } - } - - if ( sendEvent ) - { - if ( SelectionChangedEvent != null ) - SelectionChangedEvent( this, new EventArgs() ); - } - } - - /// - /// Mark the 's that are included in the selection list - /// by setting the property to true. - /// - /// The that "owns" the selection list. - public void UpdateSelection( MasterPane master ) - { - if ( Count <= 0 ) - { - ClearSelection( master ); - return; - } - - foreach ( GraphPane pane in master.PaneList ) - { - foreach ( CurveItem ci in pane.CurveList ) - { - //Make it Inactive - ci.IsSelected = false; - } - - } - foreach ( CurveItem ci in this ) - { - //Make Active - ci.IsSelected = true; - - //If it is a line / scatterplot, the selected Curve may be occluded by an unselected Curve - //So, move it to the top of the ZOrder by removing it, and re-adding it. - - //Why only do this for Lines? ...Bar and Pie Curves are less likely to overlap, - //and adding and removing Pie elements changes thier display order - if ( ci.IsLine ) - { - //I don't know how to get a Pane, from a CurveItem, so I can only do it - //if there is one and only one Pane, based on the assumption that the - //Curve's Pane is MasterPane[0] - - //If there is only one Pane - if ( master.PaneList.Count == 1 ) - { - GraphPane pane = master.PaneList[0]; - pane.CurveList.Remove( ci ); - pane.CurveList.Insert( 0, ci ); - } - - } - } - - //Send Selection Changed Event - if ( SelectionChangedEvent != null ) - SelectionChangedEvent( this, new EventArgs() ); - - } - - #endregion - - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/StickItem.cs b/SDK/ZedGraphs/ZedGraph/StickItem.cs deleted file mode 100644 index ba7ff1d..0000000 --- a/SDK/ZedGraphs/ZedGraph/StickItem.cs +++ /dev/null @@ -1,219 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// Encapsulates a curve type that is displayed as a series of vertical "sticks", - /// one at each defined point. - /// - /// - /// The sticks run from the zero value of the Y axis, to the Y point defined in each - /// of the (see ). - /// The properties of the sticks are defined in the property. - /// Normally, the is not visible. However, if you manually enable the - /// using the property, the - /// symbols will be drawn at the "Z" value from each (see - /// ). - /// - /// - /// John Champion - /// $Revision: 1.7 $ $Date: 2007-01-25 07:56:09 $ - [Serializable] - public class StickItem : LineItem, ICloneable, ISerializable - { - #region Fields - - #endregion - - #region Properties - - /// - /// Gets a flag indicating if the Z data range should be included in the axis scaling calculations. - /// - /// The parent of this . - /// - /// true if the Z data are included, false otherwise - override internal bool IsZIncluded( GraphPane pane ) - { - return _symbol.IsVisible; - } - - /// - /// Gets a flag indicating if the X axis is the independent axis for this - /// - /// The parent of this . - /// - /// true if the X axis is independent, false otherwise - override internal bool IsXIndependent( GraphPane pane ) - { - return true; - } - #endregion - - #region Constructors - /// - /// Create a new , specifying only the legend . - /// - /// The label that will appear in the legend. - public StickItem( string label ) : base( label ) - { - _symbol.IsVisible = false; - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// An array of double precision values that define - /// the independent (X axis) values for this curve - /// An array of double precision values that define - /// the dependent (Y axis) values for this curve - /// A value that will be applied to - /// the and properties. - /// - /// The width (in points) to be used for the . This - /// width is scaled based on . Use a value of zero to - /// hide the line (see ). - public StickItem( string label, double[] x, double[] y, Color color, float lineWidth ) - : this( label, new PointPairList( x, y ), color, lineWidth ) - { - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// An array of double precision values that define - /// the independent (X axis) values for this curve - /// An array of double precision values that define - /// the dependent (Y axis) values for this curve - /// A value that will be applied to - /// the and properties. - /// - public StickItem( string label, double[] x, double[] y, Color color ) - : this( label, new PointPairList( x, y ), color ) - { - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// A value that will be applied to - /// the and properties. - /// - public StickItem( string label, IPointList points, Color color ) - : this( label, points, color, ZedGraph.LineBase.Default.Width ) - { - } - - /// - /// Create a new using the specified properties. - /// - /// The label that will appear in the legend. - /// A of double precision value pairs that define - /// the X and Y values for this curve - /// A value that will be applied to - /// the and properties. - /// - /// The width (in points) to be used for the . This - /// width is scaled based on . Use a value of zero to - /// hide the line (see ). - public StickItem( string label, IPointList points, Color color, float lineWidth ) - : base( label, points, color, Symbol.Default.Type, lineWidth ) - { - _symbol.IsVisible = false; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public StickItem( StickItem rhs ) : base( rhs ) - { - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public new StickItem Clone() - { - return new StickItem( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected StickItem( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema3" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema3", schema3 ); - } - #endregion - - #region Methods - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/StockPointList.cs b/SDK/ZedGraphs/ZedGraph/StockPointList.cs deleted file mode 100644 index 57ddef2..0000000 --- a/SDK/ZedGraphs/ZedGraph/StockPointList.cs +++ /dev/null @@ -1,171 +0,0 @@ -//============================================================================ -//PointPairList Class -//Copyright 2006 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections.Generic; - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects - /// that define the set of points to be displayed on the curve. - /// - /// - /// John Champion based on code by Jerry Vos - /// $Revision: 3.4 $ $Date: 2007-02-18 05:51:54 $ - [Serializable] - public class StockPointList : List, IPointList, IPointListEdit - { - - #region Properties - - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// A object reference. - public new PointPair this[int index] - { - get { return base[index]; } - set { base[index] = new StockPt( value ); } - } - - #endregion - - #region Constructors - - /// - /// Default constructor for the collection class - /// - public StockPointList() - { - } - - /// - /// The Copy Constructor - /// - /// The StockPointList from which to copy - public StockPointList( StockPointList rhs ) - { - for ( int i = 0; i < rhs.Count; i++ ) - { - StockPt pt = new StockPt( rhs[i] ); - this.Add( pt ); - } - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public StockPointList Clone() - { - return new StockPointList( this ); - } - - #endregion - - #region Methods - - /// - /// Add a object to the collection at the end of the list. - /// - /// The object to - /// be added - new public void Add( StockPt point ) - { - base.Add( new StockPt( point ) ); - } - - /// - /// Add a object to the collection at the end of the list. - /// - /// The object to be added - public void Add( PointPair point ) - { -// throw new ArgumentException( "Error: Only the StockPt type can be added to StockPointList" + -// ". An ordinary PointPair is not allowed" ); - base.Add( new StockPt( point ) ); - } - - /// - /// Add a object to the collection at the end of the list using - /// the specified values. The unspecified values (low, open, close) are all set to - /// . - /// - /// An value - /// The high value for the day - /// The zero-based ordinal index where the point was added in the list. - public void Add( double date, double high ) - { - Add( new StockPt( date, high, PointPair.Missing, PointPair.Missing, - PointPair.Missing, PointPair.Missing ) ); - } - - /// - /// Add a single point to the from values of type double. - /// - /// An value - /// The high value for the day - /// The low value for the day - /// The opening value for the day - /// The closing value for the day - /// The trading volume for the day - /// The zero-based ordinal index where the point was added in the list. - public void Add( double date, double high, double low, double open, double close, double vol ) - { - StockPt point = new StockPt( date, high, low, open, close, vol ); - Add( point ); - } - - /// - /// Access the at the specified ordinal index. - /// - /// - /// To be compatible with the interface, the - /// must implement an index that returns a - /// rather than a . This method - /// will return the actual at the specified position. - /// - /// The ordinal position (zero-based) in the list - /// The specified . - /// - public StockPt GetAt( int index ) - { - return base[index]; - } - - #endregion - } -} - - diff --git a/SDK/ZedGraphs/ZedGraph/StockPt.cs b/SDK/ZedGraphs/ZedGraph/StockPt.cs deleted file mode 100644 index d722fe2..0000000 --- a/SDK/ZedGraphs/ZedGraph/StockPt.cs +++ /dev/null @@ -1,316 +0,0 @@ -//============================================================================ -//PointPair4 Class -//Copyright 2006 Jerry Vos & John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; -using IComparer = System.Collections.IComparer; - -namespace ZedGraph -{ - /// - /// The basic class holds three data values (X, Y, Z). This - /// class extends the basic PointPair to contain five data values (X, Y, Z, Open, Close). - /// - /// - /// The values are remapped to , , - /// , , and . - /// - /// - /// John Champion - /// $Revision: 3.4 $ $Date: 2007-02-07 07:46:46 $ - [Serializable] - public class StockPt : PointPair, ISerializable - { - - #region Member variables - - // member variable mapping: - // Date = X - // High = Y - // Low = Z - // Open = Open - // Close = Close - // Vol = Vol - - /// - /// This opening value - /// - public double Open; - - /// - /// This closing value - /// - public double Close; - - /// - /// This daily trading volume - /// - public double Vol; - - /// - /// This is a user value that can be anything. It is used to provide special - /// property-based coloration to the graph elements. - /// - private double _colorValue; - - #endregion - - #region Constructors - - /// - /// Default Constructor - /// - public StockPt() : this( 0, 0, 0, 0, 0, 0, null ) - { - } - - /// - /// Construct a new StockPt from the specified data values - /// - /// The trading date () - /// The opening stock price - /// The closing stock price - /// The daily high stock price - /// The daily low stock price - /// The daily trading volume - public StockPt( double date, double high, double low, double open, double close, double vol ) - : this( date, high, low, open, close, vol, null ) - { - } - - /// - /// Construct a new StockPt from the specified data values including a Tag property - /// - /// The trading date () - /// The opening stock price - /// The closing stock price - /// The daily high stock price - /// The daily low stock price - /// The daily trading volume - /// The user-defined property. - public StockPt( double date, double high, double low, double open, double close, double vol, - string tag ) - : base( date, high ) - { - this.Low = low; - this.Open = open; - this.Close = close; - this.Vol = vol; - this.ColorValue = PointPair.Missing; - this.Tag = tag; - } - - /// - /// The StockPt copy constructor. - /// - /// The basis for the copy. - public StockPt( StockPt rhs ) - : base( rhs ) - { - this.Low = rhs.Low; - this.Open = rhs.Open; - this.Close = rhs.Close; - this.Vol = rhs.Vol; - this.ColorValue = rhs.ColorValue; - - if ( rhs.Tag is ICloneable ) - this.Tag = ( (ICloneable)rhs.Tag ).Clone(); - else - this.Tag = rhs.Tag; - } - - /// - /// The StockPt copy constructor. - /// - /// The basis for the copy. - public StockPt( PointPair rhs ) - : base( rhs ) - { - if ( rhs is StockPt ) - { - StockPt pt = rhs as StockPt; - this.Open = pt.Open; - this.Close = pt.Close; - this.Vol = pt.Vol; - this.ColorValue = rhs.ColorValue; - } - else - { - this.Open = PointPair.Missing; - this.Close = PointPair.Missing; - this.Vol = PointPair.Missing; - this.ColorValue = PointPair.Missing; - } - } - - #endregion - - #region Serialization - - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema3 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected StockPt( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema3" ); - - Open = info.GetDouble( "Open" ); - Close = info.GetDouble( "Close" ); - Vol = info.GetDouble( "Vol" ); - ColorValue = info.GetDouble( "ColorValue" ); - } - - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema3", schema2 ); - info.AddValue( "Open", Open ); - info.AddValue( "Close", Close ); - info.AddValue( "Vol", Vol ); - info.AddValue( "ColorValue", ColorValue ); - } - - #endregion - - #region Properties - - /// - /// Map the Date property to the X value - /// - public double Date - { - get { return X; } - set { X = value; } - } - - /// - /// Map the high property to the Y value - /// - public double High - { - get { return Y; } - set { Y = value; } - } - - /// - /// Map the low property to the Z value - /// - public double Low - { - get { return Z; } - set { Z = value; } - } - - /// - /// The ColorValue property. This is used with the - /// option. - /// - override public double ColorValue - { - get { return _colorValue; } - set { _colorValue = value; } - } - - /// - /// Readonly value that determines if either the Date, Close, Open, High, or Low - /// coordinate in this StockPt is an invalid (not plotable) value. - /// It is considered invalid if it is missing (equal to System.Double.Max), - /// Infinity, or NaN. - /// - /// true if any value is invalid - public bool IsInvalid5D - { - get - { - return this.Date == PointPair.Missing || - this.Close == PointPair.Missing || - this.Open == PointPair.Missing || - this.High == PointPair.Missing || - this.Low == PointPair.Missing || - Double.IsInfinity( this.Date ) || - Double.IsInfinity( this.Close ) || - Double.IsInfinity( this.Open ) || - Double.IsInfinity( this.High ) || - Double.IsInfinity( this.Low ) || - Double.IsNaN( this.Date ) || - Double.IsNaN( this.Close ) || - Double.IsNaN( this.Open ) || - Double.IsNaN( this.High ) || - Double.IsNaN( this.Low ); - } - } - - #endregion - - #region Methods - - /// - /// Format this StockPt value using the default format. Example: "( 12.345, -16.876 )". - /// The two double values are formatted with the "g" format type. - /// - /// true to show all the value coordinates - /// A string representation of the . - override public string ToString( bool isShowAll ) - { - return this.ToString( PointPair.DefaultFormat, isShowAll ); - } - - /// - /// Format this PointPair value using a general format string. - /// Example: a format string of "e2" would give "( 1.23e+001, -1.69e+001 )". - /// If - /// is true, then the third all coordinates are shown. - /// - /// A format string that will be used to format each of - /// the two double type values (see ). - /// A string representation of the PointPair - /// true to show all the value coordinates - override public string ToString( string format, bool isShowAll ) - { - return "( " + XDate.ToString( this.Date, "g" ) + - ", " + this.Close.ToString( format ) + - ( isShowAll ? ( - ", " + this.Low.ToString( format ) + - ", " + this.Open.ToString( format ) + - ", " + this.Close.ToString( format ) ) : "" ) + " )"; - } - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Symbol.cs b/SDK/ZedGraphs/ZedGraph/Symbol.cs deleted file mode 100644 index e60bfc3..0000000 --- a/SDK/ZedGraphs/ZedGraph/Symbol.cs +++ /dev/null @@ -1,680 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// This class handles the drawing of the curve objects. - /// The symbols are the small shapes that appear over each defined point - /// along the curve. - /// - /// - /// John Champion - /// $Revision: 3.37 $ $Date: 2007-09-19 06:41:56 $ - [Serializable] - public class Symbol : ICloneable, ISerializable - { - #region Fields - /// - /// Private field that stores the size of this - /// in points (1/72 inch). Use the public - /// property to access this value. - /// - private float _size; - /// - /// Private field that stores the for this - /// . Use the public - /// property to access this value. - /// - private SymbolType _type; - /// - /// private field that determines if the symbols are drawn using - /// Anti-Aliasing capabilities from the class. - /// Use the public property to access - /// this value. - /// - private bool _isAntiAlias; - /// - /// Private field that stores the visibility of this - /// . Use the public - /// property to access this value. If this value is - /// false, the symbols will not be shown (but the may - /// still be shown). - /// - private bool _isVisible; - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Fill _fill; - /// - /// Private field that stores the data for this - /// . Use the public property to - /// access this value. - /// - private Border _border; - /// - /// Private field that stores the user defined data for this - /// . Use the public property to - /// access this value. - /// - private GraphicsPath _userSymbol; - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public struct Default - { - // Default Symbol properties - /// - /// The default size for curve symbols ( property), - /// in units of points. - /// - public static float Size = 7; - /// - /// The default pen width to be used for drawing curve symbols - /// ( property). Units are points. - /// - public static float PenWidth = 1.0F; - /// - /// The default color for filling in this - /// ( property). - /// - public static Color FillColor = Color.Red; - /// - /// The default custom brush for filling in this - /// ( property). - /// - public static Brush FillBrush = null; - /// - /// The default fill mode for the curve ( property). - /// - public static FillType FillType = FillType.None; - /// - /// The default symbol type for curves ( property). - /// This is defined as a enumeration. - /// - public static SymbolType Type = SymbolType.Square; - /// - /// The default value for the - /// property. - /// - public static bool IsAntiAlias = false; - /// - /// The default display mode for symbols ( property). - /// true to display symbols, false to hide them. - /// - public static bool IsVisible = true; - /// - /// The default for drawing frames around symbols ( property). - /// true to display symbol frames, false to hide them. - /// - public static bool IsBorderVisible = true; - /// - /// The default color for drawing symbols ( property). - /// - public static Color BorderColor = Color.Red; - } - #endregion - - #region Properties - /// - /// Gets or sets the size of the - /// - /// Size in points (1/72 inch) - /// - public float Size - { - get { return _size; } - set { _size = value; } - } - /// - /// Gets or sets the type (shape) of the - /// - /// A enum value indicating the shape - /// - public SymbolType Type - { - get { return _type; } - set { _type = value; } - } - /// - /// Gets or sets a value that determines if the symbols are drawn using - /// Anti-Aliasing capabilities from the class. - /// - /// - /// If this value is set to true, then the - /// property will be set to only while - /// this is drawn. A value of false will leave the value of - /// unchanged. - /// - public bool IsAntiAlias - { - get { return _isAntiAlias; } - set { _isAntiAlias = value; } - } - /// - /// Gets or sets a property that shows or hides the . - /// - /// true to show the symbol, false to hide it - /// - public bool IsVisible - { - get { return _isVisible; } - set { _isVisible = value; } - } - - /// - /// Gets or sets the data for this - /// . - /// - public Fill Fill - { - get { return _fill; } - set { _fill = value; } - } - /// - /// Gets or sets the data for this - /// , which controls the border outline of the symbol. - /// - public Border Border - { - get { return _border; } - set { _border = value; } - } - /// - /// Gets or sets the data for this - /// , describing the user-defined symbol type. - /// - /// - /// This value only applies if Symbol.Type - /// is SymbolType.UserDefined - /// - public GraphicsPath UserSymbol - { - get { return _userSymbol; } - set { _userSymbol = value; } - } - - #endregion - - #region Constructors - /// - /// Default constructor that sets all properties to default - /// values as defined in the class. - /// - public Symbol() : this( SymbolType.Default, Color.Empty ) - { - } - - /// - /// Default constructor that sets the and - /// as specified, and the remaining - /// properties to default - /// values as defined in the class. - /// - /// A enum value - /// indicating the shape of the symbol - /// A value indicating - /// the color of the symbol - /// - public Symbol( SymbolType type, Color color ) - { - _size = Default.Size; - _type = type; - _isAntiAlias = Default.IsAntiAlias; - _isVisible = Default.IsVisible; - _border = new Border( Default.IsBorderVisible, color, Default.PenWidth ); - _fill = new Fill( color, Default.FillBrush, Default.FillType ); - _userSymbol = null; - } - - /// - /// The Copy Constructor - /// - /// The Symbol object from which to copy - public Symbol( Symbol rhs ) - { - _size = rhs.Size; - _type = rhs.Type; - _isAntiAlias = rhs._isAntiAlias; - _isVisible = rhs.IsVisible; - _fill = rhs.Fill.Clone(); - _border = rhs.Border.Clone(); - - if ( rhs.UserSymbol != null ) - _userSymbol = rhs.UserSymbol.Clone() as GraphicsPath; - else - _userSymbol = null; - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Symbol Clone() - { - return new Symbol( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Symbol( SerializationInfo info, StreamingContext context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema" ); - - _size = info.GetSingle( "size" ); - _type = (SymbolType) info.GetValue( "type", typeof(SymbolType) ); - _isAntiAlias = info.GetBoolean( "isAntiAlias" ); - _isVisible = info.GetBoolean( "isVisible" ); - _fill = (Fill) info.GetValue( "fill", typeof(Fill) ); - _border = (Border) info.GetValue( "border", typeof(Border) ); - - if ( sch >= 11 ) - _userSymbol = (GraphicsPath)info.GetValue( "userSymbol", typeof( GraphicsPath ) ); - else - _userSymbol = null; - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public virtual void GetObjectData( SerializationInfo info, StreamingContext context ) - { - info.AddValue( "schema", schema ); - info.AddValue( "size", _size ); - info.AddValue( "type", _type ); - info.AddValue( "isAntiAlias", _isAntiAlias ); - info.AddValue( "isVisible", _isVisible ); - info.AddValue( "fill", _fill ); - info.AddValue( "border", _border ); - info.AddValue( "userSymbol", _userSymbol ); - } - #endregion - - #region Rendering Methods - - /// - /// Draw the to the specified device - /// at the specified location. This routine draws a single symbol. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// The x position of the center of the symbol in - /// pixel units - /// The y position of the center of the symbol in - /// pixel units - /// A previously constructed by - /// for this symbol - /// A class representing the standard pen for this symbol - /// A class representing a default solid brush for this symbol - /// If this symbol uses a , it will be created on the fly for - /// each point, since it has to be scaled to the individual point coordinates. - private void DrawSymbol( Graphics g, int x, int y, GraphicsPath path, - Pen pen, Brush brush ) - { - // Only draw if the symbol is visible - if ( _isVisible && - this.Type != SymbolType.None && - x < 100000 && x > -100000 && - y < 100000 && y > -100000 ) - { - Matrix saveMatrix = g.Transform; - g.TranslateTransform( x, y ); - - // Fill or draw the symbol as required - if ( _fill.IsVisible ) - g.FillPath( brush, path ); - //FillPoint( g, x, y, scaleFactor, pen, brush ); - - if ( _border.IsVisible ) - g.DrawPath( pen, path ); - //DrawPoint( g, x, y, scaleFactor, pen ); - - g.Transform = saveMatrix; - } - } - - /// - /// Draw the to the specified device - /// at the specified location. This routine draws a single symbol. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The x position of the center of the symbol in - /// pixel units - /// The y position of the center of the symbol in - /// pixel units - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// - /// The data value to be used for a value-based - /// color gradient. This is only applicable for , - /// or . - /// Indicates that the should be drawn - /// with attributes from the class. - /// - public void DrawSymbol( Graphics g, GraphPane pane, int x, int y, - float scaleFactor, bool isSelected, PointPair dataValue ) - { - Symbol source = this; - if ( isSelected ) - source = Selection.Symbol; - - // Only draw if the symbol is visible - if ( _isVisible && - this.Type != SymbolType.None && - x < 100000 && x > -100000 && - y < 100000 && y > -100000 ) - { - SmoothingMode sModeSave = g.SmoothingMode; - if ( _isAntiAlias ) - g.SmoothingMode = SmoothingMode.HighQuality; - - using ( Pen pen = _border.GetPen( pane, scaleFactor, dataValue ) ) - using ( GraphicsPath path = this.MakePath( g, scaleFactor ) ) - using ( Brush brush = this.Fill.MakeBrush( path.GetBounds(), dataValue ) ) - { - DrawSymbol( g, x, y, path, pen, brush ); - } - - g.SmoothingMode = sModeSave; - } - } - - /// - /// Create a struct for the current symbol based on the - /// specified scaleFactor and assuming the symbol will be centered at position 0,0. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor for the features of the graph based on the . This - /// scaling factor is calculated by the method. The scale factor - /// represents a linear multiple to be applied to font sizes, symbol sizes, etc. - /// Returns the for the current symbol - public GraphicsPath MakePath( Graphics g, float scaleFactor ) - { - float scaledSize = (float) ( _size * scaleFactor ); - float hsize = scaledSize / 2, - hsize1 = hsize + 1; - - GraphicsPath path = new GraphicsPath(); - - switch( _type == SymbolType.Default || ( _type == SymbolType.UserDefined && _userSymbol == null ) ? Default.Type : _type ) - { - case SymbolType.Square: - path.AddLine( -hsize, -hsize, hsize, -hsize ); - path.AddLine( hsize, -hsize, hsize, hsize ); - path.AddLine( hsize, hsize, -hsize, hsize ); - path.AddLine( -hsize, hsize, -hsize, -hsize ); - break; - case SymbolType.Diamond: - path.AddLine( 0, -hsize, hsize, 0 ); - path.AddLine( hsize, 0, 0, hsize ); - path.AddLine( 0, hsize, -hsize, 0 ); - path.AddLine( -hsize, 0, 0, -hsize ); - break; - case SymbolType.Triangle: - path.AddLine( 0, -hsize, hsize, hsize ); - path.AddLine( hsize, hsize, -hsize, hsize ); - path.AddLine( -hsize, hsize, 0, -hsize ); - break; - case SymbolType.Circle: - path.AddEllipse( -hsize, -hsize, scaledSize, scaledSize ); - break; - case SymbolType.XCross: - path.AddLine( -hsize, -hsize, hsize1, hsize1 ); - path.StartFigure(); - path.AddLine( hsize, -hsize, -hsize1, hsize1 ); - break; - case SymbolType.Plus: - path.AddLine( 0, -hsize, 0, hsize1 ); - path.StartFigure(); - path.AddLine( -hsize, 0, hsize1, 0 ); - break; - case SymbolType.Star: - path.AddLine( 0, -hsize, 0, hsize1 ); - path.StartFigure(); - path.AddLine( -hsize, 0, hsize1, 0 ); - path.StartFigure(); - path.AddLine( -hsize, -hsize, hsize1, hsize1 ); - path.StartFigure(); - path.AddLine( hsize, -hsize, -hsize1, hsize1 ); - break; - case SymbolType.TriangleDown: - path.AddLine( 0, hsize, hsize, -hsize ); - path.AddLine( hsize, -hsize, -hsize, -hsize ); - path.AddLine( -hsize, -hsize, 0, hsize ); - break; - case SymbolType.HDash: - path.AddLine( -hsize, 0, hsize1, 0 ); - break; - case SymbolType.VDash: - path.AddLine( 0, -hsize, 0, hsize1 ); - break; - case SymbolType.UserDefined: - path = _userSymbol.Clone() as GraphicsPath; - Matrix scaleTransform = new Matrix( scaledSize, 0.0f, 0.0f, scaledSize, 0.0f, 0.0f ); - path.Transform( scaleTransform ); - break; - } - - return path; - } - - /// - /// Draw this to the specified - /// device as a symbol at each defined point. The routine - /// only draws the symbols; the lines are draw by the - /// method. This method - /// is normally only called by the Draw method of the - /// object - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// A representing this - /// curve. - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// Indicates that the should be drawn - /// with attributes from the class. - /// - public void Draw( Graphics g, GraphPane pane, LineItem curve, float scaleFactor, - bool isSelected ) - { - Symbol source = this; - if ( isSelected ) - source = Selection.Symbol; - - int tmpX, tmpY; - - int minX = (int)pane.Chart.Rect.Left; - int maxX = (int)pane.Chart.Rect.Right; - int minY = (int)pane.Chart.Rect.Top; - int maxY = (int)pane.Chart.Rect.Bottom; - - // (Dale-a-b) we'll set an element to true when it has been drawn - bool[,] isPixelDrawn = new bool[maxX + 1, maxY + 1]; - - double curX, curY, lowVal; - IPointList points = curve.Points; - - if ( points != null && ( _border.IsVisible || _fill.IsVisible ) ) - { - SmoothingMode sModeSave = g.SmoothingMode; - if ( _isAntiAlias ) - g.SmoothingMode = SmoothingMode.HighQuality; - - // For the sake of speed, go ahead and create a solid brush and a pen - // If it's a gradient fill, it will be created on the fly for each symbol - //SolidBrush brush = new SolidBrush( this.fill.Color ); - - using ( Pen pen = source._border.GetPen( pane, scaleFactor ) ) - using ( GraphicsPath path = MakePath( g, scaleFactor ) ) - { - RectangleF rect = path.GetBounds(); - - using ( Brush brush = source.Fill.MakeBrush( rect ) ) - { - ValueHandler valueHandler = new ValueHandler( pane, false ); - Scale xScale = curve.GetXAxis( pane ).Scale; - Scale yScale = curve.GetYAxis( pane ).Scale; - - bool xIsLog = xScale.IsLog; - bool yIsLog = yScale.IsLog; - bool xIsOrdinal = xScale.IsAnyOrdinal; - - double xMin = xScale.Min; - double xMax = xScale.Max; - - // Loop over each defined point - for ( int i = 0; i < points.Count; i++ ) - { - // Get the user scale values for the current point - // use the valueHandler only for stacked types - if ( pane.LineType == LineType.Stack ) - { - valueHandler.GetValues( curve, i, out curX, out lowVal, out curY ); - } - // otherwise, just access the values directly. Avoiding the valueHandler for - // non-stacked types is an optimization to minimize overhead in case there are - // a large number of points. - else - { - curX = points[i].X; - if ( curve is StickItem ) - curY = points[i].Z; - else - curY = points[i].Y; - } - - // Any value set to double max is invalid and should be skipped - // This is used for calculated values that are out of range, divide - // by zero, etc. - // Also, any value <= zero on a log scale is invalid - - if ( curX != PointPair.Missing && - curY != PointPair.Missing && - !System.Double.IsNaN( curX ) && - !System.Double.IsNaN( curY ) && - !System.Double.IsInfinity( curX ) && - !System.Double.IsInfinity( curY ) && - ( curX > 0 || !xIsLog ) && - ( !yIsLog || curY > 0.0 ) && - ( xIsOrdinal || ( curX >= xMin && curX <= xMax ) ) ) - { - // Transform the user scale values to pixel locations - tmpX = (int) xScale.Transform( curve.IsOverrideOrdinal, i, curX ); - tmpY = (int) yScale.Transform( curve.IsOverrideOrdinal, i, curY ); - - // Maintain an array of "used" pixel locations to avoid duplicate drawing operations - if ( tmpX >= minX && tmpX <= maxX && tmpY >= minY && tmpY <= maxY ) // guard against the zoom-in case - { - if ( isPixelDrawn[tmpX, tmpY] ) - continue; - isPixelDrawn[tmpX, tmpY] = true; - } - - // If the fill type for this symbol is a Gradient by value type, - // the make a brush corresponding to the appropriate current value - if ( _fill.IsGradientValueType || _border._gradientFill.IsGradientValueType ) - { - using ( Brush tBrush = _fill.MakeBrush( rect, points[i] ) ) - using ( Pen tPen = _border.GetPen( pane, scaleFactor, points[i] ) ) - this.DrawSymbol( g, tmpX, tmpY, path, tPen, tBrush ); - } - else - { - // Otherwise, the brush is already defined - // Draw the symbol at the specified pixel location - this.DrawSymbol( g, tmpX, tmpY, path, pen, brush ); - } - } - } - } - } - - g.SmoothingMode = sModeSave; - } - } - #endregion - - } -} - diff --git a/SDK/ZedGraphs/ZedGraph/TextObj.cs b/SDK/ZedGraphs/ZedGraph/TextObj.cs deleted file mode 100644 index ded4094..0000000 --- a/SDK/ZedGraphs/ZedGraph/TextObj.cs +++ /dev/null @@ -1,447 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Collections; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// A class that represents a text object on the graph. A list of - /// objects is maintained by the - /// collection class. - /// - /// - /// John Champion - /// $Revision: 3.4 $ $Date: 2007-01-25 07:56:09 $ - [Serializable] - public class TextObj : GraphObj, ICloneable, ISerializable - { - #region Fields - /// Private field to store the actual text string for this - /// . Use the public property - /// to access this value. - /// - private string _text; - /// - /// Private field to store the class used to render - /// this . Use the public property - /// to access this class. - /// - private FontSpec _fontSpec; - - /* - /// - /// Private field to indicate whether this is to be - /// wrapped when rendered. Wrapping is to be done within . - /// Use the public property - /// to access this value. - /// - private bool isWrapped; - */ - - /// - /// Private field holding the SizeF into which this - /// should be rendered. Use the public property - /// to access this value. - /// - private SizeF _layoutArea; - - - #endregion - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - new public struct Default - { - /* - /// - /// The default wrapped flag for rendering this . - /// - public static bool IsWrapped = false ; - /// - /// The default RectangleF for rendering this - /// - public static SizeF WrappedSize = new SizeF( 0,0 ); - */ - - /// - /// The default font family for the text - /// ( property). - /// - public static string FontFamily = "Arial"; - /// - /// The default font size for the text - /// ( property). Units are - /// in points (1/72 inch). - /// - public static float FontSize = 12.0F; - /// - /// The default font color for the text - /// ( property). - /// - public static Color FontColor = Color.Black; - /// - /// The default font bold mode for the text - /// ( property). true - /// for a bold typeface, false otherwise. - /// - public static bool FontBold = false; - /// - /// The default font underline mode for the text - /// ( property). true - /// for an underlined typeface, false otherwise. - /// - public static bool FontUnderline = false; - /// - /// The default font italic mode for the text - /// ( property). true - /// for an italic typeface, false otherwise. - /// - public static bool FontItalic = false; - } - #endregion - - #region Properties - - /* - /// - /// - /// - internal bool IsWrapped - { - get { return (this.isWrapped); } - set { this.isWrapped = value; } - } - */ - - /// - /// - /// - public SizeF LayoutArea - { - get { return _layoutArea; } - set { _layoutArea = value; } - } - - - /// - /// The to be displayed. This text can be multi-line by - /// including newline ('\n') characters between the lines. - /// - public string Text - { - get { return _text; } - set { _text = value; } - } - /// - /// Gets a reference to the class used to render - /// this - /// - /// - /// - /// - /// - /// - /// - public FontSpec FontSpec - { - get { return _fontSpec; } - set - { - if ( value == null ) - throw new ArgumentNullException( "Uninitialized FontSpec in TextObj" ); - _fontSpec = value; - } - } - #endregion - - #region Constructors - /// - /// Constructor that sets all properties to default - /// values as defined in the class. - /// - /// The text to be displayed. - /// The x position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - /// The y position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - public TextObj( string text, double x, double y ) - : base( x, y ) - { - Init( text ); - } - - private void Init( string text ) - { - if ( text != null ) - _text = text; - else - text = "Text"; - - _fontSpec = new FontSpec( - Default.FontFamily, Default.FontSize, - Default.FontColor, Default.FontBold, - Default.FontItalic, Default.FontUnderline ); - - //this.isWrapped = Default.IsWrapped ; - _layoutArea = new SizeF( 0, 0 ); - } - - /// - /// Constructor that sets all properties to default - /// values as defined in the class. - /// - /// The text to be displayed. - /// The x position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - /// The y position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - /// The enum value that - /// indicates what type of coordinate system the x and y parameters are - /// referenced to. - public TextObj( string text, double x, double y, CoordType coordType ) - : base( x, y, coordType ) - { - Init( text ); - } - - /// - /// Constructor that sets all properties to default - /// values as defined in the class. - /// - /// The text to be displayed. - /// The x position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - /// The y position of the text. The units - /// of this position are specified by the - /// property. The text will be - /// aligned to this position based on the - /// property. - /// The enum value that - /// indicates what type of coordinate system the x and y parameters are - /// referenced to. - /// The enum that specifies - /// the horizontal alignment of the object with respect to the (x,y) location - /// The enum that specifies - /// the vertical alignment of the object with respect to the (x,y) location - public TextObj( string text, double x, double y, CoordType coordType, AlignH alignH, AlignV alignV ) - : base( x, y, coordType, alignH, alignV ) - { - Init( text ); - } - - /// - /// Parameterless constructor that initializes a new . - /// - public TextObj() : base( 0, 0 ) - { - Init( "" ); - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public TextObj( TextObj rhs ) : base( rhs ) - { - _text = rhs.Text; - _fontSpec = new FontSpec( rhs.FontSpec ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public TextObj Clone() - { - return new TextObj( this ); - } - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected TextObj( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - _text = info.GetString( "text" ); - _fontSpec = (FontSpec) info.GetValue( "fontSpec", typeof(FontSpec) ); - //isWrapped = info.GetBoolean ("isWrapped") ; - _layoutArea = (SizeF) info.GetValue( "layoutArea", typeof(SizeF) ); - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - info.AddValue( "text", _text ); - info.AddValue( "fontSpec", _fontSpec ); - //info.AddValue( "isWrapped", isWrapped ); - info.AddValue( "layoutArea", _layoutArea ); - } - #endregion - - #region Rendering Methods - /// - /// Render this object to the specified device - /// This method is normally only called by the Draw method - /// of the parent collection object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void Draw( Graphics g, PaneBase pane, float scaleFactor ) - { - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - PointF pix = _location.Transform( pane ); - - // Draw the text on the screen, including any frame and background - // fill elements - if ( pix.X > -100000 && pix.X < 100000 && pix.Y > -100000 && pix.Y < 100000 ) - { - //if ( this.layoutSize.IsEmpty ) - // this.FontSpec.Draw( g, pane.IsPenWidthScaled, this.text, pix.X, pix.Y, - // this.location.AlignH, this.location.AlignV, scaleFactor ); - //else - this.FontSpec.Draw( g, pane, _text, pix.X, pix.Y, - _location.AlignH, _location.AlignV, scaleFactor, _layoutArea ); - - } - } - - /// - /// Determine if the specified screen point lies inside the bounding box of this - /// . This method takes into account rotation and alignment - /// parameters of the text, as specified in the . - /// - /// The screen point, in pixels - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// true if the point lies in the bounding box, false otherwise - override public bool PointInBox( PointF pt, PaneBase pane, Graphics g, float scaleFactor ) - { - if ( ! base.PointInBox(pt, pane, g, scaleFactor ) ) - return false; - - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - PointF pix = _location.Transform( pane ); - - return _fontSpec.PointInBox( pt, g, _text, pix.X, pix.Y, - _location.AlignH, _location.AlignV, scaleFactor, this.LayoutArea ); - } - - /// - /// Determines the shape type and Coords values for this GraphObj - /// - override public void GetCoords( PaneBase pane, Graphics g, float scaleFactor, - out string shape, out string coords ) - { - // transform the x,y location from the user-defined - // coordinate frame to the screen pixel location - PointF pix = _location.Transform( pane ); - - PointF[] pts = _fontSpec.GetBox( g, _text, pix.X, pix.Y, _location.AlignH, - _location.AlignV, scaleFactor, new SizeF() ); - - shape = "poly"; - coords = String.Format( "{0:f0},{1:f0},{2:f0},{3:f0},{4:f0},{5:f0},{6:f0},{7:f0},", - pts[0].X, pts[0].Y, pts[1].X, pts[1].Y, - pts[2].X, pts[2].Y, pts[3].X, pts[3].Y ); - } - - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/TextScale.cs b/SDK/ZedGraphs/ZedGraph/TextScale.cs deleted file mode 100644 index 6b06c25..0000000 --- a/SDK/ZedGraphs/ZedGraph/TextScale.cs +++ /dev/null @@ -1,328 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Collections; -using System.Text; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// The TextScale class inherits from the class, and implements - /// the features specific to . - /// - /// - /// TextScale is an ordinal axis with user-defined text labels. An ordinal axis means that - /// all data points are evenly spaced at integral values, and the actual coordinate values - /// for points corresponding to that axis are ignored. That is, if the X axis is an - /// ordinal type, then all X values associated with the curves are ignored. - /// - /// - /// John Champion - /// $Revision: 1.8 $ $Date: 2006-08-25 05:19:09 $ - [Serializable] - class TextScale : Scale, ISerializable //, ICloneable - { - - #region constructors - - public TextScale( Axis owner ) - : base( owner ) - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - /// The object that will own the - /// new instance of - public TextScale( Scale rhs, Axis owner ) - : base( rhs, owner ) - { - } - - /// - /// Create a new clone of the current item, with a new owner assignment - /// - /// The new instance that will be - /// the owner of the new Scale - /// A new clone. - public override Scale Clone( Axis owner ) - { - return new TextScale( this, owner ); - } - - #endregion - - #region properties - - public override AxisType Type - { - get { return AxisType.Text; } - } - - #endregion - - #region methods - - /// - /// Internal routine to determine the ordinals of the first minor tic mark - /// - /// - /// The value of the first major tic for the axis. - /// - /// - /// The ordinal position of the first minor tic, relative to the first major tic. - /// This value can be negative (e.g., -3 means the first minor tic is 3 minor step - /// increments before the first major tic. - /// - override internal int CalcMinorStart( double baseVal ) - { - // This should never happen (no minor tics for text labels) - return 0; - } - - /// - /// Determine the value for the first major tic. - /// - /// - /// This is done by finding the first possible value that is an integral multiple of - /// the step size, taking into account the date/time units if appropriate. - /// This method properly accounts for , , - /// and other axis format settings. - /// - /// - /// First major tic value (floating point double). - /// - override internal double CalcBaseTic() - { - if ( _baseTic != PointPair.Missing ) - return _baseTic; - else - return 1.0; - - } - - /// - /// Internal routine to determine the ordinals of the first and last major axis label. - /// - /// - /// This is the total number of major tics for this axis. - /// - override internal int CalcNumTics() - { - int nTics = 1; - - // If no array of labels is available, just assume 10 labels so we don't blow up. - if ( _textLabels == null ) - nTics = 10; - else - nTics = _textLabels.Length; - - if ( nTics < 1 ) - nTics = 1; - else if ( nTics > 1000 ) - nTics = 1000; - - return nTics; - } - - /// - /// Select a reasonable text axis scale given a range of data values. - /// - /// - /// This method only applies to type axes, and it - /// is called by the general method. This is an ordinal - /// type, such that the labeled values start at 1.0 and increment by 1.0 for - /// each successive label. The maximum number of labels on the graph is - /// determined by . If necessary, this method will - /// set the value to greater than 1.0 in order to keep the total - /// labels displayed below . For example, a - /// size of 2.0 would only display every other label on the - /// axis. The value calculated by this routine is always - /// an integral value. This - /// method honors the , , - /// and autorange settings. - /// In the event that any of the autorange settings are false, the - /// corresponding , , or - /// setting is explicitly honored, and the remaining autorange settings (if any) will - /// be calculated to accomodate the non-autoranged values. - /// On Exit: - /// is set to scale minimum (if = true) - /// is set to scale maximum (if = true) - /// is set to scale step size (if = true) - /// is set to scale minor step size (if = true) - /// is set to a magnitude multiplier according to the data - /// is set to the display format for the values (this controls the - /// number of decimal places, whether there are thousands separators, currency types, etc.) - /// - /// A reference to the object - /// associated with this - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - /// - /// - override public void PickScale( GraphPane pane, Graphics g, float scaleFactor ) - { - // call the base class first - base.PickScale( pane, g, scaleFactor ); - - // if text labels are provided, then autorange to the number of labels - if ( _textLabels != null ) - { - if ( _minAuto ) - _min = 0.5; - if ( _maxAuto ) - _max = _textLabels.Length + 0.5; - } - else - { - if ( _minAuto ) - _min -= 0.5; - if ( _maxAuto ) - _max += 0.5; - } - // Test for trivial condition of range = 0 and pick a suitable default - if ( _max - _min < .1 ) - { - if ( _maxAuto ) - _max = _min + 10.0; - else - _min = _max - 10.0; - } - - if ( _majorStepAuto ) - { - if ( !_isPreventLabelOverlap ) - { - _majorStep = 1; - } - else if ( _textLabels != null ) - { - // Calculate the maximum number of labels - double maxLabels = (double) this.CalcMaxLabels( g, pane, scaleFactor ); - - // Calculate a step size based on the width of the labels - double tmpStep = Math.Ceiling( ( _max - _min ) / maxLabels ); - - // Use the lesser of the two step sizes - //if ( tmpStep < this.majorStep ) - _majorStep = tmpStep; - } - else - _majorStep = (int) ( ( _max - _min - 1.0 ) / Default.MaxTextLabels ) + 1.0; - - } - else - { - _majorStep = (int) _majorStep; - if ( _majorStep <= 0 ) - _majorStep = 1.0; - } - - if ( _minorStepAuto ) - { - _minorStep = _majorStep / 10; - - //_minorStep = CalcStepSize( _majorStep, 10 ); - if ( _minorStep < 1 ) - _minorStep = 1; - } - - _mag = 0; - } - - /// - /// Make a value label for an . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The zero-based, ordinal index of the label to be generated. For example, a value of 2 would - /// cause the third value label on the axis to be generated. - /// - /// - /// The numeric value associated with the label. This value is ignored for log () - /// and text () type axes. - /// - /// The resulting value label as a - override internal string MakeLabel( GraphPane pane, int index, double dVal ) - { - if ( _format == null ) - _format = Scale.Default.Format; - - index *= (int) _majorStep; - if ( _textLabels == null || index < 0 || index >= _textLabels.Length ) - return string.Empty; - else - return _textLabels[index]; - } - - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected TextScale( SerializationInfo info, StreamingContext context ) : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Types.cs b/SDK/ZedGraphs/ZedGraph/Types.cs deleted file mode 100644 index fe28e7c..0000000 --- a/SDK/ZedGraphs/ZedGraph/Types.cs +++ /dev/null @@ -1,868 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; - - -namespace ZedGraph -{ - /// - /// Enumeration type for the various axis types that are available - /// - /// - public enum AxisType - { - /// An ordinary, cartesian axis - Linear, - /// A base 10 log axis - Log, - /// A cartesian axis with calendar dates or times - Date, - /// An ordinal axis with user-defined text labels. An ordinal axis means that - /// all data points are evenly spaced at integral values, and the actual coordinate values - /// for points corresponding to that axis are ignored. That is, if the X axis is an - /// ordinal type, then all X values associated with the curves are ignored. - /// - /// - /// - Text, - /// An ordinal axis with regular numeric labels. An ordinal axis means that - /// all data points are evenly spaced at integral values, and the actual coordinate values - /// for points corresponding to that axis are ignored. That is, if the X axis is an - /// ordinal type, then all X values associated with the curves are ignored. - /// - /// - Ordinal, - /// An ordinal axis that will have labels formatted with ordinal values corresponding - /// to the number of values in each . - /// - /// - /// The data points will be evenly-spaced at ordinal locations, and the - /// actual data values are ignored. - /// - /// - DateAsOrdinal, - /// An ordinal axis that will have labels formatted with values from the actual data - /// values of the first in the . - /// - /// - /// Although the tics are labeled with real data values, the actual points will be - /// evenly-spaced in spite of the data values. For example, if the X values of the first curve - /// are 1, 5, and 100, then the tic labels will show 1, 5, and 100, but they will be equal - /// distance from each other. - /// - /// - LinearAsOrdinal, - /// An exponential axis - Exponent - } - - /// - /// Enumeration type for the various types of fills that can be used with - /// charts. - /// - public enum FillType - { - /// No fill - None, - /// A solid fill using - Solid, - /// A custom fill using either or - /// - Brush, - /// - /// Fill with a single solid color based on the X value of the data. - /// The X value is - /// used to determine the color value based on a gradient brush, and using a data range - /// of and . You can create a multicolor - /// range by initializing the class with your own custom - /// object based on a . In cases where a - /// data value makes no sense (, , - /// etc.), a default value of 50% of the range is assumed. The default range is 0 to 1. - /// - /// - /// - /// - GradientByX, - /// - /// Fill with a single solid color based on the Z value of the data. - /// The Z value is - /// used to determine the color value based on a gradient brush, and using a data range - /// of and . You can create a multicolor - /// range by initializing the class with your own custom - /// object based on a . In cases where a - /// data value makes no sense (, , - /// etc.), a default value of 50% of the range is assumed. The default range is 0 to 1. - /// - /// - /// - /// - GradientByY, - /// - /// Fill with a single solid color based on the Z value of the data. - /// The Z value is - /// used to determine the color value based on a gradient brush, and using a data range - /// of and . You can create a multicolor - /// range by initializing the class with your own custom - /// object based on a . In cases where a - /// data value makes no sense (, , - /// etc.), a default value of 50% of the range is assumed. The default range is 0 to 1. - /// - /// - /// - /// - GradientByZ, - /// - /// Fill with a single solid color based on the "ColorValue" property of the data. - /// The "ColorValue" property is - /// used to determine the color value based on a gradient brush, and using a data range - /// of and . You can create a multicolor - /// range by initializing the class with your own custom - /// object based on a . In cases where a - /// data value makes no sense (, , - /// etc.), a default value of 50% of the range is assumed. The default range is 0 to 1. - /// - /// - /// - /// - GradientByColorValue - - } - - /// - /// Enumeration type for the various axis date and time unit types that are available - /// - public enum DateUnit - { - /// Yearly units and - /// - Year, - /// Monthly units and - /// - Month, - /// Daily units and - /// - Day, - /// Hourly units and - /// - Hour, - /// Minute units and - /// - Minute, - /// Second units and - /// - Second, - /// Millisecond units and - /// - Millisecond - } - - /// - /// Enumeration type for the various symbol shapes that are available - /// - /// - public enum SymbolType - { - /// Square-shaped - Square, - /// Rhombus-shaped - Diamond, - /// Equilateral triangle - Triangle, - /// Uniform circle - Circle, - /// "X" shaped . This symbol cannot - /// be filled since it has no outline. - XCross, - /// "+" shaped . This symbol cannot - /// be filled since it has no outline. - Plus, - /// Asterisk-shaped . This symbol - /// cannot be filled since it has no outline. - Star, - /// Unilateral triangle , pointing - /// down. - TriangleDown, - /// - /// Horizontal dash . This symbol cannot be - /// filled since it has no outline. - /// - HDash, - /// - /// Vertical dash . This symbol cannot be - /// filled since it has no outline. - /// - VDash, - /// A symbol defined by the propery. - /// If no symbol is defined, the . symbol will - /// be used. - /// - UserDefined, - /// A Default symbol type (the symbol type will be obtained - /// from . - Default, - /// No symbol is shown (this is equivalent to using - /// = false. - None - } - - /// - /// Enumeration type that defines the possible legend locations - /// - /// - public enum LegendPos - { - /// - /// Locate the above the - /// - Top, - /// - /// Locate the on the left side of the - /// - Left, - /// - /// Locate the on the right side of the - /// - Right, - /// - /// Locate the below the - /// - Bottom, - /// - /// Locate the inside the in the - /// top-left corner. - /// - InsideTopLeft, - /// - /// Locate the inside the in the - /// top-right corner. - /// - InsideTopRight, - /// - /// Locate the inside the in the - /// bottom-left corner. - /// - InsideBotLeft, - /// - /// Locate the inside the in the - /// bottom-right corner. - /// - InsideBotRight, - /// - /// Locate the as a floating object above the graph at the - /// location specified by . - /// - Float, - /// - /// Locate the centered above the - /// - TopCenter, - /// - /// Locate the centered below the - /// - BottomCenter, - /// - /// Locate the above the , but flush - /// against the left margin of the . - /// - TopFlushLeft, - /// - /// Locate the below the , but flush - /// against the left margin of the . - /// - BottomFlushLeft - - } - - /// - /// Enumeration type for the different horizontal text alignment options - /// - /// - public enum AlignH - { - /// - /// Position the text so that its left edge is aligned with the - /// specified X,Y location. Used by the - /// method. - /// - Left, - /// - /// Position the text so that its center is aligned (horizontally) with the - /// specified X,Y location. Used by the - /// method. - /// - Center, - /// - /// Position the text so that its right edge is aligned with the - /// specified X,Y location. Used by the - /// method. - /// - Right - } - - /// - /// Enumeration type for the different proximal alignment options - /// - /// - /// - public enum AlignP - { - /// - /// Position the text so that its "inside" edge (the edge that is - /// nearest to the alignment reference point or object) is aligned. - /// Used by the method to align text - /// to the axis. - /// - Inside, - /// - /// Position the text so that its center is aligned with the - /// reference object or point. - /// Used by the method to align text - /// to the axis. - /// - Center, - /// - /// Position the text so that its right edge (the edge that is - /// farthest from the alignment reference point or object) is aligned. - /// Used by the method to align text - /// to the axis. - /// - Outside - } - - /// - /// Enumeration type for the different vertical text alignment options - /// - /// specified X,Y location. Used by the - /// method. - public enum AlignV - { - /// - /// Position the text so that its top edge is aligned with the - /// specified X,Y location. Used by the - /// method. - /// - Top, - /// - /// Position the text so that its center is aligned (vertically) with the - /// specified X,Y location. Used by the - /// method. - /// - Center, - /// - /// Position the text so that its bottom edge is aligned with the - /// specified X,Y location. Used by the - /// method. - /// - Bottom - } - - /// - /// Enumeration type for the user-defined coordinate types available. - /// These coordinate types are used the objects - /// and objects only. - /// - /// - public enum CoordType - { - /// - /// Coordinates are specified as a fraction of the - /// . That is, for the X coordinate, 0.0 - /// is at the left edge of the ChartRect and 1.0 - /// is at the right edge of the ChartRect. A value less - /// than zero is left of the ChartRect and a value - /// greater than 1.0 is right of the ChartRect. For the Y coordinate, 0.0 - /// is the top and 1.0 is the bottom. - /// - ChartFraction, - /// - /// Coordinates are specified as a fraction of the - /// . That is, for the X coordinate, 0.0 - /// is at the left edge of the Rect and 1.0 - /// is at the right edge of the Rect. A value less - /// than zero is left of the Rect and a value - /// greater than 1.0 is right of the Rect. For the Y coordinate, 0.0 - /// is the top and 1.0 is the bottom. Note that - /// any value less than zero or greater than 1.0 will be outside - /// the Rect, and therefore clipped. - /// - PaneFraction, - /// - /// Coordinates are specified according to the user axis scales - /// for the and . - /// - AxisXYScale, - /// - /// Coordinates are specified according to the user axis scales - /// for the and . - /// - AxisXY2Scale, - /// - /// The X coordinate is specified as a fraction of the , - /// and the Y coordinate is specified as a fraction of the . - /// - /// - /// For the X coordinate, 0.0 - /// is at the left edge of the ChartRect and 1.0 - /// is at the right edge of the ChartRect. A value less - /// than zero is left of the ChartRect and a value - /// greater than 1.0 is right of the ChartRect. For the Y coordinate, a value of zero is at - /// the left side of the pane, and a value of 1.0 is at the right side of the pane. - /// - XChartFractionYPaneFraction, - /// - /// The X coordinate is specified as a fraction of the , - /// and the Y coordinate is specified as a fraction of the . - /// - /// - /// For the X coordinate, a value of zero is at - /// the left side of the pane, and a value of 1.0 is at the right side of the pane. - /// For the Y coordinate, 0.0 - /// is at the top edge of the ChartRect and 1.0 - /// is at the bottom edge of the ChartRect. A value less - /// than zero is above the ChartRect and a value - /// greater than 1.0 is below the ChartRect. - /// - XPaneFractionYChartFraction, - /// - /// The X coordinate is specified as an X Scale value, and the Y coordinate - /// is specified as a fraction of the . - /// - /// - /// For the X coordinate, the value just corresponds to the values of the X scale. - /// Values outside the scale range will be - /// outside the . For the Y coordinate, 0.0 - /// is at the top edge of the ChartRect and 1.0 - /// is at the bottom edge of the ChartRect. A value less - /// than zero is above the ChartRect and a value - /// greater than 1.0 is below the ChartRect. - /// - XScaleYChartFraction, - /// - /// The X coordinate is specified as a fraction of the - /// and the Y coordinate is specified as - /// a Y scale value. - /// - /// - /// For the X coordinate, 0.0 - /// is at the left edge of the ChartRect and 1.0 - /// is at the right edge of the ChartRect. A value less - /// than zero is left of the ChartRect and a value - /// greater than 1.0 is right of the ChartRect. For the Y coordinate, the value just - /// corresponds to the values of the Y scale. Values outside the scale range will be - /// outside the . - /// - XChartFractionYScale, - /// - /// The X coordinate is specified as a fraction of the - /// and the Y coordinate is specified as - /// a Y2 scale value. - /// - /// - /// For the X coordinate, 0.0 - /// is at the left edge of the ChartRect and 1.0 - /// is at the right edge of the ChartRect. A value less - /// than zero is left of the ChartRect and a value - /// greater than 1.0 is right of the ChartRect. For the Y coordinate, the value just - /// corresponds to the values of the Y2 scale. Values outside the scale range will be - /// outside the . - /// - XChartFractionY2Scale - - } - - /// - /// Enumeration type that defines how a curve is drawn. Curves can be drawn - /// as ordinary lines by connecting the points directly, or in a stair-step - /// fashion as a series of discrete, constant values. In a stair step plot, - /// all lines segments are either horizontal or vertical. In a non-step (line) - /// plot, the lines can be any angle. - /// - /// - public enum StepType - { - /// - /// Draw the as a stair-step in which each - /// point defines the - /// beginning (left side) of a new stair. This implies the points are - /// defined at the beginning of an "event." - /// - ForwardStep, - /// - /// Draw the as a stair-step in which each - /// point defines the end (right side) of a new stair. This implies - /// the points are defined at the end of an "event." - /// - RearwardStep, - /// - /// Draw the as an ordinary line, in which the - /// points are connected directly by line segments. - /// - NonStep, - /// - /// Draw the as a segment in which each point defines the - /// beginning (left side) of a new "stair." This implies the points are defined - /// at the beginning of an "event." Note that ForwardSegment is different - /// from ForwardStep in that it does not draw the vertical portion of the step. - /// - ForwardSegment, - /// - /// Draw the as a segment in which each point defines the - /// end (right side) of a new "stair." This implies the points are defined - /// at the end of an "event." Note that RearwardSegment is different - /// from RearwardStep in that it does not draw the vertical portion of the step. - /// - RearwardSegment - } - - /// - /// Enumeration type that defines the base axis from which graphs - /// are displayed. The bars can be drawn on any of the four axes (, - /// , , and ). - /// - /// - public enum BarBase - { - /// - /// Draw the chart based from the . - /// - X, - /// - /// Draw the chart based from the . - /// - X2, - /// - /// Draw the chart based from the . - /// - Y, - /// - /// Draw the chart based from the . - /// - Y2 - } - - /// - /// Enumeration type that defines the available types of graphs. - /// - /// - public enum LineType - { - /// - /// Draw the lines as normal. Any fill area goes from each line down to the X Axis. - /// - Normal, - /// - /// Draw the lines stacked on top of each other, accumulating values to a total value. - /// - Stack - } - - /// - /// Enumeration type that defines the available types of graphs. - /// - /// - public enum BarType - { - /// - /// Draw each side by side in clusters. - /// - Cluster, - /// - /// Draw the bars one on top of the other. The bars will - /// be drawn such that the last bar in the will be behind - /// all other bars. Note that the bar values are not summed up for the overlay - /// mode. The data values must be summed before being passed - /// to . - /// For example, if the first bar of - /// the first has a value of 100, and the first bar of - /// the second has a value of 120, then that bar will - /// appear to be 20 units on top of the first bar. - /// - Overlay, - /// - /// Draw the bars one on top of the other. The bars will - /// be drawn such that the bars are sorted according to the maximum value, with - /// the tallest bar at each point at the back and the shortest bar at the front. - /// This is similar to the mode, but the bars are sorted at - /// each base value. - /// The data values must be summed before being passed - /// to . For example, if the first bar of - /// the first has a value of 100, and the first bar of - /// the second has a value of 120, then that bar will - /// appear to be 20 units on top of the first bar. - /// - SortedOverlay, - /// - /// Draw the bars in an additive format so that they stack on - /// top of one another. The value of the last bar drawn will be the sum of the values - /// of all prior bars. - /// - Stack, - /// - /// Draw the bars in a format whereby the height of each - /// represents the percentage of the total each one represents. Negative values - ///are displayed below the zero line as percentages of the absolute total of all values. - /// - PercentStack - } - - /// - /// Enumeration type that defines which set of data points - X or Y - is used - /// to perform the sort. - /// - public enum SortType - { - /// - /// Use the Y values to sort the list. - /// - YValues, - /// - /// Use the X values to sort the list. - /// - XValues - }; - - /// - /// Enumeration that specifies a Z-Order position for - /// objects. - /// - /// This enumeration allows you to set the layering of various graph - /// features. Except for the objects, other feature types - /// all have a fixed depth as follows (front to back): - /// - /// objects - /// The border around - /// objects - /// The features - /// The background fill of the - /// The pane - /// The background fill of the - /// - /// You cannot place anything behind the - /// background fill, but allows you to - /// explicitly control the depth of objects - /// between all other object types. For items of equal , - /// such as multiple 's or 's - /// having the same value, the relative depth is - /// controlled by the ordinal position in the list (either - /// or ). - /// objects - /// can be placed in the of either a - /// or a . For a - /// -based , all - /// values are applicable. For a -based - /// , any value can be used, but there - /// are really only three depths: - /// will place the item behind the pane title, - /// will place on top of all other graph features, - /// any other value places the object above the pane title, but behind the 's. - /// - /// - public enum ZOrder - { - /// - /// Specifies that the will be behind all other - /// objects (including the ). - /// - H_BehindAll, - /// - /// Specifies that the will be behind the - /// background - /// (see ). - /// - G_BehindChartFill, - /// - /// Specifies that the will be behind the grid lines. - /// - F_BehindGrid, - /// - /// Specifies that the will be behind the - /// objects. - /// - E_BehindCurves, - /// - /// Specifies that the will be behind the - /// objects. - /// - D_BehindAxis, - /// - /// Specifies that the will be behind the - /// border. - /// - C_BehindChartBorder, - /// - /// Specifies that the will be behind the - /// object. - /// - B_BehindLegend, - /// - /// Specifies that the will be in front of - /// all other objects, except for the other - /// objects that have the same and are before - /// this object in the . - /// - A_InFront - } - - /// - /// Enumeration that determines the type of label that is displayed for each pie slice - /// (see ). - /// - public enum PieLabelType - { - /// - /// Displays and for - /// a slice in a Pie Chart. - /// - Name_Value, - - /// - /// Displays and (as % of total) for - /// a slice in a Pie Chart. - /// - Name_Percent, - - /// - /// Displays a containing the both - /// as an absolute number and as percentage of the total. - /// - Name_Value_Percent, - - /// - /// Displays for - /// a slice in a Pie Chart. - /// - Value, - - /// - /// Displays (as % of total) for - /// a slice in a Pie Chart. - /// - Percent, - - /// - /// Displays for a slice in a Pie Chart. - /// - Name, - - /// - ///No label displayed. - /// - None - } - - /// - /// Define the auto layout options for the - /// method. - /// - public enum PaneLayout - { - /// - /// Layout the 's so they are in a square grid (always 2x2, 3x3, 4x4), - /// leaving blank spaces as required. - /// - /// For example, a single pane would generate a 1x1 grid, between 2 and 4 panes would generate - /// a 2x2 grid, 5 to 9 panes would generate a 3x3 grid. - ForceSquare, - /// - /// Layout the 's so they are in a general square (2x2, 3x3, etc.), but use extra - /// columns when necessary (row x column = 1x2, 2x3, 3x4, etc.) depending on the total number - /// of panes required. - /// - /// For example, a 2x2 grid has four panes and a 3x3 grid has 9 panes. If there are - /// 6 panes required, then this option will eliminate a row (column preferred) to make a - /// 2 row x 3 column grid. With 7 panes, it will make a 3x3 grid with 2 empty spaces. - SquareColPreferred, - /// - /// Layout the 's so they are in a general square (2x2, 3x3, etc.), but use extra - /// rows when necessary (2x1, 3x2, 4x3, etc.) depending on the total number of panes required. - /// - /// For example, a 2x2 grid has four panes and a 3x3 grid has 9 panes. If there are - /// 6 panes required, then this option will eliminate a column (row preferred) to make a - /// 3 row x 2 column grid. With 7 panes, it will make a 3x3 grid with 2 empty spaces. - SquareRowPreferred, - /// - /// Layout the 's in a single row - /// - SingleRow, - /// - /// Layout the 's in a single column - /// - SingleColumn, - /// - /// Layout the 's with an explicit number of columns: The first row has - /// 1 column and the second row has 2 columns for a total of 3 panes. - /// - ExplicitCol12, - /// - /// Layout the 's with an explicit number of columns: The first row has - /// 2 columns and the second row has 1 column for a total of 3 panes. - /// - ExplicitCol21, - /// - /// Layout the 's with an explicit number of columns: The first row has - /// 2 columns and the second row has 3 columns for a total of 5 panes. - /// - ExplicitCol23, - /// - /// Layout the 's with an explicit number of columns: The first row has - /// 3 columns and the second row has 2 columns for a total of 5 panes. - /// - ExplicitCol32, - /// - /// Layout the 's with an explicit number of rows: The first column has - /// 1 row and the second column has 2 rows for a total of 3 panes. - /// - ExplicitRow12, - /// - /// Layout the 's with an explicit number of rows: The first column has - /// 2 rows and the second column has 1 row for a total of 3 panes. - /// - ExplicitRow21, - /// - /// Layout the 's with an explicit number of rows: The first column has - /// 2 rows and the second column has 3 rows for a total of 5 panes. - /// - ExplicitRow23, - /// - /// Layout the 's with an explicit number of rows: The first column has - /// 3 rows and the second column has 2 rows for a total of 5 panes. - /// - ExplicitRow32 - } - - /// - /// Enum for specifying the type of data to be returned by the ZedGraphWeb Render() method. - /// - public enum RenderModeType - { - /// - /// Renders as an IMG tag referencing a local generated image. ContentType stays text. - /// - ImageTag, - /// - /// Renders the binary image. ContentType is changed accordingly. - /// - RawImage - } - - -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ValueHandler.cs b/SDK/ZedGraphs/ZedGraph/ValueHandler.cs deleted file mode 100644 index facd696..0000000 --- a/SDK/ZedGraphs/ZedGraph/ValueHandler.cs +++ /dev/null @@ -1,372 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= -using System; -using System.Text; -using System.Drawing; - -namespace ZedGraph -{ - /// - /// A class designed to simplify the process of getting the actual value for - /// the various stacked and regular curve types - /// - /// - /// John Champion - /// $Revision: 3.21 $ $Date: 2008-12-02 12:55:34 $ - public class ValueHandler - { - private GraphPane _pane; - - /// - /// Basic constructor that saves a reference to the parent - /// object. - /// - /// The parent object. - /// A flag to indicate whether or - /// not the drawing variables should be initialized. Initialization is not - /// required if this is part of a ZedGraph internal draw operation (i.e., its in - /// the middle of a call to ). Otherwise, you should - /// initialize to make sure the drawing variables are configured. true to do - /// an initialization, false otherwise. - public ValueHandler( GraphPane pane, bool initialize ) - { - _pane = pane; - if ( initialize ) - { - // just create a dummy image, which results in a full draw operation - using ( Image image = pane.GetImage() ) - { - } - } - } - - /// - /// Get the user scale values associate with a particular point of a - /// particular curve. - /// The main purpose of this method is to handle - /// stacked bars, in which case the stacked values are returned rather - /// than the individual data values. - /// - /// A object of interest. - /// The zero-based point index for the point of interest. - /// A value representing the value - /// for the independent axis. - /// A value representing the lower - /// value for the dependent axis. - /// A value representing the upper - /// value for the dependent axis. - /// true if the data point is value, false for - /// , invalid, etc. data. - public bool GetValues( CurveItem curve, int iPt, out double baseVal, - out double lowVal, out double hiVal ) - { - return GetValues( _pane, curve, iPt, out baseVal, - out lowVal, out hiVal ); - } - - /// - /// Get the user scale values associate with a particular point of a - /// particular curve. - /// The main purpose of this method is to handle - /// stacked bars and lines, in which case the stacked values are returned rather - /// than the individual data values. However, this method works generically for any - /// curve type. - /// - /// The parent object. - /// A object of interest. - /// The zero-based point index for the point of interest. - /// A value representing the value - /// for the independent axis. - /// A value representing the lower - /// value for the dependent axis. - /// A value representing the upper - /// value for the dependent axis. - /// true if the data point is value, false for - /// , invalid, etc. data. - public static bool GetValues( GraphPane pane, CurveItem curve, int iPt, - out double baseVal, out double lowVal, out double hiVal ) - { - hiVal = PointPair.Missing; - lowVal = PointPair.Missing; - baseVal = PointPair.Missing; - - if ( curve == null || curve.Points.Count <= iPt || !curve.IsVisible ) - return false; - - Axis baseAxis = curve.BaseAxis( pane ); - Axis valueAxis = curve.ValueAxis( pane ); - - if ( baseAxis is XAxis || baseAxis is X2Axis ) - baseVal = curve.Points[iPt].X; - else - baseVal = curve.Points[iPt].Y; - - // is it a stacked bar type? - if ( curve is BarItem && ( pane._barSettings.Type == BarType.Stack || - pane._barSettings.Type == BarType.PercentStack ) ) - { - double positiveStack = 0; - double negativeStack = 0; - double curVal; - - // loop through all the curves, summing up the values to get a total (only - // for the current ordinal position iPt) - foreach ( CurveItem tmpCurve in pane.CurveList ) - { - // Sum the value for the current curve only if it is a bar - if ( tmpCurve.IsBar && tmpCurve.IsVisible ) - { - curVal = PointPair.Missing; - // For non-ordinal curves, find a matching base value (must match exactly) - if ( curve.IsOverrideOrdinal || !baseAxis._scale.IsAnyOrdinal ) - { - IPointList points = tmpCurve.Points; - - for ( int i=0; i= 0 ) - { - lowVal = positiveStack; - hiVal = ( curVal == PointPair.Missing || positiveStack == PointPair.Missing ) ? - PointPair.Missing : positiveStack + curVal; - } - // otherwise, use the negative stack - else - { - hiVal = negativeStack; - lowVal = ( curVal == PointPair.Missing || negativeStack == PointPair.Missing ) ? - PointPair.Missing : negativeStack + curVal; - } - } - - // Add all positive values to the positive stack, and negative values to the - // negative stack - if ( curVal >= 0 ) - positiveStack = ( curVal == PointPair.Missing || positiveStack == PointPair.Missing ) ? - PointPair.Missing : positiveStack + curVal; - else - negativeStack = ( curVal == PointPair.Missing || negativeStack == PointPair.Missing ) ? - PointPair.Missing : negativeStack + curVal; - } - } - - // if the curve is a PercentStack type, then calculate the percent for this bar - // based on the total height of the stack - if ( pane._barSettings.Type == BarType.PercentStack && - hiVal != PointPair.Missing && lowVal != PointPair.Missing ) - { - // Use the total magnitude of the positive plus negative bar stacks to determine - // the percentage value - positiveStack += Math.Abs( negativeStack ); - - // just to avoid dividing by zero... - if ( positiveStack != 0 ) - { - // calculate the percentage values - lowVal = lowVal / positiveStack * 100.0; - hiVal = hiVal / positiveStack * 100.0; - } - else - { - lowVal = 0; - hiVal = 0; - } - } - - if ( baseVal == PointPair.Missing || lowVal == PointPair.Missing || - hiVal == PointPair.Missing ) - return false; - else - return true; - } - // If the curve is a stacked line type, then sum up the values similar to the stacked bar type - else if ( curve is LineItem && pane.LineType == LineType.Stack ) - { - double stack = 0; - double curVal; - - // loop through all the curves, summing up the values to get a total (only - // for the current ordinal position iPt) - foreach ( CurveItem tmpCurve in pane.CurveList ) - { - // make sure the curve is a Line type - if ( tmpCurve is LineItem && tmpCurve.IsVisible ) - { - curVal = PointPair.Missing; - // For non-ordinal curves, find a matching base value (must match exactly) - if ( curve.IsOverrideOrdinal || !baseAxis._scale.IsAnyOrdinal ) - { - IPointList points = tmpCurve.Points; - - for ( int i = 0; i < points.Count; i++ ) - { - if ( points[i].X == baseVal ) - { - curVal = points[i].Y; - break; - } - } - } - // otherwise, it's an ordinal type so use the value at the same ordinal position - else if ( iPt < tmpCurve.Points.Count ) - { - // For line types, the Y axis is always the value axis - curVal = tmpCurve.Points[iPt].Y; - } - - // if the current value is missing, then the rest of the stack is missing - if ( curVal == PointPair.Missing ) - stack = PointPair.Missing; - - // if the current curve is the target curve, save the values - if ( tmpCurve == curve ) - { - lowVal = stack; -// if ( curVal < 0 && stack == 0 ) -// { -// stack = curVal; -// lowVal = curVal; -// hiVal = curVal; -// } -// else - hiVal = ( curVal == PointPair.Missing || stack == PointPair.Missing ) ? - PointPair.Missing : stack + curVal; - } - - // sum all the curves to a single total. This includes both positive and - // negative values (unlike the bar stack type). - stack = ( curVal == PointPair.Missing || stack == PointPair.Missing ) ? - PointPair.Missing : stack + curVal; - } - } - - if ( baseVal == PointPair.Missing || lowVal == PointPair.Missing || - hiVal == PointPair.Missing ) - return false; - else - return true; - } - // otherwise, the curve is not a stacked type (not a stacked bar or stacked line) - else - { - if ((!(curve is HiLowBarItem)) && (!(curve is ErrorBarItem))) - lowVal = 0; - else - lowVal = curve.Points[iPt].LowValue; - - if ( baseAxis is XAxis || baseAxis is X2Axis ) - hiVal = curve.Points[iPt].Y; - else - hiVal = curve.Points[iPt].X; - } - - // Special Exception: Bars on log scales should always plot from the Min value upwards, - // since they can never be zero - if ( curve is BarItem && valueAxis._scale.IsLog && lowVal == 0 ) - lowVal = valueAxis._scale._min; - - if ( baseVal == PointPair.Missing || hiVal == PointPair.Missing || - ( lowVal == PointPair.Missing && ( curve is ErrorBarItem || - curve is HiLowBarItem ) ) ) - return false; - else - return true; - } - - /// - /// Calculate the user scale position of the center of the specified bar, using the - /// as specified by . This method is - /// used primarily by the - /// method in order to - /// determine the bar "location," which is defined as the center of the top of the individual bar. - /// - /// The representing the - /// bar of interest. - /// The width of each individual bar. This can be calculated using - /// the method. - /// The cluster number for the bar of interest. This is the ordinal - /// position of the current point. That is, if a particular has - /// 10 points, then a value of 3 would indicate the 4th point in the data array. - /// The actual independent axis value for the bar of interest. - /// The ordinal position of the of interest. - /// That is, the first bar series is 0, the second is 1, etc. Note that this applies only - /// to the bars. If a graph includes both bars and lines, then count only the bars. - /// A user scale value position of the center of the bar of interest. - public double BarCenterValue( CurveItem curve, float barWidth, int iCluster, - double val, int iOrdinal ) - { - Axis baseAxis = curve.BaseAxis( _pane ); - if ( curve is ErrorBarItem || curve is HiLowBarItem || - curve is OHLCBarItem || curve is JapaneseCandleStickItem ) - { - if ( baseAxis._scale.IsAnyOrdinal && iCluster >= 0 && !curve.IsOverrideOrdinal ) - return (double) iCluster + 1.0; - else - return val; - } - else - { - float clusterWidth = _pane._barSettings.GetClusterWidth(); - float clusterGap = _pane._barSettings.MinClusterGap * barWidth; - float barGap = barWidth * _pane._barSettings.MinBarGap; - - if ( curve.IsBar && _pane._barSettings.Type != BarType.Cluster ) - iOrdinal = 0; - - float centerPix = baseAxis.Scale.Transform( curve.IsOverrideOrdinal, iCluster, val ) - - clusterWidth / 2.0F + clusterGap / 2.0F + - iOrdinal * ( barWidth + barGap ) + 0.5F * barWidth; - return baseAxis.Scale.ReverseTransform( centerPix ); - } - } - } -} diff --git a/SDK/ZedGraphs/ZedGraph/X2Axis.cs b/SDK/ZedGraphs/ZedGraph/X2Axis.cs deleted file mode 100644 index 0aa08d4..0000000 --- a/SDK/ZedGraphs/ZedGraph/X2Axis.cs +++ /dev/null @@ -1,260 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2007 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// inherits from , and defines the - /// special characteristics of a horizontal axis, specifically located at - /// the top of the of the - /// object - /// - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2007-04-16 00:03:07 $ - [Serializable] - public class X2Axis : Axis, ICloneable, ISerializable - { - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public new struct Default - { - // Default X2 Axis properties - /// - /// The default display mode for the - /// ( property). true to display the scale - /// values, title, tic marks, false to hide the axis entirely. - /// - public static bool IsVisible = false; - /// - /// Determines if a line will be drawn at the zero value for the - /// , that is, a line that - /// divides the negative values from positive values. - /// . - /// - public static bool IsZeroLine = false; - } - #endregion - - #region Constructors - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class - /// - public X2Axis() - : this( "X2 Axis" ) - { - } - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class, except - /// for the axis title - /// - /// The for this axis - public X2Axis( string title ) - : base( title ) - { - _isVisible = Default.IsVisible; - _majorGrid._isZeroLine = Default.IsZeroLine; - _scale._fontSpec.Angle = 180F; - _title._fontSpec.Angle = 180F; - } - - /// - /// The Copy Constructor - /// - /// The X2Axis object from which to copy - public X2Axis( X2Axis rhs ) - : base( rhs ) - { - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public X2Axis Clone() - { - return new X2Axis( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 11; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected X2Axis( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - #region Methods - /// - /// Setup the Transform Matrix to handle drawing of this - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void SetTransformMatrix( Graphics g, GraphPane pane, float scaleFactor ) - { - // Move the origin to the TopLeft of the ChartRect, which is the left - // side of the X2 axis (facing from the label side) - g.TranslateTransform( pane.Chart._rect.Right, pane.Chart._rect.Top ); - //g.ScaleTransform( 1.0f, -1.0f ); - // rotate so this axis is in the right-left direction - g.RotateTransform( 180 ); - } - - /// - /// Determines if this object is a "primary" one. - /// - /// - /// The primary axes are the (always), - /// the (always), the first - /// in the - /// ( = 0), and the first - /// in the - /// ( = 0). Note that - /// and - /// always reference the primary axes. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// true for a primary (for the , - /// this is always true), false otherwise - override internal bool IsPrimary( GraphPane pane ) - { - return this == pane.X2Axis; - } - - /// - /// Calculate the "shift" size, in pixels, in order to shift the axis from its default - /// location to the value specified by . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The shift amount measured in pixels - internal override float CalcCrossShift( GraphPane pane ) - { - double effCross = EffectiveCrossValue( pane ); - - if ( !_crossAuto ) - return pane.YAxis.Scale.Transform( effCross ) - pane.YAxis.Scale._maxPix; - else - return 0; - } - /* - override internal bool IsCrossed( GraphPane pane ) - { - return !this.crossAuto && this.cross > pane.YAxis.Min && this.cross < pane.YAxis.Max; - } - */ - /// - /// Gets the "Cross" axis that corresponds to this axis. - /// - /// - /// The cross axis is the axis which determines the of this Axis when the - /// Axis.Cross property is used. The - /// cross axis for any or - /// is always the primary , and - /// the cross axis for any or is - /// always the primary . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - override public Axis GetCrossAxis( GraphPane pane ) - { - return pane.YAxis; - } - - // override internal float GetMinPix( GraphPane pane ) - // { - // return pane.Chart._rect.Left; - // } - - #endregion - } -} - - - diff --git a/SDK/ZedGraphs/ZedGraph/XAxis.cs b/SDK/ZedGraphs/ZedGraph/XAxis.cs deleted file mode 100644 index f917947..0000000 --- a/SDK/ZedGraphs/ZedGraph/XAxis.cs +++ /dev/null @@ -1,255 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// inherits from , and defines the - /// special characteristics of a horizontal axis, specifically located at - /// the bottom of the of the - /// object - /// - /// - /// John Champion - /// $Revision: 3.16 $ $Date: 2007-04-16 00:03:02 $ - [Serializable] - public class XAxis : Axis, ICloneable, ISerializable - { - - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public new struct Default - { - // Default X Axis properties - /// - /// The default display mode for the - /// ( property). true to display the scale - /// values, title, tic marks, false to hide the axis entirely. - /// - public static bool IsVisible = true; - /// - /// Determines if a line will be drawn at the zero value for the - /// , that is, a line that - /// divides the negative values from positive values. - /// . - /// - public static bool IsZeroLine = false; - } - #endregion - - #region Constructors - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class - /// - public XAxis() - : this( "X Axis" ) - { - } - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class, except - /// for the axis title - /// - /// The for this axis - public XAxis( string title ) - : base( title ) - { - _isVisible = Default.IsVisible; - _majorGrid._isZeroLine = Default.IsZeroLine; - _scale._fontSpec.Angle = 0F; - } - - /// - /// The Copy Constructor - /// - /// The XAxis object from which to copy - public XAxis( XAxis rhs ) - : base( rhs ) - { - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public XAxis Clone() - { - return new XAxis( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected XAxis( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - #region Methods - /// - /// Setup the Transform Matrix to handle drawing of this - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void SetTransformMatrix( Graphics g, GraphPane pane, float scaleFactor ) - { - // Move the origin to the BottomLeft of the ChartRect, which is the left - // side of the X axis (facing from the label side) - g.TranslateTransform( pane.Chart._rect.Left, pane.Chart._rect.Bottom ); - } - - /// - /// Determines if this object is a "primary" one. - /// - /// - /// The primary axes are the (always), the first - /// in the - /// ( = 0), and the first - /// in the - /// ( = 0). Note that - /// and - /// always reference the primary axes. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// true for a primary (for the , - /// this is always true), false otherwise - override internal bool IsPrimary( GraphPane pane ) - { - return this == pane.XAxis; - } - - /// - /// Calculate the "shift" size, in pixels, in order to shift the axis from its default - /// location to the value specified by . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The shift amount measured in pixels - internal override float CalcCrossShift( GraphPane pane ) - { - double effCross = EffectiveCrossValue( pane ); - - if ( !_crossAuto ) - return pane.YAxis.Scale.Transform( effCross ) - pane.YAxis.Scale._maxPix; - else - return 0; - } - /* - override internal bool IsCrossed( GraphPane pane ) - { - return !this.crossAuto && this.cross > pane.YAxis.Min && this.cross < pane.YAxis.Max; - } - */ - /// - /// Gets the "Cross" axis that corresponds to this axis. - /// - /// - /// The cross axis is the axis which determines the of this Axis when the - /// Axis.Cross property is used. The - /// cross axis for any or - /// is always the primary , and - /// the cross axis for any or is - /// always the primary . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - override public Axis GetCrossAxis( GraphPane pane ) - { - return pane.YAxis; - } - -// override internal float GetMinPix( GraphPane pane ) -// { -// return pane.Chart._rect.Left; -// } - - #endregion - } -} - - - diff --git a/SDK/ZedGraphs/ZedGraph/XDate.cs b/SDK/ZedGraphs/ZedGraph/XDate.cs deleted file mode 100644 index 027449a..0000000 --- a/SDK/ZedGraphs/ZedGraph/XDate.cs +++ /dev/null @@ -1,1732 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; - -namespace ZedGraph -{ - - /// - /// This struct encapsulates a date and time value, and handles associated - /// calculations and conversions between various formats. - /// - /// - /// This format stored as a double value representing days since a reference date - /// (XL date 0.0 is December 30, 1899 at 00:00 hrs). - /// Negative values are permissible, and the - /// range of valid dates is from noon on January 1st, 4713 B.C. forward. Internally, the - /// date calculations are done using Astronomical Julian Day numbers. The Astronomical Julian - /// Day number is defined as the number of days since noon on January 1st, 4713 B.C. - /// (also referred to as 12:00 on January 1, -4712). - /// NOTE: MS Excel actually has an error in the Serial Date calculations because it - /// errantly assumes 1900 is a leap year. The XDate calculations do not have this same - /// error. Therefore, XDate and Excel Date Serial values are 1 day different up until - /// the date value of 60 (in Excel, this is February 29th, 1900, and in XDate, this is - /// February 28th, 1900). At a value of 61 (March 1st, 1900) or greater, they agree with - /// eachother. - /// - /// John Champion - /// $Revision: 3.23 $ $Date: 2007-11-11 06:56:34 $ - public struct XDate : IComparable - { - #region Fields & Constants - // ========================================================================= - // Internal Variables - // ========================================================================= - - /// - /// The actual date value in MS Excel format. This is the only data field in - /// the struct. - /// - private double _xlDate; - - /// - /// The Astronomical Julian Day number that corresponds to XL Date 0.0 - /// - public const double XLDay1 = 2415018.5; - - /// - /// The minimum valid Julian Day, which corresponds to January 1st, 4713 B.C. - /// - public const double JulDayMin = 0.0; - /// - /// The maximum valid Julian Day, which corresponds to December 31st, 9999 A.D. - /// - public const double JulDayMax = 5373483.5; - /// - /// The minimum valid Excel Day, which corresponds to January 1st, 4713 B.C. - /// - public const double XLDayMin = JulDayMin - XLDay1; - /// - /// The maximum valid Excel Day, which corresponds to December 31st, 9999 A.D. - /// - public const double XLDayMax = JulDayMax - XLDay1; - - /// - /// The number of months in a year - /// - public const double MonthsPerYear = 12.0; - /// - /// The number of hours in a day - /// - public const double HoursPerDay = 24.0; - /// - /// The number of minutes in an hour - /// - public const double MinutesPerHour = 60.0; - /// - /// The number of seconds in a minute - /// - public const double SecondsPerMinute = 60.0; - /// - /// The number of minutes in a day - /// - public const double MinutesPerDay = 1440.0; - /// - /// The number of seconds in a day - /// - public const double SecondsPerDay = 86400.0; - /// - /// The number of milliseconds in a second - /// - public const double MillisecondsPerSecond = 1000.0; - /// - /// The number of milliseconds in a day - /// - public const double MillisecondsPerDay = 86400000.0; - /// - /// The default format string to be used in when - /// no format is provided - /// -// public const string DefaultFormatStr = "&d-&mmm-&yy &hh:&nn"; - public const string DefaultFormatStr = "g"; - #endregion - - #region Constructors - // ========================================================================= - // Constructors - // ========================================================================= - - /// - /// Construct a date class from an XL date value. - /// - /// - /// An XL Date value in floating point double format - /// - public XDate( double xlDate ) - { - _xlDate = xlDate; - } - - /// - /// Construct a date class from a struct. - /// - /// - /// A struct containing the initial date information. - /// - public XDate( DateTime dateTime ) - { - _xlDate = CalendarDateToXLDate( dateTime.Year, dateTime.Month, - dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, - dateTime.Millisecond ); - } - - /// - /// Construct a date class from a calendar date (year, month, day). Assumes the time - /// of day is 00:00 hrs - /// - /// An integer value for the year, e.g., 1995. - /// An integer value for the day of the month, e.g., 23. - /// It is permissible to have day numbers outside of the 1-31 range, - /// which will rollover to the previous or next month and year. - /// An integer value for the month of the year, e.g., - /// 8 for August. It is permissible to have months outside of the 1-12 range, - /// which will rollover to the previous or next year. - public XDate( int year, int month, int day ) - { - _xlDate = CalendarDateToXLDate( year, month, day, 0, 0, 0 ); - } - - /// - /// Construct a date class from a calendar date and time (year, month, day, hour, minute, - /// second). - /// - /// An integer value for the year, e.g., 1995. - /// An integer value for the day of the month, e.g., 23. - /// It is permissible to have day numbers outside of the 1-31 range, - /// which will rollover to the previous or next month and year. - /// An integer value for the month of the year, e.g., - /// 8 for August. It is permissible to have months outside of the 1-12 range, - /// which will rollover to the previous or next year. - /// An integer value for the hour of the day, e.g. 15. - /// It is permissible to have hour values outside the 0-23 range, which - /// will rollover to the previous or next day. - /// An integer value for the minute, e.g. 45. - /// It is permissible to have hour values outside the 0-59 range, which - /// will rollover to the previous or next hour. - /// An integer value for the second, e.g. 35. - /// It is permissible to have second values outside the 0-59 range, which - /// will rollover to the previous or next minute. - public XDate( int year, int month, int day, int hour, int minute, int second ) - { - _xlDate = CalendarDateToXLDate( year, month, day, hour, minute, second ); - } - - /// - /// Construct a date class from a calendar date and time (year, month, day, hour, minute, - /// second), where seconds is a value (allowing fractional seconds). - /// - /// An integer value for the year, e.g., 1995. - /// An integer value for the day of the month, e.g., 23. - /// It is permissible to have day numbers outside of the 1-31 range, - /// which will rollover to the previous or next month and year. - /// An integer value for the month of the year, e.g., - /// 8 for August. It is permissible to have months outside of the 1-12 range, - /// which will rollover to the previous or next year. - /// An integer value for the hour of the day, e.g. 15. - /// It is permissible to have hour values outside the 0-23 range, which - /// will rollover to the previous or next day. - /// An integer value for the minute, e.g. 45. - /// It is permissible to have hour values outside the 0-59 range, which - /// will rollover to the previous or next hour. - /// A double value for the second, e.g. 35.75. - /// It is permissible to have second values outside the 0-59 range, which - /// will rollover to the previous or next minute. - public XDate( int year, int month, int day, int hour, int minute, double second ) - { - _xlDate = CalendarDateToXLDate( year, month, day, hour, minute, second ); - } - - /// - /// Construct a date class from a calendar date and time (year, month, day, hour, minute, - /// second, millisecond). - /// - /// An integer value for the year, e.g., 1995. - /// An integer value for the day of the month, e.g., 23. - /// It is permissible to have day numbers outside of the 1-31 range, - /// which will rollover to the previous or next month and year. - /// An integer value for the month of the year, e.g., - /// 8 for August. It is permissible to have months outside of the 1-12 range, - /// which will rollover to the previous or next year. - /// An integer value for the hour of the day, e.g. 15. - /// It is permissible to have hour values outside the 0-23 range, which - /// will rollover to the previous or next day. - /// An integer value for the minute, e.g. 45. - /// It is permissible to have hour values outside the 0-59 range, which - /// will rollover to the previous or next hour. - /// An integer value for the second, e.g. 35. - /// It is permissible to have second values outside the 0-59 range, which - /// will rollover to the previous or next minute. - /// An integer value for the millisecond, e.g. 632. - /// It is permissible to have millisecond values outside the 0-999 range, which - /// will rollover to the previous or next second. - public XDate( int year, int month, int day, int hour, int minute, int second, int millisecond ) - { - _xlDate = CalendarDateToXLDate( year, month, day, hour, minute, second, millisecond ); - } - - /// - /// The Copy Constructor - /// - /// The GraphPane object from which to copy - public XDate( XDate rhs ) - { - _xlDate = rhs._xlDate; - } -/* - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public XDate Clone() - { - return new XDate( this ); - } -*/ - - #endregion - - #region Properties - // ========================================================================= - // Properties - // ========================================================================= - - /// - /// Gets or sets the date value for this item in MS Excel format. - /// - public double XLDate - { - get { return _xlDate; } - set { _xlDate = value; } - } - - /// - /// Returns true if this struct is in the valid date range - /// - public bool IsValidDate - { - get { return _xlDate >= XLDayMin && _xlDate <= XLDayMax; } - } - - /// - /// Gets or sets the date value for this item in .Net DateTime format. - /// - public DateTime DateTime - { - get { return XLDateToDateTime( _xlDate ); } - set { _xlDate = DateTimeToXLDate( value ); } - } - - /// - /// Gets or sets the date value for this item in Julain day format. This is the - /// Astronomical Julian Day number, so a value of 0.0 corresponds to noon GMT on - /// January 1st, -4712. Thus, Julian Day number 2,400,000.0 corresponds to - /// noon GMT on November 16, 1858. - /// - public double JulianDay - { - get { return XLDateToJulianDay( _xlDate ); } - set { _xlDate = JulianDayToXLDate( value ); } - } - - /// - /// Gets or sets the decimal year number (i.e., 1997.345) corresponding to this item. - /// - public double DecimalYear - { - get { return XLDateToDecimalYear( _xlDate ); } - set { _xlDate = DecimalYearToXLDate( value ); } - } - #endregion - - #region Get/Set Date Methods - - /// - /// Returns true if the specified date value is in the valid range - /// - /// The XL date value to be verified for validity - /// true for a valid date, false otherwise - private static bool CheckValidDate( double xlDate ) - { - return xlDate >= XLDayMin && xlDate <= XLDayMax; - } - - /// - /// Take the specified date, and bound it to the valid date range for the XDate struct. - /// - /// The date to be bounded - /// An XLDate value that lies between the minimum and maximum valid date ranges - /// (see and ) - public static double MakeValidDate( double xlDate ) - { - if ( xlDate < XLDayMin ) - xlDate = XLDayMin; - if ( xlDate > XLDayMax ) - xlDate = XLDayMax; - return xlDate; - } - - /// - /// Get the calendar date (year, month, day) corresponding to this instance. - /// - /// An integer value for the year, e.g., 1995. - /// An integer value for the day of the month, e.g., 23. - /// An integer value for the month of the year, e.g., - /// 8 for August. - public void GetDate( out int year, out int month, out int day ) - { - int hour, minute, second; - - XLDateToCalendarDate( _xlDate, out year, out month, out day, out hour, out minute, out second ); - } - - /// - /// Set the calendar date (year, month, day) of this instance. - /// - /// An integer value for the year, e.g., 1995. - /// An integer value for the day of the month, e.g., 23. - /// An integer value for the month of the year, e.g., - /// 8 for August. - public void SetDate( int year, int month, int day ) - { - _xlDate = CalendarDateToXLDate( year, month, day, 0, 0, 0 ); - } - - /// - /// Get the calendar date (year, month, day, hour, minute, second) corresponding - /// to this instance. - /// - /// An integer value for the year, e.g., 1995. - /// An integer value for the day of the month, e.g., 23. - /// An integer value for the month of the year, e.g., - /// 8 for August. - /// An integer value for the hour of the day, e.g. 15. - /// An integer value for the minute, e.g. 45. - /// An integer value for the second, e.g. 35. - public void GetDate( out int year, out int month, out int day, - out int hour, out int minute, out int second ) - { - XLDateToCalendarDate( _xlDate, out year, out month, out day, out hour, out minute, out second ); - } - - /// - /// Set the calendar date (year, month, day, hour, minute, second) of this instance. - /// - /// An integer value for the year, e.g., 1995. - /// An integer value for the day of the month, e.g., 23. - /// An integer value for the month of the year, e.g., - /// 8 for August. - /// An integer value for the hour of the day, e.g. 15. - /// An integer value for the minute, e.g. 45. - /// An integer value for the second, e.g. 35. - public void SetDate( int year, int month, int day, int hour, int minute, int second ) - { - _xlDate = CalendarDateToXLDate( year, month, day, hour, minute, second ); - } - - /// - /// Get the day of year value (241.345 means the 241st day of the year) - /// corresponding to this instance. - /// - /// The day of the year in floating point double format. - public double GetDayOfYear() - { - return XLDateToDayOfYear( _xlDate ); - } - #endregion - - #region Date Conversion Methods - // ========================================================================= - // Conversion Routines - // ========================================================================= - - /// - /// Calculate an XL Date from the specified Calendar date (year, month, day, hour, minute, second), - /// first normalizing all input data values. - /// - /// - /// The Calendar date is always based on the Gregorian Calendar. Note that the Gregorian calendar is really - /// only valid from October 15, 1582 forward. The countries that adopted the Gregorian calendar - /// first did so on October 4, 1582, so that the next day was October 15, 1582. Prior to that time - /// the Julian Calendar was used. However, Prior to March 1, 4 AD the treatment of leap years was - /// inconsistent, and prior to 45 BC the Julian Calendar did not exist. The - /// struct projects only Gregorian dates backwards and does not deal with Julian calendar dates at all. The - /// method will just append a "(BC)" notation to the end of any dates - /// prior to 1 AD, since the struct throws an exception when formatting earlier dates. - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// - /// The integer millisecond value (e.g., 374 for 374 milliseconds past the second). - /// - /// The corresponding XL date, expressed in double floating point format - public static double CalendarDateToXLDate( int year, int month, int day, - int hour, int minute, int second, int millisecond ) - { - // Normalize the data to allow for negative and out of range values - // In this way, setting month to zero would be December of the previous year, - // setting hour to 24 would be the first hour of the next day, etc. - //double dsec = second + (double) millisecond / MillisecondsPerSecond; - double ms = millisecond; - NormalizeCalendarDate( ref year, ref month, ref day, ref hour, ref minute, ref second, - ref ms ); - - return _CalendarDateToXLDate( year, month, day, hour, minute, second, ms ); - } - - /// - /// Calculate an XL Date from the specified Calendar date (year, month, day, hour, minute, second), - /// first normalizing all input data values. - /// - /// - /// The Calendar date is always based on the Gregorian Calendar. Note that the Gregorian calendar is really - /// only valid from October 15, 1582 forward. The countries that adopted the Gregorian calendar - /// first did so on October 4, 1582, so that the next day was October 15, 1582. Prior to that time - /// the Julian Calendar was used. However, Prior to March 1, 4 AD the treatment of leap years was - /// inconsistent, and prior to 45 BC the Julian Calendar did not exist. The - /// struct projects only Gregorian dates backwards and does not deal with Julian calendar dates at all. The - /// method will just append a "(BC)" notation to the end of any dates - /// prior to 1 AD, since the struct throws an exception when formatting earlier dates. - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// The corresponding XL date, expressed in double floating point format - public static double CalendarDateToXLDate( int year, int month, int day, - int hour, int minute, int second ) - { - // Normalize the data to allow for negative and out of range values - // In this way, setting month to zero would be December of the previous year, - // setting hour to 24 would be the first hour of the next day, etc. - double ms = 0; - NormalizeCalendarDate( ref year, ref month, ref day, ref hour, ref minute, - ref second, ref ms ); - - return _CalendarDateToXLDate( year, month, day, hour, minute, second, ms ); - } - - /// - /// Calculate an XL Date from the specified Calendar date (year, month, day, hour, minute, second), - /// first normalizing all input data values. The seconds value is a double type, allowing fractional - /// seconds. - /// - /// - /// The Calendar date is always based on the Gregorian Calendar. Note that the Gregorian calendar is really - /// only valid from October 15, 1582 forward. The countries that adopted the Gregorian calendar - /// first did so on October 4, 1582, so that the next day was October 15, 1582. Prior to that time - /// the Julian Calendar was used. However, Prior to March 1, 4 AD the treatment of leap years was - /// inconsistent, and prior to 45 BC the Julian Calendar did not exist. The - /// struct projects only Gregorian dates backwards and does not deal with Julian calendar dates at all. The - /// method will just append a "(BC)" notation to the end of any dates - /// prior to 1 AD, since the struct throws an exception when formatting earlier dates. - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The double second value (e.g., 42.3 for 42.3 seconds past the minute). - /// - /// The corresponding XL date, expressed in double floating point format - public static double CalendarDateToXLDate( int year, int month, int day, - int hour, int minute, double second ) - { - // Normalize the data to allow for negative and out of range values - // In this way, setting month to zero would be December of the previous year, - // setting hour to 24 would be the first hour of the next day, etc. - int sec = (int)second; - double ms = ( second - sec ) * MillisecondsPerSecond; - NormalizeCalendarDate( ref year, ref month, ref day, ref hour, ref minute, ref sec, - ref ms ); - - return _CalendarDateToXLDate( year, month, day, hour, minute, sec, ms ); - } - - /// - /// Calculate an Astronomical Julian Day number from the specified Calendar date - /// (year, month, day, hour, minute, second), first normalizing all input data values - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// The corresponding Astronomical Julian Day number, expressed in double - /// floating point format - public static double CalendarDateToJulianDay( int year, int month, int day, - int hour, int minute, int second ) - { - // Normalize the data to allow for negative and out of range values - // In this way, setting month to zero would be December of the previous year, - // setting hour to 24 would be the first hour of the next day, etc. - double ms = 0; - NormalizeCalendarDate( ref year, ref month, ref day, ref hour, ref minute, - ref second, ref ms ); - - return _CalendarDateToJulianDay( year, month, day, hour, minute, second, ms ); - } - - /// - /// Calculate an Astronomical Julian Day number from the specified Calendar date - /// (year, month, day, hour, minute, second), first normalizing all input data values - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// - /// The integer second value (e.g., 325 for 325 milliseconds past the minute). - /// - /// The corresponding Astronomical Julian Day number, expressed in double - /// floating point format - public static double CalendarDateToJulianDay( int year, int month, int day, - int hour, int minute, int second, int millisecond ) - { - // Normalize the data to allow for negative and out of range values - // In this way, setting month to zero would be December of the previous year, - // setting hour to 24 would be the first hour of the next day, etc. - double ms = millisecond; - - NormalizeCalendarDate( ref year, ref month, ref day, ref hour, ref minute, - ref second, ref ms ); - - return _CalendarDateToJulianDay( year, month, day, hour, minute, second, ms ); - } - - /// - /// Normalize a set of Calendar date values (year, month, day, hour, minute, second) to make sure - /// that month is between 1 and 12, hour is between 0 and 23, etc. - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// - /// The double millisecond value (e.g., 325.3 for 325.3 milliseconds past the second). - /// - private static void NormalizeCalendarDate( ref int year, ref int month, ref int day, - ref int hour, ref int minute, ref int second, - ref double millisecond ) - { - // Normalize the data to allow for negative and out of range values - // In this way, setting month to zero would be December of the previous year, - // setting hour to 24 would be the first hour of the next day, etc. - - // Normalize the milliseconds and carry over to seconds - int carry = (int)Math.Floor( millisecond / MillisecondsPerSecond ); - millisecond -= carry * (int)MillisecondsPerSecond; - second += carry; - - // Normalize the seconds and carry over to minutes - carry = (int)Math.Floor( second / SecondsPerMinute ); - second -= carry * (int)SecondsPerMinute; - minute += carry; - - // Normalize the minutes and carry over to hours - carry = (int) Math.Floor( (double) minute / MinutesPerHour ); - minute -= carry * (int) MinutesPerHour; - hour += carry; - - // Normalize the hours and carry over to days - carry = (int) Math.Floor( (double) hour / HoursPerDay ); - hour -= carry * (int) HoursPerDay; - day += carry; - - // Normalize the months and carry over to years - carry = (int) Math.Floor( (double) month / MonthsPerYear ); - month -= carry * (int) MonthsPerYear; - year += carry; - } - - /// - /// Calculate an XL date from the specified Calendar date (year, month, day, hour, minute, second). - /// This is the internal trusted version, where all values are assumed to be legitimate - /// ( month is between 1 and 12, minute is between 0 and 59, etc. ) - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// - /// The double millisecond value (e.g., 325.3 for 325.3 milliseconds past the second). - /// - /// The corresponding XL date, expressed in double floating point format - private static double _CalendarDateToXLDate( int year, int month, int day, int hour, - int minute, int second, double millisecond ) - { - return JulianDayToXLDate( _CalendarDateToJulianDay( year, month, day, hour, minute, - second, millisecond ) ); - } - - /// - /// Calculate an Astronomical Julian Day Number from the specified Calendar date - /// (year, month, day, hour, minute, second). - /// This is the internal trusted version, where all values are assumed to be legitimate - /// ( month is between 1 and 12, minute is between 0 and 59, etc. ) - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// - /// The double millisecond value (e.g., 325.3 for 325.3 milliseconds past the second). - /// - /// The corresponding Astronomical Julian Day number, expressed in double - /// floating point format - private static double _CalendarDateToJulianDay( int year, int month, int day, int hour, - int minute, int second, double millisecond ) - { - // Taken from http://www.srrb.noaa.gov/highlights/sunrise/program.txt - // routine calcJD() - - if ( month <= 2 ) - { - year -= 1; - month += 12; - } - - double A = Math.Floor( (double) year / 100.0 ); - double B = 2 - A + Math.Floor( A / 4.0 ); - - return Math.Floor( 365.25 * ( (double) year + 4716.0 ) ) + - Math.Floor( 30.6001 * (double) ( month + 1 ) ) + - (double) day + B - 1524.5 + - hour / HoursPerDay + minute / MinutesPerDay + second / SecondsPerDay + - millisecond / MillisecondsPerDay; - - } - - /// - /// Calculate a Calendar date (year, month, day, hour, minute, second) corresponding to - /// the specified XL date - /// - /// - /// The XL date value in floating point double format. - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - public static void XLDateToCalendarDate( double xlDate, out int year, out int month, - out int day, out int hour, out int minute, out int second ) - { - double jDay = XLDateToJulianDay( xlDate ); - - JulianDayToCalendarDate( jDay, out year, out month, out day, out hour, - out minute, out second ); - } - - /// - /// Calculate a Calendar date (year, month, day, hour, minute, second) corresponding to - /// the specified XL date - /// - /// - /// The XL date value in floating point double format. - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// - /// The integer millisecond value (e.g., 325 for 325 milliseconds past the second). - /// - public static void XLDateToCalendarDate( double xlDate, out int year, out int month, - out int day, out int hour, out int minute, out int second, out int millisecond ) - { - double jDay = XLDateToJulianDay( xlDate ); - - double ms; - JulianDayToCalendarDate( jDay, out year, out month, out day, out hour, - out minute, out second, out ms ); - millisecond = (int)ms; - } - - /// - /// Calculate a Calendar date (year, month, day, hour, minute, second) corresponding to - /// the specified XL date - /// - /// - /// The XL date value in floating point double format. - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The double second value (e.g., 42.3 for 42.3 seconds past the minute). - /// - public static void XLDateToCalendarDate( double xlDate, out int year, out int month, - out int day, out int hour, out int minute, out double second ) - { - double jDay = XLDateToJulianDay( xlDate ); - - JulianDayToCalendarDate( jDay, out year, out month, out day, out hour, - out minute, out second ); - } - - /// - /// Calculate a Calendar date (year, month, day, hour, minute, second) corresponding to - /// the Astronomical Julian Day number - /// - /// - /// The Astronomical Julian Day number to be converted - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - public static void JulianDayToCalendarDate( double jDay, out int year, out int month, - out int day, out int hour, out int minute, out int second ) - { - double ms = 0; - - JulianDayToCalendarDate( jDay, out year, out month, - out day, out hour, out minute, out second, out ms ); - } - - /// - /// Calculate a Calendar date (year, month, day, hour, minute, second) corresponding to - /// the Astronomical Julian Day number - /// - /// - /// The Astronomical Julian Day number to be converted - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The double second value (e.g., 42.3 for 42.3 seconds past the minute). - /// - public static void JulianDayToCalendarDate( double jDay, out int year, out int month, - out int day, out int hour, out int minute, out double second ) - { - int sec; - double ms; - - JulianDayToCalendarDate( jDay, out year, out month, - out day, out hour, out minute, out sec, out ms ); - - second = sec + ms / MillisecondsPerSecond; - } - - /// - /// Calculate a Calendar date (year, month, day, hour, minute, second) corresponding to - /// the Astronomical Julian Day number - /// - /// - /// The Astronomical Julian Day number to be converted - /// - /// - /// The integer year value (e.g., 1994). - /// - /// - /// The integer month value (e.g., 7 for July). - /// - /// - /// The integer day value (e.g., 19 for the 19th day of the month). - /// - /// - /// The integer hour value (e.g., 14 for 2:00 pm). - /// - /// - /// The integer minute value (e.g., 35 for 35 minutes past the hour). - /// - /// - /// The integer second value (e.g., 42 for 42 seconds past the minute). - /// - /// - /// The millisecond value (e.g., 342.5 for 342.5 milliseconds past - /// the second). - /// - public static void JulianDayToCalendarDate( double jDay, out int year, out int month, - out int day, out int hour, out int minute, out int second, out double millisecond ) - { - // add 5 ten-thousandths of a second to the day fraction to avoid roundoff errors - jDay += 0.0005 / SecondsPerDay; - - double z = Math.Floor( jDay + 0.5); - double f = jDay + 0.5 - z; - - double alpha = Math.Floor( ( z - 1867216.25 ) / 36524.25 ); - double A = z + 1.0 + alpha - Math.Floor( alpha / 4 ); - double B = A + 1524.0; - double C = Math.Floor( ( B - 122.1 ) / 365.25 ); - double D = Math.Floor( 365.25 * C ); - double E = Math.Floor( ( B - D ) / 30.6001 ); - - day = (int) Math.Floor( B - D - Math.Floor( 30.6001 * E ) + f ); - month = (int) ( ( E < 14.0 ) ? E - 1.0 : E - 13.0 ); - year = (int) ( ( month > 2 ) ? C - 4716 : C - 4715 ); - - double fday = ( jDay - 0.5 ) - Math.Floor( jDay - 0.5 ); - - fday = ( fday - (long) fday ) * HoursPerDay; - hour = (int) fday; - fday = ( fday - (long) fday ) * MinutesPerHour; - minute = (int) fday; - fday = ( fday - (long) fday ) * SecondsPerMinute; - second = (int) fday; - fday = ( fday - (long) fday ) * MillisecondsPerSecond; - millisecond = fday; - } - - /// - /// Calculate an Astronomical Julian Day number corresponding to the specified XL date - /// - /// - /// The XL date value in floating point double format. - /// - /// The corresponding Astronomical Julian Day number, expressed in double - /// floating point format - public static double XLDateToJulianDay( double xlDate ) - { - return xlDate + XLDay1; - } - - /// - /// Calculate an XL Date corresponding to the specified Astronomical Julian Day number - /// - /// - /// The Astronomical Julian Day number in floating point double format. - /// - /// The corresponding XL Date, expressed in double - /// floating point format - public static double JulianDayToXLDate( double jDay ) - { - return jDay - XLDay1; - } - - /// - /// Calculate a decimal year value (e.g., 1994.6523) corresponding to the specified XL date - /// - /// - /// The XL date value in floating point double format. - /// - /// The corresponding decimal year value, expressed in double - /// floating point format - public static double XLDateToDecimalYear( double xlDate ) - { - int year, month, day, hour, minute, second; - - XLDateToCalendarDate( xlDate, out year, out month, out day, out hour, out minute, out second ); - - double jDay1 = CalendarDateToJulianDay( year, 1, 1, 0, 0, 0 ); - double jDay2 = CalendarDateToJulianDay( year + 1, 1, 1, 0, 0, 0 ); - double jDayMid = CalendarDateToJulianDay( year, month, day, hour, minute, second ); - - - return (double) year + ( jDayMid - jDay1 ) / ( jDay2 - jDay1 ); - } - - /// - /// Calculate a decimal year value (e.g., 1994.6523) corresponding to the specified XL date - /// - /// - /// The decimal year value in floating point double format. - /// - /// The corresponding XL Date, expressed in double - /// floating point format - public static double DecimalYearToXLDate( double yearDec ) - { - int year = (int) yearDec; - - double jDay1 = CalendarDateToJulianDay( year, 1, 1, 0, 0, 0 ); - double jDay2 = CalendarDateToJulianDay( year + 1, 1, 1, 0, 0, 0 ); - - return JulianDayToXLDate( ( yearDec - (double) year ) * ( jDay2 - jDay1 ) + jDay1 ); - } - - /// - /// Calculate a day-of-year value (e.g., 241.543 corresponds to the 241st day of the year) - /// corresponding to the specified XL date - /// - /// - /// The XL date value in floating point double format. - /// - /// The corresponding day-of-year (DoY) value, expressed in double - /// floating point format - public static double XLDateToDayOfYear( double xlDate ) - { - int year, month, day, hour, minute, second; - XLDateToCalendarDate( xlDate, out year, out month, out day, - out hour, out minute, out second ); - return XLDateToJulianDay( xlDate ) - CalendarDateToJulianDay( year, 1, 1, 0, 0, 0 ) + 1.0; - } - - /// - /// Calculate a day-of-week value (e.g., Sun=0, Mon=1, Tue=2, etc.) - /// corresponding to the specified XL date - /// - /// - /// The XL date value in floating point double format. - /// - /// The corresponding day-of-week (DoW) value, expressed in integer format - public static int XLDateToDayOfWeek( double xlDate ) - { - return (int) ( XLDateToJulianDay( xlDate ) + 1.5 ) % 7; - } - - /// - /// Convert an XL date format to a .Net DateTime struct - /// - /// - /// The XL date value in floating point double format. - /// - /// The corresponding XL Date, expressed in double - /// floating point format - /// The corresponding date in the form of a .Net DateTime struct - public static DateTime XLDateToDateTime( double xlDate ) - { - int year, month, day, hour, minute, second, millisecond; - XLDateToCalendarDate( xlDate, out year, out month, out day, - out hour, out minute, out second, out millisecond ); - return new DateTime( year, month, day, hour, minute, second, millisecond ); - } - - /// - /// Convert a .Net DateTime struct to an XL Format date - /// - /// - /// The date value in the form of a .Net DateTime struct - /// - /// The corresponding XL Date, expressed in double - /// floating point format - public static double DateTimeToXLDate( DateTime dt ) - { - return CalendarDateToXLDate( dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, - dt.Millisecond ); - } - #endregion - - #region Date Math Methods - // ========================================================================= - // Math Routines - // ========================================================================= - - /// - /// Add the specified number of milliseconds (can be fractional) to the current XDate instance. - /// - /// - /// The incremental number of milliseconds (negative or positive) in floating point double format. - /// - public void AddMilliseconds( double dMilliseconds ) - { - _xlDate += dMilliseconds / MillisecondsPerDay; - } - - /// - /// Add the specified number of seconds (can be fractional) to the current XDate instance. - /// - /// - /// The incremental number of seconds (negative or positive) in floating point double format. - /// - public void AddSeconds( double dSeconds ) - { - _xlDate += dSeconds / SecondsPerDay; - } - - /// - /// Add the specified number of minutes (can be fractional) to the current XDate instance. - /// - /// - /// The incremental number of minutes (negative or positive) in floating point double format. - /// - public void AddMinutes( double dMinutes ) - { - _xlDate += dMinutes / MinutesPerDay; - } - - /// - /// Add the specified number of hours (can be fractional) to the current XDate instance. - /// - /// - /// The incremental number of hours (negative or positive) in floating point double format. - /// - public void AddHours( double dHours ) - { - _xlDate += dHours / HoursPerDay; - } - - /// - /// Add the specified number of days (can be fractional) to the current XDate instance. - /// - /// - /// The incremental number of days (negative or positive) in floating point double format. - /// - public void AddDays( double dDays ) - { - _xlDate += dDays; - } - - /// - /// Add the specified number of Months (can be fractional) to the current XDate instance. - /// - /// - /// The incremental number of months (negative or positive) in floating point double format. - /// - public void AddMonths( double dMonths ) - { - int iMon = (int) dMonths; - double monFrac = Math.Abs( dMonths - (double) iMon ); - int sMon = Math.Sign( dMonths ); - - int year, month, day, hour, minute, second; - - XLDateToCalendarDate( _xlDate, out year, out month, out day, out hour, out minute, out second ); - if ( iMon != 0 ) - { - month += iMon; - _xlDate = CalendarDateToXLDate( year, month, day, hour, minute, second ); - } - - if ( sMon != 0 ) - { - double xlDate2 = CalendarDateToXLDate( year, month+sMon, day, hour, minute, second ); - _xlDate += (xlDate2 - _xlDate) * monFrac; - } - } - - /// - /// Add the specified number of years (can be fractional) to the current XDate instance. - /// - /// - /// The incremental number of years (negative or positive) in floating point double format. - /// - public void AddYears( double dYears ) - { - int iYear = (int) dYears; - double yearFrac = Math.Abs( dYears - (double) iYear ); - int sYear = Math.Sign( dYears ); - - int year, month, day, hour, minute, second; - - XLDateToCalendarDate( _xlDate, out year, out month, out day, out hour, out minute, out second ); - if ( iYear != 0 ) - { - year += iYear; - _xlDate = CalendarDateToXLDate( year, month, day, hour, minute, second ); - } - - if ( sYear != 0 ) - { - double xlDate2 = CalendarDateToXLDate( year+sYear, month, day, hour, minute, second ); - _xlDate += (xlDate2 - _xlDate) * yearFrac; - } - } - #endregion - - #region Operator Overload Methods - // ========================================================================= - // Operator Overloads - // ========================================================================= - - /// - /// '-' operator overload. When two XDates are subtracted, the number of days between dates - /// is returned. - /// - /// The left-hand-side of the '-' operator (an XDate class) - /// The right-hand-side of the '-' operator (an XDate class) - /// The days between dates, expressed as a floating point double - public static double operator -( XDate lhs, XDate rhs ) - { - return lhs.XLDate - rhs.XLDate; - } - - /// - /// '-' operator overload. When a double value is subtracted from an XDate, the result is a - /// new XDate with the number of days subtracted. - /// - /// The left-hand-side of the '-' operator (an XDate class) - /// The right-hand-side of the '-' operator (a double value) - /// An XDate with the rhs number of days subtracted - public static XDate operator -( XDate lhs, double rhs ) - { - lhs._xlDate -= rhs; - return lhs; - } - - /// - /// '+' operator overload. When a double value is added to an XDate, the result is a - /// new XDate with the number of days added. - /// - /// The left-hand-side of the '-' operator (an XDate class) - /// The right-hand-side of the '+' operator (a double value) - /// An XDate with the rhs number of days added - public static XDate operator +( XDate lhs, double rhs ) - { - lhs._xlDate += rhs; - return lhs; - } - - /// - /// '++' operator overload. Increment the date by one day. - /// - /// The XDate struct on which to operate - /// An XDate one day later than the specified date - public static XDate operator ++( XDate xDate ) - { - xDate._xlDate += 1.0; - return xDate; - } - - /// - /// '--' operator overload. Decrement the date by one day. - /// - /// The XDate struct on which to operate - /// An XDate one day prior to the specified date - public static XDate operator --( XDate xDate ) - { - xDate._xlDate -= 1.0; - return xDate; - } - - /// - /// Implicit conversion from XDate to double (an XL Date). - /// - /// The XDate struct on which to operate - /// A double floating point value representing the XL Date - public static implicit operator double( XDate xDate ) - { - return xDate._xlDate; - } - - /// - /// Implicit conversion from XDate to float (an XL Date). - /// - /// The XDate struct on which to operate - /// A double floating point value representing the XL Date - public static implicit operator float( XDate xDate ) - { - return (float) xDate._xlDate; - } - - /// - /// Implicit conversion from double (an XL Date) to XDate. - /// - /// The XDate struct on which to operate - /// An XDate struct representing the specified xlDate value. - public static implicit operator XDate( double xlDate ) - { - return new XDate( xlDate ); - } - - /// - /// Implicit conversion from XDate to . - /// - /// The XDate struct on which to operate - /// A struct representing the specified xDate value. - public static implicit operator DateTime( XDate xDate ) - { - - return XLDateToDateTime( xDate ); - } - - /// - /// Implicit conversion from to . - /// - /// The struct on which to operate - /// An struct representing the specified DateTime value. - public static implicit operator XDate( DateTime dt ) - { - - return new XDate( DateTimeToXLDate( dt ) ); - } - #endregion - - #region General Overrides - // ========================================================================= - // System Stuff - // ========================================================================= - - /// - /// Tests whether obj is either an structure or - /// a double floating point value that is equal to the same date as this XDate - /// struct instance. - /// - /// The object to compare for equality with this XDate instance. - /// This object should be either a type XDate or type double. - /// Returns true if obj is the same date as this - /// instance; otherwise, false - public override bool Equals( object obj ) - { - if ( obj is XDate ) - { - return ((XDate) obj)._xlDate == _xlDate; - } - else if ( obj is double ) - { - return ((double) obj) == _xlDate; - } - else - return false; - } - - /// - /// Returns the hash code for this structure. In this case, the - /// hash code is simply the equivalent hash code for the floating point double date value. - /// - /// An integer representing the hash code for this XDate value - public override int GetHashCode() - { - return _xlDate.GetHashCode(); - } - - /// - /// Compares one object to another. - /// - /// - /// This method will throw an exception if is not an - /// object. - /// - /// The second object to be compared. - /// zero if is equal to the current instance, - /// -1 if is less than the current instance, and - /// 1 if is greater than the current instance. - public int CompareTo( object target ) - { - if ( ! (target is XDate) ) - throw new ArgumentException(); - - return ( this.XLDate ).CompareTo( ((XDate)target).XLDate ); - } - - #endregion - - #region String Format Conversion Methods - // ========================================================================= - // String Formatting Routines - // ========================================================================= - - /// - /// Format this XDate value using the default format string (). - /// - /// - /// The formatting is done using the - /// method in order to provide full localization capability. The DateTime struct is limited to - /// dates from 1 AD onward. However, all calendar dates in and - /// are projected Gregorian calendar dates. Since the Gregorian calendar was not implemented - /// until October 4, 1582 (or later in some countries), Gregorian dates prior to that time are - /// really dates that would have been, had the Gregorian calendar existed. In order to avoid - /// throwing an exception, for dates prior to 1 AD, the year will be converted to a positive - /// year and the text "(BC)" is appended to the end of the formatted string. Under this mode, the - /// year sequence is 2BC, 1BC, 1AD, 2AD, etc. There is no year zero. - /// - /// - /// The XL date value to be formatted in floating point double format. - /// - /// A string representation of the date - public string ToString( double xlDate ) - { - return ToString( xlDate, DefaultFormatStr ); - } - - /// - /// Format this XDate value using the default format string (see cref="DefaultFormatStr"/>). - /// - /// - /// The formatting is done using the - /// - /// method in order to provide full localization capability. The DateTime struct is limited to - /// dates from 1 AD onward. However, all calendar dates in and - /// - /// are projected Gregorian calendar dates. Since the Gregorian calendar was not implemented - /// until October 4, 1582 (or later in some countries), Gregorian dates prior to that time are - /// really dates that would have been, had the Gregorian calendar existed. In order to avoid - /// throwing an exception, for dates prior to 1 AD, the year will be converted to a positive - /// year and the text "(BC)" is appended to the end of the formatted string. Under this mode, the - /// year sequence is 2BC, 1BC, 1AD, 2AD, etc. There is no year zero. - /// - /// A string representation of the date - public override string ToString() - { - return ToString( _xlDate, DefaultFormatStr ); - } - - /// - /// Format this XL Date value using the specified format string. The format - /// string is specified according to the class. - /// - /// - /// The formatting is done using the - /// - /// method in order to provide full localization capability. The DateTime struct is limited to - /// dates from 1 AD onward. However, all calendar dates in and - /// - /// are projected Gregorian calendar dates. Since the Gregorian calendar was not implemented - /// until October 4, 1582 (or later in some countries), Gregorian dates prior to that time are - /// really dates that would have been, had the Gregorian calendar existed. In order to avoid - /// throwing an exception, for dates prior to 1 AD, the year will be converted to a positive - /// year and the text "(BC)" is appended to the end of the formatted string. Under this mode, the - /// year sequence is 2BC, 1BC, 1AD, 2AD, etc. There is no year zero. - /// - /// - /// The formatting string to be used for the date. See - /// - /// class for a list of the format types available. - /// A string representation of the date - public string ToString( string fmtStr ) - { - return ToString( this.XLDate, fmtStr ); - } - - /// - /// Format the specified XL Date value using the specified format string. The format - /// string is specified according to the class. - /// - /// - /// The formatting is done using the - /// - /// method in order to provide full localization capability. The DateTime struct is limited to - /// dates from 1 AD onward. However, all calendar dates in and - /// - /// are projected Gregorian calendar dates. Since the Gregorian calendar was not implemented - /// until October 4, 1582 (or later in some countries), Gregorian dates prior to that time are - /// really dates that would have been, had the Gregorian calendar existed. In order to avoid - /// throwing an exception, for dates prior to 1 AD, the year will be converted to a positive - /// year and the text "(BC)" is appended to the end of the formatted string. Under this mode, the - /// year sequence is 2BC, 1BC, 1AD, 2AD, etc. There is no year zero. - /// - /// - /// The XL date value to be formatted in floating point double format. - /// - /// - /// The formatting string to be used for the date. See - /// - /// for a list of the format types available. - /// A string representation of the date - public static string ToString( double xlDate, string fmtStr ) - { - int year, month, day, hour, minute, second, millisecond; - - if ( !CheckValidDate( xlDate ) ) - return "Date Error"; - - XLDateToCalendarDate( xlDate, out year, out month, out day, out hour, out minute, - out second, out millisecond ); - if ( year <= 0 ) - { - year = 1 - year; - fmtStr = fmtStr + " (BC)"; - } - - if ( fmtStr.IndexOf("[d]") >= 0 ) - { - fmtStr = fmtStr.Replace( "[d]", ((int) xlDate).ToString() ); - xlDate -= (int) xlDate; - } - if ( fmtStr.IndexOf("[h]") >= 0 || fmtStr.IndexOf("[hh]") >= 0 ) - { - fmtStr = fmtStr.Replace( "[h]", ((int) (xlDate * 24)).ToString("d") ); - fmtStr = fmtStr.Replace( "[hh]", ((int) (xlDate * 24)).ToString("d2") ); - xlDate = ( xlDate * 24 - (int) (xlDate * 24) ) / 24.0; - } - if ( fmtStr.IndexOf("[m]") >= 0 || fmtStr.IndexOf("[mm]") >= 0 ) - { - fmtStr = fmtStr.Replace( "[m]", ((int) (xlDate * 1440)).ToString("d") ); - fmtStr = fmtStr.Replace( "[mm]", ((int) (xlDate * 1440)).ToString("d2") ); - xlDate = ( xlDate * 1440 - (int) (xlDate * 1440) ) / 1440.0; - } - if ( fmtStr.IndexOf("[s]") >= 0 || fmtStr.IndexOf("[ss]") >= 0 ) - { - fmtStr = fmtStr.Replace( "[s]", ((int) (xlDate * 86400)).ToString("d") ); - fmtStr = fmtStr.Replace( "[ss]", ((int) (xlDate * 86400)).ToString("d2") ); - xlDate = ( xlDate * 86400 - (int) (xlDate * 86400) ) / 86400.0; - } - if ( fmtStr.IndexOf("[f]") >= 0 ) - fmtStr = fmtStr.Replace( "[f]", ((int) (xlDate * 864000)).ToString("d") ); - if ( fmtStr.IndexOf("[ff]") >= 0 ) - fmtStr = fmtStr.Replace( "[ff]", ((int) (xlDate * 8640000)).ToString("d") ); - if ( fmtStr.IndexOf("[fff]") >= 0 ) - fmtStr = fmtStr.Replace( "[fff]", ((int) (xlDate * 86400000)).ToString("d") ); - if ( fmtStr.IndexOf("[ffff]") >= 0 ) - fmtStr = fmtStr.Replace( "[ffff]", ((int) (xlDate * 864000000)).ToString("d") ); - if ( fmtStr.IndexOf("[fffff]") >= 0 ) - fmtStr = fmtStr.Replace( "[fffff]", ((int) (xlDate * 8640000000)).ToString("d") ); - - //DateTime dt = XLDateToDateTime( xlDate ); - if ( year > 9999 ) - year = 9999; - DateTime dt = new DateTime( year, month, day, hour, minute, second, millisecond ); - return dt.ToString( fmtStr ); - } - -/* - /// - /// Format this XDate value using the specified format string - /// - /// - /// The formatting string to be used for the date. The following formatting elements - /// will be replaced with the corresponding date values: - /// - /// - /// Variable - /// Description - /// - /// &mmmmmonth name (e.g., January) - /// &mmmmonth abbreviation (e.g., Apr) - /// &mmpadded month number (e.g. 04) - /// &mnon-padded month number (e.g., 4) - /// &ddpadded day number (e.g., 09) - /// &dnon-padded day number (e.g., 9) - /// &yyyy4 digit year number (e.g., 1995) - /// &yytwo digit year number (e.g., 95) - /// &hhpadded 24 hour time value (e.g., 08) - /// &hnon-padded 12 hour time value (e.g., 8) - /// &nnpadded minute value (e.g, 05) - /// &nnon-padded minute value (e.g., 5) - /// &sspadded second value (e.g., 03) - /// &snon-padded second value (e.g., 3) - /// &a"am" or "pm" - /// &wwwwday of week (e.g., Wednesday) - /// &wwwday of week abbreviation (e.g., Wed) - /// - /// - /// - /// "&wwww, &mmmm &dd, &yyyy &h:&nn &a" ==> "Sunday, February 12, 1956 4:23 pm" - /// "&dd-&mmm-&yy" ==> 12-Feb-56 - /// - /// A string representation of the date - public string ToString( string fmtStr ) - { - return ToString( this.xlDate, fmtStr ); - } - - /// - /// Format the specified XL Date value using the specified format string - /// - /// - /// The XL date value to be formatted in floating point double format. - /// - /// - /// The formatting string to be used for the date. The following formatting elements - /// will be replaced with the corresponding date values: - /// - /// - /// Variable - /// Description - /// - /// &mmmmmonth name (e.g., January) - /// &mmmmonth abbreviation (e.g., Apr) - /// &mmpadded month number (e.g. 04) - /// &mnon-padded month number (e.g., 4) - /// &ddpadded day number (e.g., 09) - /// &dnon-padded day number (e.g., 9) - /// &yyyy4 digit year number (e.g., 1995) - /// &yytwo digit year number (e.g., 95) - /// &hhpadded 24 hour time value (e.g., 08) - /// &hnon-padded 12 hour time value (e.g., 8) - /// &nnpadded minute value (e.g, 05) - /// &nnon-padded minute value (e.g., 5) - /// &sspadded second value (e.g., 03) - /// &snon-padded second value (e.g., 3) - /// &a"am" or "pm" - /// &wwwwday of week (e.g., Wednesday) - /// &wwwday of week abbreviation (e.g., Wed) - /// - /// - /// - /// "&wwww, &mmmm &dd, &yyyy &h:&nn &a" ==> "Sunday, February 12, 1956 4:23 pm" - /// "&dd-&mmm-&yy" ==> 12-Feb-56 - /// - /// A string representation of the date - public static string ToString( double xlDate, string fmtStr ) - { - string[] longMonth = { "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December" }; - string[] shortMonth = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - string[] longDoW = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", - "Friday", "Saturday" }; - string[] shortDoW = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - - int year, month, day, hour, minute, second; - XLDateToCalendarDate( xlDate, out year, out month, out day, out hour, out minute, out second ); - - string resultStr = fmtStr.Replace( "&mmmm", longMonth[ month - 1 ] ); - resultStr = resultStr.Replace( "&mmm", shortMonth[ month - 1 ] ); - resultStr = resultStr.Replace( "&mm", month.ToString( "d2" ) ); - resultStr = resultStr.Replace( "&m", month.ToString( "d" ) ); - resultStr = resultStr.Replace( "&yyyy", year.ToString( "d" ) ); - resultStr = resultStr.Replace( "&yy", (year%100).ToString( "d2" ) ); - resultStr = resultStr.Replace( "&dd", day.ToString( "d2" ) ); - resultStr = resultStr.Replace( "&d", day.ToString( "d" ) ); - resultStr = resultStr.Replace( "&hh", hour.ToString( "d2" ) ); - resultStr = resultStr.Replace( "&h", (((hour+11)%12)+1).ToString( "d" ) ); - resultStr = resultStr.Replace( "&nn", minute.ToString( "d2" ) ); - resultStr = resultStr.Replace( "&n", minute.ToString( "d" ) ); - resultStr = resultStr.Replace( "&ss", second.ToString( "d2" ) ); - resultStr = resultStr.Replace( "&s", second.ToString( "d" ) ); - resultStr = resultStr.Replace( "&a", (hour>=12) ? "pm" : "am" ); - resultStr = resultStr.Replace( "&wwww", longDoW[ XLDateToDayOfWeek( xlDate ) ] ); - resultStr = resultStr.Replace( "&www", shortDoW[ XLDateToDayOfWeek( xlDate ) ] ); - - - return resultStr; - } -*/ - - #endregion - } -} diff --git a/SDK/ZedGraphs/ZedGraph/Y2Axis.cs b/SDK/ZedGraphs/ZedGraph/Y2Axis.cs deleted file mode 100644 index b643453..0000000 --- a/SDK/ZedGraphs/ZedGraph/Y2Axis.cs +++ /dev/null @@ -1,255 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// inherits from , and defines the - /// special characteristics of a vertical axis, specifically located on - /// the right side of the of the - /// object - /// - /// - /// John Champion - /// $Revision: 3.16 $ $Date: 2007-04-16 00:03:05 $ - [Serializable] - public class Y2Axis : Axis, ICloneable, ISerializable - { - #region Defaults - /// - /// A simple subclass of the class that defines the - /// default property values for the class. - /// - public new struct Default - { - // Default Y2 Axis properties - /// - /// The default display mode for the - /// ( property). true to display the scale - /// values, title, tic marks, false to hide the axis entirely. - /// - public static bool IsVisible = false; - /// - /// Determines if a line will be drawn at the zero value for the - /// , that is, a line that - /// divides the negative values from positive values. - /// . - /// - public static bool IsZeroLine = true; - } - #endregion - - #region Constructors - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class - /// - public Y2Axis() - : this( "Y2 Axis" ) - { - } - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class, except - /// for the axis title - /// - /// The for this axis - public Y2Axis( string title ) - : base( title ) - { - _isVisible = Default.IsVisible; - _majorGrid._isZeroLine = Default.IsZeroLine; - _scale._fontSpec.Angle = -90.0F; - } - - /// - /// The Copy Constructor - /// - /// The Y2Axis object from which to copy - public Y2Axis( Y2Axis rhs ) - : base( rhs ) - { - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Y2Axis Clone() - { - return new Y2Axis( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected Y2Axis( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - #region Methods - - /// - /// Setup the Transform Matrix to handle drawing of this - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void SetTransformMatrix( Graphics g, GraphPane pane, float scaleFactor ) - { - // Move the origin to the BottomRight of the ChartRect, which is the left - // side of the Y2 axis (facing from the label side) - g.TranslateTransform( pane.Chart._rect.Right, pane.Chart._rect.Bottom ); - // rotate so this axis is in the left-right direction - g.RotateTransform( -90 ); - } - - /// - /// Determines if this object is a "primary" one. - /// - /// - /// The primary axes are the (always), the first - /// in the - /// ( = 0), and the first - /// in the - /// ( = 0). Note that - /// and - /// always reference the primary axes. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// true for a primary , false otherwise - override internal bool IsPrimary( GraphPane pane ) - { - return this == pane.Y2Axis; - } - - /// - /// Calculate the "shift" size, in pixels, in order to shift the axis from its default - /// location to the value specified by . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The shift amount measured in pixels - internal override float CalcCrossShift( GraphPane pane ) - { - double effCross = EffectiveCrossValue( pane ); - - if ( !_crossAuto ) - return pane.XAxis.Scale.Transform( effCross ) - pane.XAxis.Scale._maxPix; - else - return 0; - } - /* - override internal bool IsCrossed( GraphPane pane ) - { - return !this.crossAuto && this.cross > pane.XAxis.Min && this.cross < pane.XAxis.Max; - } - */ - /// - /// Gets the "Cross" axis that corresponds to this axis. - /// - /// - /// The cross axis is the axis which determines the of this Axis when the - /// Axis.Cross property is used. The - /// cross axis for any or - /// is always the primary , and - /// the cross axis for any or is - /// always the primary . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - override public Axis GetCrossAxis( GraphPane pane ) - { - return pane.XAxis; - } - -// override internal float GetMinPix( GraphPane pane ) -// { -// return pane.Chart._rect.Top; -// } - - #endregion - - } -} - diff --git a/SDK/ZedGraphs/ZedGraph/Y2AxisList.cs b/SDK/ZedGraphs/ZedGraph/Y2AxisList.cs deleted file mode 100644 index 65d07ae..0000000 --- a/SDK/ZedGraphs/ZedGraph/Y2AxisList.cs +++ /dev/null @@ -1,188 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects. - /// - /// - /// John Champion - /// $Revision: 3.3 $ $Date: 2006-06-24 20:26:43 $ - [Serializable] - public class Y2AxisList : List, ICloneable - { - - #region Constructors - - /// - /// Default constructor for the collection class. - /// - public Y2AxisList() - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public Y2AxisList( Y2AxisList rhs ) - { - foreach ( Y2Axis item in rhs ) - { - this.Add( item.Clone() ); - } - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public Y2AxisList Clone() - { - return new Y2AxisList( this ); - } - - #endregion - - #region List Methods - - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// An object reference. - public new Y2Axis this[int index] - { - get { return ( ( ( index < 0 || index >= this.Count ) ? null : base[index] ) ); } - } - - /// - /// Indexer to access the specified object by - /// its string. - /// - /// The string title of the - /// object to be accessed. - /// A object reference. - public Y2Axis this[string title] - { - get - { - int index = IndexOf( title ); - if ( index >= 0 ) - return this[index]; - else - return null; - } - } - - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// The comparison of titles is not case sensitive, but it must include - /// all characters including punctuation, spaces, etc. - /// The label that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the was not found in the list - /// - public int IndexOf( string title ) - { - int index = 0; - foreach ( Y2Axis axis in this ) - { - if ( String.Compare( axis.Title._text, title, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// In order for this method to work, the - /// property must be of type . - /// The tag that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the string is not in the list - /// - public int IndexOfTag( string tagStr ) - { - int index = 0; - foreach ( Y2Axis axis in this ) - { - if ( axis.Tag is string && - String.Compare( (string)axis.Tag, tagStr, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - /// - /// Create a new and add it to this list. - /// - /// The title string for the new axis - /// An integer representing the ordinal position of the new in - /// this . This is the value that you would set the - /// property of a given to - /// assign it to this new . Note that, for a , - /// you would also need to set the property to true. - public int Add( string title ) - { - Y2Axis axis = new Y2Axis( title ); - Add( axis ); - - return Count - 1; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/YAxis.cs b/SDK/ZedGraphs/ZedGraph/YAxis.cs deleted file mode 100644 index 41109fa..0000000 --- a/SDK/ZedGraphs/ZedGraph/YAxis.cs +++ /dev/null @@ -1,255 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.Drawing; -using System.Runtime.Serialization; -using System.Security.Permissions; - -namespace ZedGraph -{ - /// - /// inherits from , and defines the - /// special characteristics of a vertical axis, specifically located on - /// the right side of the of the - /// object - /// - /// - /// John Champion - /// $Revision: 3.16 $ $Date: 2007-04-16 00:03:06 $ - [Serializable] - public class YAxis : Axis, ICloneable, ISerializable - { - #region Defaults - /// - /// A simple struct that defines the - /// default property values for the class. - /// - public new struct Default - { - // Default Y Axis properties - /// - /// The default display mode for the - /// ( property). true to display the scale - /// values, title, tic marks, false to hide the axis entirely. - /// - public static bool IsVisible = true; - /// - /// Determines if a line will be drawn at the zero value for the - /// , that is, a line that - /// divides the negative values from positive values. - /// . - /// - public static bool IsZeroLine = true; - } - #endregion - - #region Constructors - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class - /// - public YAxis() - : this( "Y Axis" ) - { - } - - /// - /// Default constructor that sets all properties to - /// default values as defined in the class, except - /// for the axis title - /// - /// The for this axis - public YAxis( string title ) - : base( title ) - { - _isVisible = Default.IsVisible; - _majorGrid._isZeroLine = Default.IsZeroLine; - _scale._fontSpec.Angle = 90.0F; - _title._fontSpec.Angle = -180F; - } - - /// - /// The Copy Constructor - /// - /// The YAxis object from which to copy - public YAxis( YAxis rhs ) - : base( rhs ) - { - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public YAxis Clone() - { - return new YAxis( this ); - } - - #endregion - - #region Serialization - /// - /// Current schema value that defines the version of the serialized file - /// - public const int schema2 = 10; - - /// - /// Constructor for deserializing objects - /// - /// A instance that defines the serialized data - /// - /// A instance that contains the serialized data - /// - protected YAxis( SerializationInfo info, StreamingContext context ) - : base( info, context ) - { - // The schema value is just a file version parameter. You can use it to make future versions - // backwards compatible as new member variables are added to classes - int sch = info.GetInt32( "schema2" ); - - } - /// - /// Populates a instance with the data needed to serialize the target object - /// - /// A instance that defines the serialized data - /// A instance that contains the serialized data - [SecurityPermissionAttribute( SecurityAction.Demand, SerializationFormatter = true )] - public override void GetObjectData( SerializationInfo info, StreamingContext context ) - { - base.GetObjectData( info, context ); - info.AddValue( "schema2", schema2 ); - } - #endregion - - #region Methods - /// - /// Setup the Transform Matrix to handle drawing of this - /// - /// - /// A graphic device object to be drawn into. This is normally e.Graphics from the - /// PaintEventArgs argument to the Paint() method. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// - /// The scaling factor to be used for rendering objects. This is calculated and - /// passed down by the parent object using the - /// method, and is used to proportionally adjust - /// font sizes, etc. according to the actual size of the graph. - /// - override public void SetTransformMatrix( Graphics g, GraphPane pane, float scaleFactor ) - { - // Move the origin to the TopLeft of the ChartRect, which is the left - // side of the axis (facing from the label side) - g.TranslateTransform( pane.Chart._rect.Left, pane.Chart._rect.Top ); - // rotate so this axis is in the left-right direction - g.RotateTransform( 90 ); - } - - /// - /// Determines if this object is a "primary" one. - /// - /// - /// The primary axes are the (always), the first - /// in the - /// ( = 0), and the first - /// in the - /// ( = 0). Note that - /// and - /// always reference the primary axes. - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// true for a primary , false otherwise - override internal bool IsPrimary( GraphPane pane ) - { - return this == pane.YAxis; - } - - /// - /// Calculate the "shift" size, in pixels, in order to shift the axis from its default - /// location to the value specified by . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - /// The shift amount measured in pixels - internal override float CalcCrossShift( GraphPane pane ) - { - double effCross = EffectiveCrossValue( pane ); - - if ( !_crossAuto ) - return pane.XAxis.Scale._minPix - pane.XAxis.Scale.Transform( effCross ); - else - return 0; - } - /* - override internal bool IsCrossed( GraphPane pane ) - { - return !this.crossAuto && this.cross > pane.XAxis.Min && this.cross < pane.XAxis.Max; - } - */ - /// - /// Gets the "Cross" axis that corresponds to this axis. - /// - /// - /// The cross axis is the axis which determines the of this Axis when the - /// Axis.Cross property is used. The - /// cross axis for any or - /// is always the primary , and - /// the cross axis for any or is - /// always the primary . - /// - /// - /// A reference to the object that is the parent or - /// owner of this object. - /// - override public Axis GetCrossAxis( GraphPane pane ) - { - return pane.XAxis; - } - - // override internal float GetMinPix( GraphPane pane ) - // { - // return pane.Chart._rect.Top; - // } - - - #endregion - } -} - diff --git a/SDK/ZedGraphs/ZedGraph/YAxisList.cs b/SDK/ZedGraphs/ZedGraph/YAxisList.cs deleted file mode 100644 index bd431d2..0000000 --- a/SDK/ZedGraphs/ZedGraph/YAxisList.cs +++ /dev/null @@ -1,187 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2005 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Collections.Generic; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; - -#endregion - -namespace ZedGraph -{ - /// - /// A collection class containing a list of objects. - /// - /// - /// John Champion - /// $Revision: 3.3 $ $Date: 2006-06-24 20:26:43 $ - [Serializable] - public class YAxisList : List, ICloneable - { - - #region Constructors - - /// - /// Default constructor for the collection class. - /// - public YAxisList() - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public YAxisList( YAxisList rhs ) - { - foreach ( YAxis item in rhs ) - { - this.Add( item.Clone() ); - } - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public YAxisList Clone() - { - return new YAxisList( this ); - } - - #endregion - - #region List Methods - - /// - /// Indexer to access the specified object by - /// its ordinal position in the list. - /// - /// The ordinal position (zero-based) of the - /// object to be accessed. - /// An object reference. - public new YAxis this[int index] - { - get { return ( ( ( index < 0 || index >= this.Count ) ? null : base[index] ) ); } - } - - /// - /// Indexer to access the specified object by - /// its string. - /// - /// The string title of the - /// object to be accessed. - /// A object reference. - public YAxis this[string title] - { - get - { - int index = IndexOf( title ); - if ( index >= 0 ) - return this[index]; - else - return null; - } - } - - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// The comparison of titles is not case sensitive, but it must include - /// all characters including punctuation, spaces, etc. - /// The label that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the was not found in the list - /// - public int IndexOf( string title ) - { - int index = 0; - foreach ( YAxis axis in this ) - { - if ( String.Compare( axis.Title._text, title, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - /// - /// Return the zero-based position index of the - /// with the specified . - /// - /// In order for this method to work, the - /// property must be of type . - /// - /// The tag that is in the - /// attribute of the item to be found. - /// - /// The zero-based index of the specified , - /// or -1 if the string is not in the list - public int IndexOfTag( string tagStr ) - { - int index = 0; - foreach ( YAxis axis in this ) - { - if ( axis.Tag is string && - String.Compare( (string)axis.Tag, tagStr, true ) == 0 ) - return index; - index++; - } - - return -1; - } - - /// - /// Create a new and add it to this list. - /// - /// The title string for the new axis - /// An integer representing the ordinal position of the new in - /// this . This is the value that you would set the - /// property of a given to - /// assign it to this new . - public int Add( string title ) - { - YAxis axis = new YAxis( title ); - Add( axis ); - - return Count - 1; - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraph.csproj b/SDK/ZedGraphs/ZedGraph/ZedGraph.csproj deleted file mode 100644 index 79d9c0d..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraph.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {B99650EE-AF46-47B4-A4A9-212ADE7809B7} - Library - Properties - ZedGraph - ZedGraph - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - UserControl - - - ZedGraphControl.cs - - - - - Designer - ZedGraphControl.cs - - - - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.ContextMenu.cs b/SDK/ZedGraphs/ZedGraph/ZedGraphControl.ContextMenu.cs deleted file mode 100644 index 8658efe..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.ContextMenu.cs +++ /dev/null @@ -1,892 +0,0 @@ -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using System.Windows.Forms; -using System.Threading; -using System.Drawing.Imaging; -using System.IO; -using System.Text; - -using System.Runtime.InteropServices; -//using System.Diagnostics; - -namespace ZedGraph -{ - partial class ZedGraphControl - { - - #region ContextMenu - - // Revision: JCarpenter 10/06 - /// - /// Public enumeration that specifies the type of - /// object present at the Context Menu's mouse location - /// - public enum ContextMenuObjectState - { - /// - /// The object is an Inactive Curve Item at the Context Menu's mouse position - /// - InactiveSelection, - /// - /// The object is an active Curve Item at the Context Menu's mouse position - /// - ActiveSelection, - /// - /// There is no selectable object present at the Context Menu's mouse position - /// - Background - } - - //Revision: JCarpenter 10/06 - /// - /// Find the object currently under the mouse cursor, and return its state. - /// - private ContextMenuObjectState GetObjectState() - { - ContextMenuObjectState objState = ContextMenuObjectState.Background; - - // Determine object state - Point mousePt = this.PointToClient( Control.MousePosition ); - int iPt; - GraphPane pane; - object nearestObj; - - using ( Graphics g = this.CreateGraphics() ) - { - if ( this.MasterPane.FindNearestPaneObject( mousePt, g, out pane, - out nearestObj, out iPt ) ) - { - CurveItem item = nearestObj as CurveItem; - - if ( item != null && iPt >= 0 ) - { - if ( item.IsSelected ) - objState = ContextMenuObjectState.ActiveSelection; - else - objState = ContextMenuObjectState.InactiveSelection; - } - } - } - - return objState; - } - - /// - /// protected method to handle the popup context menu in the . - /// - /// - /// - private void contextMenuStrip1_Opening( object sender, CancelEventArgs e ) - { - // disable context menu by default - e.Cancel = true; - ContextMenuStrip menuStrip = sender as ContextMenuStrip; - - //Revision: JCarpenter 10/06 - ContextMenuObjectState objState = GetObjectState(); - - if ( _masterPane != null && menuStrip != null ) - { - menuStrip.Items.Clear(); - - _isZooming = false; - _isPanning = false; - Cursor.Current = Cursors.Default; - - _menuClickPt = this.PointToClient( Control.MousePosition ); - GraphPane pane = _masterPane.FindPane( _menuClickPt ); - - if ( _isShowContextMenu ) - { - string menuStr = string.Empty; - - ToolStripMenuItem item = new ToolStripMenuItem(); - item.Name = "copy"; - item.Tag = "copy"; - item.Text = _resourceManager.GetString( "copy" ); - item.Click += new System.EventHandler( this.MenuClick_Copy ); - menuStrip.Items.Add( item ); - - item = new ToolStripMenuItem(); - item.Name = "save_as"; - item.Tag = "save_as"; - item.Text = _resourceManager.GetString( "save_as" ); - item.Click += new System.EventHandler( this.MenuClick_SaveAs ); - menuStrip.Items.Add( item ); - - item = new ToolStripMenuItem(); - item.Name = "page_setup"; - item.Tag = "page_setup"; - item.Text = _resourceManager.GetString( "page_setup" ); - item.Click += new System.EventHandler( this.MenuClick_PageSetup ); - menuStrip.Items.Add( item ); - - item = new ToolStripMenuItem(); - item.Name = "print"; - item.Tag = "print"; - item.Text = _resourceManager.GetString( "print" ); - item.Click += new System.EventHandler( this.MenuClick_Print ); - menuStrip.Items.Add( item ); - - item = new ToolStripMenuItem(); - item.Name = "show_val"; - item.Tag = "show_val"; - item.Text = _resourceManager.GetString( "show_val" ); - item.Click += new System.EventHandler( this.MenuClick_ShowValues ); - item.Checked = this.IsShowPointValues; - menuStrip.Items.Add( item ); - - item = new ToolStripMenuItem(); - item.Name = "unzoom"; - item.Tag = "unzoom"; - - if ( pane == null || pane.ZoomStack.IsEmpty ) - menuStr = _resourceManager.GetString( "unzoom" ); - else - { - switch ( pane.ZoomStack.Top.Type ) - { - case ZoomState.StateType.Zoom: - case ZoomState.StateType.WheelZoom: - menuStr = _resourceManager.GetString( "unzoom" ); - break; - case ZoomState.StateType.Pan: - menuStr = _resourceManager.GetString( "unpan" ); - break; - case ZoomState.StateType.Scroll: - menuStr = _resourceManager.GetString( "unscroll" ); - break; - } - } - - //menuItem.Text = "Un-" + ( ( pane == null || pane.zoomStack.IsEmpty ) ? - // "Zoom" : pane.zoomStack.Top.TypeString ); - item.Text = menuStr; - item.Click += new EventHandler( this.MenuClick_ZoomOut ); - if ( pane == null || pane.ZoomStack.IsEmpty ) - item.Enabled = false; - menuStrip.Items.Add( item ); - - item = new ToolStripMenuItem(); - item.Name = "undo_all"; - item.Tag = "undo_all"; - menuStr = _resourceManager.GetString( "undo_all" ); - item.Text = menuStr; - item.Click += new EventHandler( this.MenuClick_ZoomOutAll ); - if ( pane == null || pane.ZoomStack.IsEmpty ) - item.Enabled = false; - menuStrip.Items.Add( item ); - - item = new ToolStripMenuItem(); - item.Name = "set_default"; - item.Tag = "set_default"; - menuStr = _resourceManager.GetString( "set_default" ); - item.Text = menuStr; - item.Click += new EventHandler( this.MenuClick_RestoreScale ); - if ( pane == null ) - item.Enabled = false; - menuStrip.Items.Add( item ); - - // if e.Cancel is set to false, the context menu does not display - // it is initially set to false because the context menu has no items - e.Cancel = false; - - // Provide Callback for User to edit the context menu - //Revision: JCarpenter 10/06 - add ContextMenuObjectState objState - if ( this.ContextMenuBuilder != null ) - this.ContextMenuBuilder( this, menuStrip, _menuClickPt, objState ); - } - } - } - - /// - /// Handler for the "Copy" context menu item. Copies the current image to a bitmap on the - /// clipboard. - /// - /// - /// - protected void MenuClick_Copy( System.Object sender, System.EventArgs e ) - { - Copy( _isShowCopyMessage ); - } - - /// - /// Handler for the "Copy" context menu item. Copies the current image to a bitmap on the - /// clipboard. - /// - /// boolean value that determines whether or not a prompt will be - /// displayed. true to show a message of "Image Copied to ClipBoard". - public void Copy( bool isShowMessage ) - { - if ( _masterPane != null ) - { - //Clipboard.SetDataObject( _masterPane.GetImage(), true ); - - // Threaded copy mode to avoid crash with MTA - // Contributed by Dave Moor - Thread ct = new Thread( new ThreadStart( this.ClipboardCopyThread ) ); - //ct.ApartmentState = ApartmentState.STA; - ct.SetApartmentState( ApartmentState.STA ); - ct.Start(); - ct.Join(); - - if ( isShowMessage ) - { - string str = _resourceManager.GetString( "copied_to_clip" ); - //MessageBox.Show( "Image Copied to ClipBoard" ); - MessageBox.Show( str ); - } - } - } - - /// - /// A threaded version of the copy method to avoid crash with MTA - /// - private void ClipboardCopyThread() - { - Clipboard.SetDataObject( ImageRender(), true ); - } - - // - /// - /// Setup for creation of a new image, applying appropriate anti-alias properties and - /// returning the resultant image file - /// - /// - private Image ImageRender() - { - return _masterPane.GetImage( _masterPane.IsAntiAlias ); - } - - /// - /// Special handler that copies the current image to an Emf file on the clipboard. - /// - /// This version is similar to the regular method, except that - /// it will place an Emf image (vector) on the ClipBoard instead of the regular bitmap. - /// boolean value that determines whether or not a prompt will be - /// displayed. true to show a message of "Image Copied to ClipBoard". - public void CopyEmf(bool isShowMessage) - { - if (_masterPane != null) - { - // Threaded copy mode to avoid crash with MTA - // Contributed by Dave Moor - Thread ct = new Thread(new ThreadStart(this.ClipboardCopyThreadEmf)); - //ct.ApartmentState = ApartmentState.STA; - ct.SetApartmentState(ApartmentState.STA); - ct.Start(); - ct.Join(); - - if (isShowMessage) - { - string str = _resourceManager.GetString("copied_to_clip"); - MessageBox.Show(str); - } - } - } - - /// - /// A threaded version of the copy method to avoid crash with MTA - /// - private void ClipboardCopyThreadEmf() - { - using (Graphics g = this.CreateGraphics()) - { - IntPtr hdc = g.GetHdc(); - Metafile metaFile = new Metafile(hdc, EmfType.EmfPlusOnly); - g.ReleaseHdc(hdc); - - using (Graphics gMeta = Graphics.FromImage(metaFile)) - { - this._masterPane.Draw( gMeta ); - } - - //IntPtr hMeta = metaFile.GetHenhmetafile(); - ClipboardMetafileHelper.PutEnhMetafileOnClipboard( this.Handle, metaFile ); - //System.Windows.Forms.Clipboard.SetDataObject(hMeta, true); - - //g.Dispose(); - } - } - - /// - /// Handler for the "Save Image As" context menu item. Copies the current image to the selected - /// file. - /// - /// - /// - protected void MenuClick_SaveAs( System.Object sender, System.EventArgs e ) - { - SaveAs(); - } - - /// - /// Handler for the "Save Image As" context menu item. Copies the current image to the selected - /// file in either the Emf (vector), or a variety of Bitmap formats. - /// - /// - /// Note that and methods are provided - /// which allow for Bitmap-only or Emf-only handling of the "Save As" context menu item. - /// - public void SaveAs() - { - SaveAs( null ); - } - - /// - /// Copies the current image to the selected file in - /// Emf (vector), or a variety of Bitmap formats. - /// - /// - /// Accepts a default file name for the file dialog (if "" or null, default is not used) - /// - /// - /// The file name saved, or "" if cancelled. - /// - /// - /// Note that and methods are provided - /// which allow for Bitmap-only or Emf-only handling of the "Save As" context menu item. - /// - public String SaveAs( String DefaultFileName ) - { - if ( _masterPane != null ) - { - _saveFileDialog.Filter = - "Emf Format (*.emf)|*.emf|" + - "PNG Format (*.png)|*.png|" + - "Gif Format (*.gif)|*.gif|" + - "Jpeg Format (*.jpg)|*.jpg|" + - "Tiff Format (*.tif)|*.tif|" + - "Bmp Format (*.bmp)|*.bmp"; - - if ( DefaultFileName != null && DefaultFileName.Length > 0 ) - { - String ext = System.IO.Path.GetExtension( DefaultFileName ).ToLower(); - switch (ext) - { - case ".emf": _saveFileDialog.FilterIndex = 1; break; - case ".png": _saveFileDialog.FilterIndex = 2; break; - case ".gif": _saveFileDialog.FilterIndex = 3; break; - case ".jpeg": - case ".jpg": _saveFileDialog.FilterIndex = 4; break; - case ".tiff": - case ".tif": _saveFileDialog.FilterIndex = 5; break; - case ".bmp": _saveFileDialog.FilterIndex = 6; break; - } - //If we were passed a file name, not just an extension, use it - if ( DefaultFileName.Length > ext.Length ) - { - _saveFileDialog.FileName = DefaultFileName; - } - } - - if ( _saveFileDialog.ShowDialog() == DialogResult.OK ) - { - Stream myStream = _saveFileDialog.OpenFile(); - if ( myStream != null ) - { - if ( _saveFileDialog.FilterIndex == 1 ) - { - myStream.Close(); - SaveEmfFile( _saveFileDialog.FileName ); - } - else - { - ImageFormat format = ImageFormat.Png; - switch (_saveFileDialog.FilterIndex) - { - case 2: format = ImageFormat.Png; break; - case 3: format = ImageFormat.Gif; break; - case 4: format = ImageFormat.Jpeg; break; - case 5: format = ImageFormat.Tiff; break; - case 6: format = ImageFormat.Bmp; break; - } - - ImageRender().Save( myStream, format ); - //_masterPane.GetImage().Save( myStream, format ); - myStream.Close(); - } - return _saveFileDialog.FileName; - } - } - } - return ""; - } - - /// - /// Handler for the "Save Image As" context menu item. Copies the current image to the selected - /// Bitmap file. - /// - /// - /// Note that this handler saves as a bitmap only. The default handler is - /// , which allows for Bitmap or EMF formats - /// - public void SaveAsBitmap() - { - if ( _masterPane != null ) - { - _saveFileDialog.Filter = - "PNG Format (*.png)|*.png|" + - "Gif Format (*.gif)|*.gif|" + - "Jpeg Format (*.jpg)|*.jpg|" + - "Tiff Format (*.tif)|*.tif|" + - "Bmp Format (*.bmp)|*.bmp"; - - if ( _saveFileDialog.ShowDialog() == DialogResult.OK ) - { - ImageFormat format = ImageFormat.Png; - if ( _saveFileDialog.FilterIndex == 2 ) - format = ImageFormat.Gif; - else if ( _saveFileDialog.FilterIndex == 3 ) - format = ImageFormat.Jpeg; - else if ( _saveFileDialog.FilterIndex == 4 ) - format = ImageFormat.Tiff; - else if ( _saveFileDialog.FilterIndex == 5 ) - format = ImageFormat.Bmp; - - Stream myStream = _saveFileDialog.OpenFile(); - if ( myStream != null ) - { - //_masterPane.GetImage().Save( myStream, format ); - ImageRender().Save( myStream, format ); - myStream.Close(); - } - } - } - } - - /// - /// Handler for the "Save Image As" context menu item. Copies the current image to the selected - /// Emf format file. - /// - /// - /// Note that this handler saves as an Emf format only. The default handler is - /// , which allows for Bitmap or EMF formats. - /// - public void SaveAsEmf() - { - if ( _masterPane != null ) - { - _saveFileDialog.Filter = "Emf Format (*.emf)|*.emf"; - - if ( _saveFileDialog.ShowDialog() == DialogResult.OK ) - { - Stream myStream = _saveFileDialog.OpenFile(); - if ( myStream != null ) - { - myStream.Close(); - //_masterPane.GetMetafile().Save( _saveFileDialog.FileName ); - SaveEmfFile(_saveFileDialog.FileName); - } - } - } - } - - /// - /// Save the current Graph to the specified filename in EMF (vector) format. - /// See for public access. - /// - /// - /// Note that this handler saves as an Emf format only. The default handler is - /// , which allows for Bitmap or EMF formats. - /// - internal void SaveEmfFile( string fileName ) - { - using (Graphics g = this.CreateGraphics()) - { - IntPtr hdc = g.GetHdc(); - Metafile metaFile = new Metafile(hdc, EmfType.EmfPlusOnly); - using (Graphics gMeta = Graphics.FromImage(metaFile)) - { - //PaneBase.SetAntiAliasMode( gMeta, IsAntiAlias ); - //gMeta.CompositingMode = CompositingMode.SourceCopy; - //gMeta.CompositingQuality = CompositingQuality.HighQuality; - //gMeta.InterpolationMode = InterpolationMode.HighQualityBicubic; - //gMeta.SmoothingMode = SmoothingMode.AntiAlias; - //gMeta.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; - this._masterPane.Draw(gMeta); - //gMeta.Dispose(); - } - - ClipboardMetafileHelper.SaveEnhMetafileToFile(metaFile, fileName ); - - g.ReleaseHdc(hdc); - //g.Dispose(); - } - - } - - internal class ClipboardMetafileHelper - { - [DllImport("user32.dll")] - static extern bool OpenClipboard(IntPtr hWndNewOwner); - [DllImport("user32.dll")] - static extern bool EmptyClipboard(); - [DllImport("user32.dll")] - static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem); - [DllImport("user32.dll")] - static extern bool CloseClipboard(); - [DllImport("gdi32.dll")] - static extern IntPtr CopyEnhMetaFile(IntPtr hemfSrc, System.Text.StringBuilder hNULL); - [DllImport("gdi32.dll")] - static extern bool DeleteEnhMetaFile(IntPtr hemf); - - static internal bool SaveEnhMetafileToFile( Metafile mf, string fileName ) - { - bool bResult = false; - IntPtr hEMF; - hEMF = mf.GetHenhmetafile(); // invalidates mf - if (!hEMF.Equals(new IntPtr(0))) - { - StringBuilder tempName = new StringBuilder(fileName); - CopyEnhMetaFile(hEMF, tempName); - DeleteEnhMetaFile(hEMF); - } - return bResult; - } - - static internal bool SaveEnhMetafileToFile(Metafile mf) - { - bool bResult = false; - IntPtr hEMF; - hEMF = mf.GetHenhmetafile(); // invalidates mf - if (!hEMF.Equals(new IntPtr(0))) - { - SaveFileDialog sfd = new SaveFileDialog(); - sfd.Filter = "Extended Metafile (*.emf)|*.emf"; - sfd.DefaultExt = ".emf"; - if (sfd.ShowDialog() == DialogResult.OK) - { - StringBuilder temp = new StringBuilder(sfd.FileName); - CopyEnhMetaFile(hEMF, temp); - } - DeleteEnhMetaFile(hEMF); - } - return bResult; - } - - // Metafile mf is set to a state that is not valid inside this function. - static internal bool PutEnhMetafileOnClipboard(IntPtr hWnd, Metafile mf) - { - bool bResult = false; - IntPtr hEMF, hEMF2; - hEMF = mf.GetHenhmetafile(); // invalidates mf - if (!hEMF.Equals(new IntPtr(0))) - { - hEMF2 = CopyEnhMetaFile(hEMF, null); - if (!hEMF2.Equals(new IntPtr(0))) - { - if (OpenClipboard(hWnd)) - { - if (EmptyClipboard()) - { - IntPtr hRes = SetClipboardData(14 /*CF_ENHMETAFILE*/, hEMF2); - bResult = hRes.Equals(hEMF2); - CloseClipboard(); - } - } - } - DeleteEnhMetaFile(hEMF); - } - return bResult; - } - } - - /// - /// Handler for the "Show Values" context menu item. Toggles the - /// property, which activates the point value tooltips. - /// - /// - /// - protected void MenuClick_ShowValues( object sender, System.EventArgs e ) - { - ToolStripMenuItem item = sender as ToolStripMenuItem; - if ( item != null ) - this.IsShowPointValues = !item.Checked; - } - - /// - /// Handler for the "Set Scale to Default" context menu item. Sets the scale ranging to - /// full auto mode for all axes. - /// - /// - /// This method differs from the method in that it sets the scales - /// to full auto mode. The method sets the scales to their initial - /// setting prior to any user actions (which may or may not be full auto mode). - /// - /// - /// - protected void MenuClick_RestoreScale( object sender, EventArgs e ) - { - if ( _masterPane != null ) - { - GraphPane pane = _masterPane.FindPane( _menuClickPt ); - RestoreScale( pane ); - } - } - - /// - /// Handler for the "Set Scale to Default" context menu item. Sets the scale ranging to - /// full auto mode for all axes. - /// - /// - /// This method differs from the method in that it sets the scales - /// to full auto mode. The method sets the scales to their initial - /// setting prior to any user actions (which may or may not be full auto mode). - /// - /// The object which is to have the - /// scale restored - public void RestoreScale( GraphPane primaryPane ) - { - if ( primaryPane != null ) - { - //Go ahead and save the old zoomstates, which provides an "undo"-like capability - //ZoomState oldState = primaryPane.ZoomStack.Push( primaryPane, ZoomState.StateType.Zoom ); - ZoomState oldState = new ZoomState( primaryPane, ZoomState.StateType.Zoom ); - - using ( Graphics g = this.CreateGraphics() ) - { - if ( _isSynchronizeXAxes || _isSynchronizeYAxes ) - { - foreach ( GraphPane pane in _masterPane._paneList ) - { - pane.ZoomStack.Push( pane, ZoomState.StateType.Zoom ); - ResetAutoScale( pane, g ); - } - } - else - { - primaryPane.ZoomStack.Push( primaryPane, ZoomState.StateType.Zoom ); - ResetAutoScale( primaryPane, g ); - } - - // Provide Callback to notify the user of zoom events - if ( this.ZoomEvent != null ) - this.ZoomEvent( this, oldState, new ZoomState( primaryPane, ZoomState.StateType.Zoom ) ); - - //g.Dispose(); - } - Refresh(); - } - } - - private void ResetAutoScale( GraphPane pane, Graphics g ) - { - pane.XAxis.ResetAutoScale( pane, g ); - pane.X2Axis.ResetAutoScale( pane, g ); - foreach ( YAxis axis in pane.YAxisList ) - axis.ResetAutoScale( pane, g ); - foreach ( Y2Axis axis in pane.Y2AxisList ) - axis.ResetAutoScale( pane, g ); - } - - /* - public void RestoreScale( GraphPane primaryPane ) - { - if ( primaryPane != null ) - { - Graphics g = this.CreateGraphics(); - ZoomState oldState = new ZoomState( primaryPane, ZoomState.StateType.Zoom ); - //ZoomState newState = null; - - if ( _isSynchronizeXAxes || _isSynchronizeYAxes ) - { - foreach ( GraphPane pane in _masterPane._paneList ) - { - if ( pane == primaryPane ) - { - pane.XAxis.ResetAutoScale( pane, g ); - foreach ( YAxis axis in pane.YAxisList ) - axis.ResetAutoScale( pane, g ); - foreach ( Y2Axis axis in pane.Y2AxisList ) - axis.ResetAutoScale( pane, g ); - } - } - } - else - { - primaryPane.XAxis.ResetAutoScale( primaryPane, g ); - foreach ( YAxis axis in primaryPane.YAxisList ) - axis.ResetAutoScale( primaryPane, g ); - foreach ( Y2Axis axis in primaryPane.Y2AxisList ) - axis.ResetAutoScale( primaryPane, g ); - } - - // Provide Callback to notify the user of zoom events - if ( this.ZoomEvent != null ) - this.ZoomEvent( this, oldState, new ZoomState( primaryPane, ZoomState.StateType.Zoom ) ); - - g.Dispose(); - Refresh(); - } - } - */ - /* - public void ZoomOutAll( GraphPane primaryPane ) - { - if ( primaryPane != null && !primaryPane.ZoomStack.IsEmpty ) - { - ZoomState.StateType type = primaryPane.ZoomStack.Top.Type; - - ZoomState oldState = new ZoomState( primaryPane, type ); - //ZoomState newState = pane.ZoomStack.PopAll( pane ); - ZoomState newState = null; - if ( _isSynchronizeXAxes || _isSynchronizeYAxes ) - { - foreach ( GraphPane pane in _masterPane._paneList ) - { - ZoomState state = pane.ZoomStack.PopAll( pane ); - if ( pane == primaryPane ) - newState = state; - } - } - else - newState = primaryPane.ZoomStack.PopAll( primaryPane ); - - // Provide Callback to notify the user of zoom events - if ( this.ZoomEvent != null ) - this.ZoomEvent( this, oldState, newState ); - - Refresh(); - } - } - - */ - - /// - /// Handler for the "UnZoom/UnPan" context menu item. Restores the scale ranges to the values - /// before the last zoom or pan operation. - /// - /// - /// - protected void MenuClick_ZoomOut( System.Object sender, System.EventArgs e ) - { - if ( _masterPane != null ) - { - GraphPane pane = _masterPane.FindPane( _menuClickPt ); - ZoomOut( pane ); - } - } - - /// - /// Handler for the "UnZoom/UnPan" context menu item. Restores the scale ranges to the values - /// before the last zoom, pan, or scroll operation. - /// - /// - /// Triggers a for any type of undo (including pan, scroll, zoom, and - /// wheelzoom). This method will affect all the - /// objects in the if - /// or is true. - /// - /// The primary object which is to be - /// zoomed out - public void ZoomOut( GraphPane primaryPane ) - { - if ( primaryPane != null && !primaryPane.ZoomStack.IsEmpty ) - { - ZoomState.StateType type = primaryPane.ZoomStack.Top.Type; - - ZoomState oldState = new ZoomState( primaryPane, type ); - ZoomState newState = null; - if ( _isSynchronizeXAxes || _isSynchronizeYAxes ) - { - foreach ( GraphPane pane in _masterPane._paneList ) - { - ZoomState state = pane.ZoomStack.Pop( pane ); - if ( pane == primaryPane ) - newState = state; - } - } - else - newState = primaryPane.ZoomStack.Pop( primaryPane ); - - // Provide Callback to notify the user of zoom events - if ( this.ZoomEvent != null ) - this.ZoomEvent( this, oldState, newState ); - - Refresh(); - } - } - - /// - /// Handler for the "Undo All Zoom/Pan" context menu item. Restores the scale ranges to the values - /// before all zoom and pan operations - /// - /// - /// This method differs from the method in that it sets the scales - /// to their initial setting prior to any user actions. The method - /// sets the scales to full auto mode (regardless of what the initial setting may have been). - /// - /// - /// - protected void MenuClick_ZoomOutAll( System.Object sender, System.EventArgs e ) - { - if ( _masterPane != null ) - { - GraphPane pane = _masterPane.FindPane( _menuClickPt ); - ZoomOutAll( pane ); - } - } - - /// - /// Handler for the "Undo All Zoom/Pan" context menu item. Restores the scale ranges to the values - /// before all zoom and pan operations - /// - /// - /// This method differs from the method in that it sets the scales - /// to their initial setting prior to any user actions. The method - /// sets the scales to full auto mode (regardless of what the initial setting may have been). - /// - /// The object which is to be zoomed out - public void ZoomOutAll( GraphPane primaryPane ) - { - if ( primaryPane != null && !primaryPane.ZoomStack.IsEmpty ) - { - ZoomState.StateType type = primaryPane.ZoomStack.Top.Type; - - ZoomState oldState = new ZoomState( primaryPane, type ); - //ZoomState newState = pane.ZoomStack.PopAll( pane ); - ZoomState newState = null; - if ( _isSynchronizeXAxes || _isSynchronizeYAxes ) - { - foreach ( GraphPane pane in _masterPane._paneList ) - { - ZoomState state = pane.ZoomStack.PopAll( pane ); - if ( pane == primaryPane ) - newState = state; - } - } - else - newState = primaryPane.ZoomStack.PopAll( primaryPane ); - - // Provide Callback to notify the user of zoom events - if ( this.ZoomEvent != null ) - this.ZoomEvent( this, oldState, newState ); - - Refresh(); - } - } - - #endregion - - } -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Designer.cs b/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Designer.cs deleted file mode 100644 index 0b5a92f..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Designer.cs +++ /dev/null @@ -1,78 +0,0 @@ -namespace ZedGraph -{ - partial class ZedGraphControl - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.vScrollBar1 = new System.Windows.Forms.VScrollBar(); - this.hScrollBar1 = new System.Windows.Forms.HScrollBar(); - this.pointToolTip = new System.Windows.Forms.ToolTip( this.components ); - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip( this.components ); - this.SuspendLayout(); - // - // vScrollBar1 - // - this.vScrollBar1.Location = new System.Drawing.Point( 128, 0 ); - this.vScrollBar1.Name = "vScrollBar1"; - this.vScrollBar1.Size = new System.Drawing.Size( 17, 128 ); - this.vScrollBar1.TabIndex = 0; - //this.vScrollBar1.MouseCaptureChanged += new System.EventHandler( this.ScrollBarMouseCaptureChanged ); - this.vScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler( this.vScrollBar1_Scroll ); - // - // hScrollBar1 - // - this.hScrollBar1.Location = new System.Drawing.Point( 0, 128 ); - this.hScrollBar1.Name = "hScrollBar1"; - this.hScrollBar1.Size = new System.Drawing.Size( 128, 17 ); - this.hScrollBar1.TabIndex = 1; - //this.hScrollBar1.MouseCaptureChanged += new System.EventHandler( this.ScrollBarMouseCaptureChanged ); - this.hScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler( this.hScrollBar1_Scroll ); - // - // pointToolTip - // - this.pointToolTip.AutoPopDelay = 5000; - this.pointToolTip.InitialDelay = 100; - this.pointToolTip.ReshowDelay = 0; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size( 61, 4 ); - this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler( this.contextMenuStrip1_Opening ); - // - // ZedGraphControl - // - this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F ); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ContextMenuStrip = this.contextMenuStrip1; - this.Controls.Add( this.hScrollBar1 ); - this.Controls.Add( this.vScrollBar1 ); - this.Name = "ZedGraphControl"; - this.Resize += new System.EventHandler( this.ZedGraphControl_ReSize ); - this.KeyUp += new System.Windows.Forms.KeyEventHandler( this.ZedGraphControl_KeyUp ); - this.KeyDown += new System.Windows.Forms.KeyEventHandler( this.ZedGraphControl_KeyDown ); - this.MouseWheel += new System.Windows.Forms.MouseEventHandler( this.ZedGraphControl_MouseWheel ); - this.ResumeLayout( false ); - - } - - #endregion - - private System.Windows.Forms.VScrollBar vScrollBar1; - private System.Windows.Forms.HScrollBar hScrollBar1; - private System.Windows.Forms.ToolTip pointToolTip; - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Events.cs b/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Events.cs deleted file mode 100644 index e76aeeb..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Events.cs +++ /dev/null @@ -1,1557 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2007 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Windows.Forms; -using System.Diagnostics; - -namespace ZedGraph -{ - partial class ZedGraphControl - { - - #region Events - - /// - /// A delegate that allows subscribing methods to append or modify the context menu. - /// - /// The source object - /// A reference to the object - /// that contains the context menu. - /// - /// The point at which the mouse was clicked - /// The current context menu state - /// - public delegate void ContextMenuBuilderEventHandler( ZedGraphControl sender, - ContextMenuStrip menuStrip, Point mousePt, ContextMenuObjectState objState ); - /// - /// Subscribe to this event to be able to modify the ZedGraph context menu. - /// - /// - /// The context menu is built on the fly after a right mouse click. You can add menu items - /// to this menu by simply modifying the parameter. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to this event to be able to modify the ZedGraph context menu" )] - public event ContextMenuBuilderEventHandler ContextMenuBuilder; - - /// - /// A delegate that allows notification of zoom and pan events. - /// - /// The source object - /// A object that corresponds to the state of the - /// before the zoom or pan event. - /// A object that corresponds to the state of the - /// after the zoom or pan event - /// - public delegate void ZoomEventHandler( ZedGraphControl sender, ZoomState oldState, - ZoomState newState ); - - /// - /// Subscribe to this event to be notified when the is zoomed or panned by the user, - /// either via a mouse drag operation or by the context menu commands. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to this event to be notified when the graph is zoomed or panned" )] - public event ZoomEventHandler ZoomEvent; - - /// - /// A delegate that allows notification of scroll events. - /// - /// The source object - /// The source object - /// A object that corresponds to the state of the - /// before the scroll event. - /// A object that corresponds to the state of the - /// after the scroll event - /// - public delegate void ScrollDoneHandler( ZedGraphControl sender, ScrollBar scrollBar, - ZoomState oldState, ZoomState newState ); - - /// - /// Subscribe to this event to be notified when the is scrolled by the user - /// using the scrollbars. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe this event to be notified when a scroll operation using the scrollbars is completed" )] - public event ScrollDoneHandler ScrollDoneEvent; - - /// - /// A delegate that allows notification of scroll events. - /// - /// The source object - /// The source object - /// A object that corresponds to the state of the - /// before the scroll event. - /// A object that corresponds to the state of the - /// after the scroll event - /// - public delegate void ScrollProgressHandler( ZedGraphControl sender, ScrollBar scrollBar, - ZoomState oldState, ZoomState newState ); - - /// - /// Subscribe to this event to be notified when the is scrolled by the user - /// using the scrollbars. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe this event to be notified continuously as a scroll operation is taking place" )] - public event ScrollProgressHandler ScrollProgressEvent; - - /// - /// Subscribe to this event to be notified when the is scrolled by the user - /// using the scrollbars. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe this event to be notified of general scroll events" )] - public event ScrollEventHandler ScrollEvent; - - /// - /// A delegate that receives notification after a point-edit operation is completed. - /// - /// The source object - /// The object that contains the - /// point that has been edited - /// The object that contains the point - /// that has been edited - /// The integer index of the edited within the - /// of the selected - /// - /// - public delegate string PointEditHandler( ZedGraphControl sender, GraphPane pane, - CurveItem curve, int iPt ); - - /// - /// Subscribe to this event to receive notifcation and/or respond after a data - /// point has been edited via and . - /// - /// - /// To subscribe to this event, use the following in your Form_Load method: - /// zedGraphControl1.PointEditEvent += - /// new ZedGraphControl.PointEditHandler( MyPointEditHandler ); - /// Add this method to your Form1.cs: - /// - /// private string MyPointEditHandler( object sender, GraphPane pane, CurveItem curve, int iPt ) - /// { - /// PointPair pt = curve[iPt]; - /// return "This value is " + pt.Y.ToString("f2") + " gallons"; - /// } - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to this event to respond to data point edit actions" )] - public event PointEditHandler PointEditEvent; - - /// - /// A delegate that allows custom formatting of the point value tooltips - /// - /// The source object - /// The object that contains the point value of interest - /// The object that contains the point value of interest - /// The integer index of the selected within the - /// of the selected - /// - public delegate string PointValueHandler( ZedGraphControl sender, GraphPane pane, - CurveItem curve, int iPt ); - - /// - /// Subscribe to this event to provide custom formatting for the tooltips - /// - /// - /// To subscribe to this event, use the following in your FormLoad method: - /// zedGraphControl1.PointValueEvent += - /// new ZedGraphControl.PointValueHandler( MyPointValueHandler ); - /// Add this method to your Form1.cs: - /// - /// private string MyPointValueHandler( object sender, GraphPane pane, CurveItem curve, int iPt ) - /// { - /// #region - /// PointPair pt = curve[iPt]; - /// return "This value is " + pt.Y.ToString("f2") + " gallons"; - /// #endregion - /// } - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to this event to provide custom-formatting for data point tooltips" )] - public event PointValueHandler PointValueEvent; - - /// - /// A delegate that allows custom formatting of the cursor value tooltips - /// - /// The source object - /// The object that contains the cursor of interest - /// The object that represents the cursor value location - /// - public delegate string CursorValueHandler( ZedGraphControl sender, GraphPane pane, - Point mousePt ); - - /// - /// Subscribe to this event to provide custom formatting for the cursor value tooltips - /// - /// - /// To subscribe to this event, use the following in your FormLoad method: - /// zedGraphControl1.CursorValueEvent += - /// new ZedGraphControl.CursorValueHandler( MyCursorValueHandler ); - /// Add this method to your Form1.cs: - /// - /// private string MyCursorValueHandler( object sender, GraphPane pane, Point mousePt ) - /// { - /// #region - /// double x, y; - /// pane.ReverseTransform( mousePt, out x, out y ); - /// return "( " + x.ToString( "f2" ) + ", " + y.ToString( "f2" ) + " )"; - /// #endregion - /// } - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to this event to provide custom-formatting for cursor value tooltips" )] - public event CursorValueHandler CursorValueEvent; - - /// - /// A delegate that allows notification of mouse events on Graph objects. - /// - /// The source object - /// A corresponding to this event - /// - /// - /// Return true if you have handled the mouse event entirely, and you do not - /// want the to do any further action (e.g., starting - /// a zoom operation). Return false if ZedGraph should go ahead and process the - /// mouse event. - /// - public delegate bool ZedMouseEventHandler( ZedGraphControl sender, MouseEventArgs e ); - - public delegate bool ZedEditDragHandler(ZedGraphControl sender, - PointPair newPointPosition, - int pointBeingEditedIndex, - CurveItem curveBeingEdited); - - /// - /// Subscribe to this event to provide notification of MouseDown clicks on graph - /// objects - /// - /// - /// This event provides for a notification when the mouse is clicked on an object - /// within any of the associated - /// with this . This event will use the - /// method to determine which object - /// was clicked. The boolean value that you return from this handler determines whether - /// or not the will do any further handling of the - /// MouseDown event (see ). Return true if you have - /// handled the MouseDown event entirely, and you do not - /// want the to do any further action (e.g., starting - /// a zoom operation). Return false if ZedGraph should go ahead and process the - /// MouseDown event. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to be notified when the left mouse button is clicked down" )] - public event ZedMouseEventHandler MouseDownEvent; - - /// - /// Hide the standard control MouseDown event so that the ZedGraphControl.MouseDownEvent - /// can be used. This is so that the user must return true/false in order to indicate - /// whether or not we should respond to the event. - /// - [Bindable( false ), Browsable( false )] - public new event MouseEventHandler MouseDown; - /// - /// Hide the standard control MouseUp event so that the ZedGraphControl.MouseUpEvent - /// can be used. This is so that the user must return true/false in order to indicate - /// whether or not we should respond to the event. - /// - [Bindable( false ), Browsable( false )] - public new event MouseEventHandler MouseUp; - /// - /// Hide the standard control MouseMove event so that the ZedGraphControl.MouseMoveEvent - /// can be used. This is so that the user must return true/false in order to indicate - /// whether or not we should respond to the event. - /// - [Bindable( false ), Browsable( false )] - private new event MouseEventHandler MouseMove; - - /// - /// Subscribe to be notified when a point is dragged. - /// - /// - /// Return false if you want to cancel the drag event. Return true otherwise. - /// - [Bindable(true), Category("Events"), - Description("Subscribe to be notified when a point is dragged")] - public event ZedEditDragHandler EditDragEvent; - - /// - /// Subscribe to this event to provide notification of MouseUp clicks on graph - /// objects - /// - /// - /// This event provides for a notification when the mouse is clicked on an object - /// within any of the associated - /// with this . This event will use the - /// method to determine which object - /// was clicked. The boolean value that you return from this handler determines whether - /// or not the will do any further handling of the - /// MouseUp event (see ). Return true if you have - /// handled the MouseUp event entirely, and you do not - /// want the to do any further action (e.g., starting - /// a zoom operation). Return false if ZedGraph should go ahead and process the - /// MouseUp event. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to be notified when the left mouse button is released" )] - public event ZedMouseEventHandler MouseUpEvent; - /// - /// Subscribe to this event to provide notification of MouseMove events over graph - /// objects - /// - /// - /// This event provides for a notification when the mouse is moving over on the control. - /// The boolean value that you return from this handler determines whether - /// or not the will do any further handling of the - /// MouseMove event (see ). Return true if you - /// have handled the MouseMove event entirely, and you do not - /// want the to do any further action. - /// Return false if ZedGraph should go ahead and process the MouseMove event. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to be notified when the mouse is moved inside the control" )] - public event ZedMouseEventHandler MouseMoveEvent; - - /// - /// Subscribe to this event to provide notification of Double Clicks on graph - /// objects - /// - /// - /// This event provides for a notification when the mouse is double-clicked on an object - /// within any of the associated - /// with this . This event will use the - /// method to determine which object - /// was clicked. The boolean value that you return from this handler determines whether - /// or not the will do any further handling of the - /// DoubleClick event (see ). Return true if you have - /// handled the DoubleClick event entirely, and you do not - /// want the to do any further action. - /// Return false if ZedGraph should go ahead and process the - /// DoubleClick event. - /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to be notified when the left mouse button is double-clicked" )] - public event ZedMouseEventHandler DoubleClickEvent; - - /// - /// A delegate that allows notification of clicks on ZedGraph objects that have - /// active links enabled - /// - /// The source object - /// The source in which the click - /// occurred. - /// - /// The source object which was clicked. This is typically - /// a type of if a curve point was clicked, or - /// a type of if a graph object was clicked. - /// - /// The object, belonging to - /// , that contains the link information - /// - /// An index value, typically used if a - /// was clicked, indicating the ordinal value of the actual point that was clicked. - /// - /// - /// Return true if you have handled the LinkEvent entirely, and you do not - /// want the to do any further action. - /// Return false if ZedGraph should go ahead and process the LinkEvent. - /// - public delegate bool LinkEventHandler( ZedGraphControl sender, GraphPane pane, - object source, Link link, int index ); - - /// - /// Subscribe to this event to be able to respond to mouse clicks within linked - /// objects. - /// - /// - /// Linked objects are typically either type objects or - /// type objects. These object types can include - /// hyperlink information allowing for "drill-down" type operation. - /// - /// - /// - /// CurveItem.Link - /// GraphObj.Link - // /// - [Bindable( true ), Category( "Events" ), - Description( "Subscribe to be notified when a link-enabled item is clicked" )] - public event LinkEventHandler LinkEvent; - - #endregion - - #region Mouse Events - - /// - /// Handle a MouseDown event in the - /// - /// A reference to the - /// A instance - protected void ZedGraphControl_MouseDown( object sender, MouseEventArgs e ) - { - _isPanning = false; - _isZooming = false; - _isEditing = false; - _isSelecting = false; - _dragPane = null; - - Point mousePt = new Point( e.X, e.Y ); - - // Callback for doubleclick events - if ( _masterPane != null && e.Clicks > 1 && this.DoubleClickEvent != null ) - { - if ( this.DoubleClickEvent( this, e ) ) - return; - } - - // Provide Callback for MouseDown events - if ( _masterPane != null && this.MouseDownEvent != null ) - { - if ( this.MouseDownEvent( this, e ) ) - return; - } - - if ( e.Clicks > 1 || _masterPane == null ) - return; - - // First, see if the click is within a Linkable object within any GraphPane - GraphPane pane = this.MasterPane.FindPane( mousePt ); - if ( pane != null && - e.Button == _linkButtons && Control.ModifierKeys == _linkModifierKeys ) - { - object source; - Link link; - int index; - using ( Graphics g = this.CreateGraphics() ) - { - float scaleFactor = pane.CalcScaleFactor(); - if ( pane.FindLinkableObject( mousePt, g, scaleFactor, out source, out link, out index ) ) - { - if ( LinkEvent != null && LinkEvent( this, pane, source, link, index ) ) - return; - - string url; - CurveItem curve = source as CurveItem; - - if ( curve != null ) - url = link.MakeCurveItemUrl( pane, curve, index ); - else - url = link._url; - - if ( url != string.Empty ) - { - System.Diagnostics.Process.Start( url ); - // linkable objects override any other actions with mouse - return; - } - } - //g.Dispose(); - } - } - - // Second, Check to see if it's within a Chart Rect - pane = this.MasterPane.FindChartRect( mousePt ); - //Rectangle rect = new Rectangle( mousePt, new Size( 1, 1 ) ); - - if ( pane != null && - ( _isEnableHPan || _isEnableVPan ) && - ( ( e.Button == _panButtons && Control.ModifierKeys == _panModifierKeys ) || - ( e.Button == _panButtons2 && Control.ModifierKeys == _panModifierKeys2 ) ) ) - { - _isPanning = true; - _dragStartPt = mousePt; - _dragPane = pane; - //_zoomState = new ZoomState( _dragPane, ZoomState.StateType.Pan ); - ZoomStateSave( _dragPane, ZoomState.StateType.Pan ); - } - else if ( pane != null && ( _isEnableHZoom || _isEnableVZoom ) && - ( ( e.Button == _zoomButtons && Control.ModifierKeys == _zoomModifierKeys ) || - ( e.Button == _zoomButtons2 && Control.ModifierKeys == _zoomModifierKeys2 ) ) ) - { - _isZooming = true; - _dragStartPt = mousePt; - _dragEndPt = mousePt; - _dragEndPt.Offset( 1, 1 ); - _dragPane = pane; - ZoomStateSave( _dragPane, ZoomState.StateType.Zoom ); - } - //Revision: JCarpenter 10/06 - else if ( pane != null && _isEnableSelection && e.Button == _selectButtons && - ( Control.ModifierKeys == _selectModifierKeys || - Control.ModifierKeys == _selectAppendModifierKeys ) ) - { - _isSelecting = true; - _dragStartPt = mousePt; - _dragEndPt = mousePt; - _dragEndPt.Offset( 1, 1 ); - _dragPane = pane; - } - else if (_isEnableManualEditing == false && pane != null && (_isEnableHEdit || _isEnableVEdit) && - ( e.Button == EditButtons && Control.ModifierKeys == EditModifierKeys ) ) - { - - // find the point that was clicked, and make sure the point list is editable - // and that it's a primary Y axis (the first Y or Y2 axis) - if ( pane.FindNearestPoint( mousePt, out _dragCurve, out _dragIndex ) && - _dragCurve.Points is IPointListEdit ) - { - _isEditing = true; - _dragPane = pane; - _dragStartPt = mousePt; - _dragStartPair = _dragCurve[_dragIndex]; - } - } - } - - /// - /// This functions is used to manually start editing a point. _isEnableManualEditing should - /// be set to true if you are going to use this function. Also at least one of - /// _isEnableHEdit or _isEnableVEdit should be set to true to determine how editing will - /// work. This method is intended to be called from the ZedGraphControl_MouseDown event. - /// - /// The pane that contains to point to edit - /// The position of if mouse when this is called. - /// The curve that contains the point to edit. - /// The index of the point to edit. - public void StartEditing(GraphPane pane, Point mousePos, CurveItem curveToEdit, int pointToEditIndex) - { - Debug.Assert(_isEnableManualEditing && (_isEnableHEdit || _isEnableVEdit)); - - _isEditing = true; - _dragPane = pane; - _dragStartPt = mousePos; - _dragCurve = curveToEdit; - _dragIndex = pointToEditIndex; - _dragStartPair = curveToEdit[pointToEditIndex]; - } - - /// - /// Set the cursor according to the current mouse location. - /// - protected void SetCursor() - { - SetCursor( this.PointToClient( Control.MousePosition ) ); - } - - /// - /// Set the cursor according to the current mouse location. - /// - protected void SetCursor( Point mousePt ) - { - if ( _masterPane != null ) - { - GraphPane pane = _masterPane.FindChartRect( mousePt ); - if ( ( _isEnableHPan || _isEnableVPan ) && ( Control.ModifierKeys == Keys.Shift || _isPanning ) && - ( pane != null || _isPanning ) ) - this.Cursor = Cursors.Hand; - else if ( ( _isEnableVZoom || _isEnableHZoom ) && ( pane != null || _isZooming ) ) - this.Cursor = Cursors.Cross; - else if ( _isEnableSelection && ( pane != null || _isSelecting ) ) - this.Cursor = Cursors.Cross; - else - this.Cursor = Cursors.Default; - - // else if ( isZoomMode || isPanMode ) - // this.Cursor = Cursors.No; - } - } - - /// - /// Handle a KeyUp event - /// - /// The in which the KeyUp occurred. - /// A instance. - protected void ZedGraphControl_KeyUp( object sender, KeyEventArgs e ) - { - SetCursor(); - } - - /// - /// Handle the Key Events so ZedGraph can Escape out of a panning or zooming operation. - /// - /// - /// - protected void ZedGraphControl_KeyDown( object sender, System.Windows.Forms.KeyEventArgs e ) - { - SetCursor(); - - if ( e.KeyCode == Keys.Escape ) - { - if ( _isPanning ) - HandlePanCancel(); - if ( _isZooming ) - HandleZoomCancel(); - if ( _isEditing ) - HandleEditCancel(); - //if ( _isSelecting ) - // Esc always cancels the selection - HandleSelectionCancel(); - - _isZooming = false; - _isPanning = false; - _isEditing = false; - _isSelecting = false; - - Refresh(); - } - } - - /// - /// Handle a MouseUp event in the - /// - /// A reference to the - /// A instance - protected void ZedGraphControl_MouseUp( object sender, MouseEventArgs e ) - { - // Provide Callback for MouseUp events - if ( _masterPane != null && this.MouseUpEvent != null ) - { - if ( this.MouseUpEvent( this, e ) ) - return; - } - - if ( _masterPane != null && _dragPane != null ) - { - // If the MouseUp event occurs, the user is done dragging. - if ( _isZooming ) - HandleZoomFinish( sender, e ); - else if ( _isPanning ) - HandlePanFinish(); - else if ( _isEditing ) - HandleEditFinish(); - //Revision: JCarpenter 10/06 - else if ( _isSelecting ) - HandleSelectionFinish( sender, e ); - } - - // Reset the rectangle. - //dragStartPt = new Rectangle( 0, 0, 0, 0 ); - _dragPane = null; - _isZooming = false; - _isPanning = false; - _isEditing = false; - _isSelecting = false; - - Cursor.Current = Cursors.Default; - } - - /// - /// Make a string label that corresponds to a user scale value. - /// - /// The axis from which to obtain the scale value. This determines - /// if it's a date value, linear, log, etc. - /// The value to be made into a label - /// The ordinal position of the value - /// true to override the ordinal settings of the axis, - /// and prefer the actual value instead. - /// The string label. - protected string MakeValueLabel( Axis axis, double val, int iPt, bool isOverrideOrdinal ) - { - if ( axis != null ) - { - if ( axis.Scale.IsDate || axis.Scale.Type == AxisType.DateAsOrdinal ) - { - return XDate.ToString( val, _pointDateFormat ); - } - else if ( axis._scale.IsText && axis._scale._textLabels != null ) - { - int i = iPt; - if ( isOverrideOrdinal ) - i = (int)( val - 0.5 ); - - if ( i >= 0 && i < axis._scale._textLabels.Length ) - return axis._scale._textLabels[i]; - else - return ( i + 1 ).ToString(); - } - else if ( axis.Scale.IsAnyOrdinal && axis.Scale.Type != AxisType.LinearAsOrdinal - && !isOverrideOrdinal ) - { - return iPt.ToString( _pointValueFormat ); - } - else - return val.ToString( _pointValueFormat ); - } - else - return ""; - } - - /// - /// protected method for handling MouseMove events to display tooltips over - /// individual datapoints. - /// - /// - /// A reference to the control that has the MouseMove event. - /// - /// - /// A MouseEventArgs object. - /// - protected void ZedGraphControl_MouseMove( object sender, MouseEventArgs e ) - { - if ( _masterPane != null ) - { - Point mousePt = new Point( e.X, e.Y ); - - // Provide Callback for MouseMove events - if ( this.MouseMoveEvent != null && this.MouseMoveEvent( this, e ) ) - return; - - //Point tempPt = this.PointToClient( Control.MousePosition ); - - SetCursor( mousePt ); - - // If the mouse is being dragged, - // undraw and redraw the rectangle as the mouse moves. - if ( _isZooming ) - HandleZoomDrag( mousePt ); - else if ( _isPanning ) - HandlePanDrag( mousePt ); - else if ( _isEditing ) - HandleEditDrag( mousePt ); - else if ( _isShowCursorValues ) - HandleCursorValues( mousePt ); - else if ( _isShowPointValues ) - HandlePointValues( mousePt ); - //Revision: JCarpenter 10/06 - else if ( _isSelecting ) - HandleZoomDrag( mousePt ); - } - } - - private Point HandlePointValues( Point mousePt ) - { - int iPt; - GraphPane pane; - object nearestObj; - - using ( Graphics g = this.CreateGraphics() ) - { - - if ( _masterPane.FindNearestPaneObject( mousePt, - g, out pane, out nearestObj, out iPt ) ) - { - if ( nearestObj is CurveItem && iPt >= 0 ) - { - CurveItem curve = (CurveItem)nearestObj; - // Provide Callback for User to customize the tooltips - if ( this.PointValueEvent != null ) - { - string label = this.PointValueEvent( this, pane, curve, iPt ); - if ( label != null && label.Length > 0 ) - { - this.pointToolTip.SetToolTip( this, label ); - this.pointToolTip.Active = true; - } - else - this.pointToolTip.Active = false; - } - else - { - - if ( curve is PieItem ) - { - this.pointToolTip.SetToolTip( this, - ( (PieItem)curve ).Value.ToString( _pointValueFormat ) ); - } - // else if ( curve is OHLCBarItem || curve is JapaneseCandleStickItem ) - // { - // StockPt spt = (StockPt)curve.Points[iPt]; - // this.pointToolTip.SetToolTip( this, ( (XDate) spt.Date ).ToString( "MM/dd/yyyy" ) + "\nOpen: $" + - // spt.Open.ToString( "N2" ) + - // "\nHigh: $" + - // spt.High.ToString( "N2" ) + "\nLow: $" + - // spt.Low.ToString( "N2" ) + "\nClose: $" + - // spt.Close.ToString - // ( "N2" ) ); - // } - else - { - PointPair pt = curve.Points[iPt]; - - if ( pt.Tag is string ) - this.pointToolTip.SetToolTip( this, (string)pt.Tag ); - else - { - double xVal, yVal, lowVal; - ValueHandler valueHandler = new ValueHandler( pane, false ); - if ( ( curve is BarItem || curve is ErrorBarItem || curve is HiLowBarItem ) - && pane.BarSettings.Base != BarBase.X ) - valueHandler.GetValues( curve, iPt, out yVal, out lowVal, out xVal ); - else - valueHandler.GetValues( curve, iPt, out xVal, out lowVal, out yVal ); - - string xStr = MakeValueLabel( curve.GetXAxis( pane ), xVal, iPt, - curve.IsOverrideOrdinal ); - string yStr = MakeValueLabel( curve.GetYAxis( pane ), yVal, iPt, - curve.IsOverrideOrdinal ); - - this.pointToolTip.SetToolTip( this, "( " + xStr + ", " + yStr + " )" ); - - //this.pointToolTip.SetToolTip( this, - // curve.Points[iPt].ToString( this.pointValueFormat ) ); - } - } - - this.pointToolTip.Active = true; - } - } - else - this.pointToolTip.Active = false; - } - else - this.pointToolTip.Active = false; - - //g.Dispose(); - } - return mousePt; - } - - private Point HandleCursorValues( Point mousePt ) - { - GraphPane pane = _masterPane.FindPane( mousePt ); - if ( pane != null && pane.Chart._rect.Contains( mousePt ) ) - { - // Provide Callback for User to customize the tooltips - if ( this.CursorValueEvent != null ) - { - string label = this.CursorValueEvent( this, pane, mousePt ); - if ( label != null && label.Length > 0 ) - { - this.pointToolTip.SetToolTip( this, label ); - this.pointToolTip.Active = true; - } - else - this.pointToolTip.Active = false; - } - else - { - double x, x2, y, y2; - pane.ReverseTransform( mousePt, out x, out x2, out y, out y2 ); - string xStr = MakeValueLabel( pane.XAxis, x, -1, true ); - string yStr = MakeValueLabel( pane.YAxis, y, -1, true ); - string y2Str = MakeValueLabel( pane.Y2Axis, y2, -1, true ); - - this.pointToolTip.SetToolTip( this, "( " + xStr + ", " + yStr + ", " + y2Str + " )" ); - this.pointToolTip.Active = true; - } - } - else - this.pointToolTip.Active = false; - - return mousePt; - } - - - #endregion - - #region Mouse Wheel Zoom Events - - /// - /// Handle a MouseWheel event in the - /// - /// A reference to the - /// A instance - protected void ZedGraphControl_MouseWheel( object sender, MouseEventArgs e ) - { - if ( ( _isEnableVZoom || _isEnableHZoom ) && _isEnableWheelZoom && _masterPane != null ) - { - GraphPane pane = this.MasterPane.FindChartRect( new PointF( e.X, e.Y ) ); - if ( pane != null && e.Delta != 0 ) - { - ZoomState oldState = ZoomStateSave( pane, ZoomState.StateType.WheelZoom ); - //ZoomState oldState = pane.ZoomStack.Push( pane, ZoomState.StateType.Zoom ); - - PointF centerPoint = new PointF( e.X, e.Y ); - double zoomFraction = ( 1 + ( e.Delta < 0 ? 1.0 : -1.0 ) * ZoomStepFraction ); - - ZoomPane( pane, zoomFraction, centerPoint, _isZoomOnMouseCenter, false ); - - ApplyToAllPanes( pane ); - - using ( Graphics g = this.CreateGraphics() ) - { - // always AxisChange() the dragPane - pane.AxisChange( g ); - - foreach ( GraphPane tempPane in _masterPane._paneList ) - { - if ( tempPane != pane && ( _isSynchronizeXAxes || _isSynchronizeYAxes ) ) - tempPane.AxisChange( g ); - } - } - - ZoomStatePush( pane ); - - // Provide Callback to notify the user of zoom events - if ( this.ZoomEvent != null ) - this.ZoomEvent( this, oldState, new ZoomState( pane, ZoomState.StateType.WheelZoom ) ); - - this.Refresh(); - - } - } - } - - /// - /// Zoom a specified pane in or out according to the specified zoom fraction. - /// - /// - /// The zoom will occur on the , , and - /// only if the corresponding flag, or - /// , is true. Note that if there are multiple Y or Y2 axes, all of - /// them will be zoomed. - /// - /// The instance to be zoomed. - /// The fraction by which to zoom, less than 1 to zoom in, greater than - /// 1 to zoom out. For example, 0.9 will zoom in such that the scale is 90% of what it was - /// originally. - /// The screen position about which the zoom will be centered. This - /// value is only used if is true. - /// - /// true to cause the zoom to be centered on the point - /// , false to center on the . - /// - /// true to force a refresh of the control, false to leave it unrefreshed - protected void ZoomPane( GraphPane pane, double zoomFraction, PointF centerPt, - bool isZoomOnCenter, bool isRefresh ) - { - double x; - double x2; - double[] y; - double[] y2; - - pane.ReverseTransform( centerPt, out x, out x2, out y, out y2 ); - - if ( _isEnableHZoom ) - { - ZoomScale( pane.XAxis, zoomFraction, x, isZoomOnCenter ); - ZoomScale( pane.X2Axis, zoomFraction, x2, isZoomOnCenter ); - } - if ( _isEnableVZoom ) - { - for ( int i = 0; i < pane.YAxisList.Count; i++ ) - ZoomScale( pane.YAxisList[i], zoomFraction, y[i], isZoomOnCenter ); - for ( int i = 0; i < pane.Y2AxisList.Count; i++ ) - ZoomScale( pane.Y2AxisList[i], zoomFraction, y2[i], isZoomOnCenter ); - } - - using ( Graphics g = this.CreateGraphics() ) - { - pane.AxisChange( g ); - //g.Dispose(); - } - - this.SetScroll( this.hScrollBar1, pane.XAxis, _xScrollRange.Min, _xScrollRange.Max ); - this.SetScroll( this.vScrollBar1, pane.YAxis, _yScrollRangeList[0].Min, - _yScrollRangeList[0].Max ); - - if ( isRefresh ) - Refresh(); - } - - /// - /// Zoom a specified pane in or out according to the specified zoom fraction. - /// - /// - /// The zoom will occur on the , , and - /// only if the corresponding flag, or - /// , is true. Note that if there are multiple Y or Y2 axes, all of - /// them will be zoomed. - /// - /// The instance to be zoomed. - /// The fraction by which to zoom, less than 1 to zoom in, greater than - /// 1 to zoom out. For example, 0.9 will zoom in such that the scale is 90% of what it was - /// originally. - /// The screen position about which the zoom will be centered. This - /// value is only used if is true. - /// - /// true to cause the zoom to be centered on the point - /// , false to center on the . - /// - public void ZoomPane( GraphPane pane, double zoomFraction, PointF centerPt, bool isZoomOnCenter ) - { - ZoomPane( pane, zoomFraction, centerPt, isZoomOnCenter, true ); - } - - - /// - /// Zoom the specified axis by the specified amount, with the center of the zoom at the - /// (optionally) specified point. - /// - /// - /// This method is used for MouseWheel zoom operations - /// The to be zoomed. - /// The zoom fraction, less than 1.0 to zoom in, greater than 1.0 to - /// zoom out. That is, a value of 0.9 will zoom in such that the scale length is 90% of what - /// it previously was. - /// The location for the center of the zoom. This is only used if - /// is true. - /// true if the zoom is to be centered at the - /// screen position, false for the zoom to be centered within - /// the . - /// - protected void ZoomScale( Axis axis, double zoomFraction, double centerVal, bool isZoomOnCenter ) - { - if ( axis != null && zoomFraction > 0.0001 && zoomFraction < 1000.0 ) - { - Scale scale = axis._scale; - /* - if ( axis.Scale.IsLog ) - { - double ratio = Math.Sqrt( axis._scale._max / axis._scale._min * zoomFraction ); - - if ( !isZoomOnCenter ) - centerVal = Math.Sqrt( axis._scale._max * axis._scale._min ); - - axis._scale._min = centerVal / ratio; - axis._scale._max = centerVal * ratio; - } - else - { - */ - double minLin = axis._scale._minLinearized; - double maxLin = axis._scale._maxLinearized; - double range = ( maxLin - minLin ) * zoomFraction / 2.0; - - if ( !isZoomOnCenter ) - centerVal = ( maxLin + minLin ) / 2.0; - - axis._scale._minLinearized = centerVal - range; - axis._scale._maxLinearized = centerVal + range; - // } - - axis._scale._minAuto = false; - axis._scale._maxAuto = false; - } - } - - #endregion - - #region Pan Events - - private Point HandlePanDrag( Point mousePt ) - { - double x1, x2, xx1, xx2; - double[] y1, y2, yy1, yy2; - //PointF endPoint = mousePt; - //PointF startPoint = ( (Control)sender ).PointToClient( this.dragRect.Location ); - - _dragPane.ReverseTransform( _dragStartPt, out x1, out xx1, out y1, out yy1 ); - _dragPane.ReverseTransform( mousePt, out x2, out xx2, out y2, out yy2 ); - - if ( _isEnableHPan ) - { - PanScale( _dragPane.XAxis, x1, x2 ); - PanScale( _dragPane.X2Axis, xx1, xx2 ); - this.SetScroll( this.hScrollBar1, _dragPane.XAxis, _xScrollRange.Min, _xScrollRange.Max ); - } - if ( _isEnableVPan ) - { - for ( int i = 0; i < y1.Length; i++ ) - PanScale( _dragPane.YAxisList[i], y1[i], y2[i] ); - for ( int i = 0; i < yy1.Length; i++ ) - PanScale( _dragPane.Y2AxisList[i], yy1[i], yy2[i] ); - this.SetScroll( this.vScrollBar1, _dragPane.YAxis, _yScrollRangeList[0].Min, - _yScrollRangeList[0].Max ); - } - - ApplyToAllPanes( _dragPane ); - - Refresh(); - - _dragStartPt = mousePt; - - return mousePt; - } - - private void HandlePanFinish() - { - // push the prior saved zoomstate, since the scale ranges have already been changed on - // the fly during the panning operation - if ( _zoomState != null && _zoomState.IsChanged( _dragPane ) ) - { - //_dragPane.ZoomStack.Push( _zoomState ); - ZoomStatePush( _dragPane ); - - // Provide Callback to notify the user of pan events - if ( this.ZoomEvent != null ) - this.ZoomEvent( this, _zoomState, - new ZoomState( _dragPane, ZoomState.StateType.Pan ) ); - - _zoomState = null; - } - } - - private void HandlePanCancel() - { - if ( _isPanning ) - { - if ( _zoomState != null && _zoomState.IsChanged( _dragPane ) ) - { - ZoomStateRestore( _dragPane ); - //_zoomState.ApplyState( _dragPane ); - //_zoomState = null; - } - _isPanning = false; - Refresh(); - - ZoomStateClear(); - } - } - - /// - /// Handle a panning operation for the specified . - /// - /// The to be panned - /// The value where the pan started. The scale range - /// will be shifted by the difference between and - /// . - /// - /// The value where the pan ended. The scale range - /// will be shifted by the difference between and - /// . - /// - protected void PanScale( Axis axis, double startVal, double endVal ) - { - if ( axis != null ) - { - Scale scale = axis._scale; - double delta = scale.Linearize( startVal ) - scale.Linearize( endVal ); - - scale._minLinearized += delta; - scale._maxLinearized += delta; - - scale._minAuto = false; - scale._maxAuto = false; - - /* - if ( axis.Type == AxisType.Log ) - { - axis._scale._min *= startVal / endVal; - axis._scale._max *= startVal / endVal; - } - else - { - axis._scale._min += startVal - endVal; - axis._scale._max += startVal - endVal; - } - */ - } - } - - #endregion - - #region Edit Point Events - - private void HandleEditDrag( Point mousePt ) - { - // get the scale values that correspond to the current point - double curX, curY; - _dragPane.ReverseTransform( mousePt, _dragCurve.IsX2Axis, _dragCurve.IsY2Axis, - _dragCurve.YAxisIndex, out curX, out curY ); - double startX, startY; - _dragPane.ReverseTransform( _dragStartPt, _dragCurve.IsX2Axis, _dragCurve.IsY2Axis, - _dragCurve.YAxisIndex, out startX, out startY ); - - // calculate the new scale values for the point - PointPair newPt = new PointPair( _dragStartPair ); - - Scale xScale = _dragCurve.GetXAxis( _dragPane )._scale; - if ( _isEnableHEdit ) - newPt.X = xScale.DeLinearize( xScale.Linearize( newPt.X ) + - xScale.Linearize( curX ) - xScale.Linearize( startX ) ); - - Scale yScale = _dragCurve.GetYAxis( _dragPane )._scale; - if ( _isEnableVEdit ) - newPt.Y = yScale.DeLinearize( yScale.Linearize( newPt.Y ) + - yScale.Linearize( curY ) - yScale.Linearize( startY ) ); - - if(this.EditDragEvent != null) - { - if (this.EditDragEvent(this, newPt, _dragIndex, _dragCurve) == false) - { - return; - } - } - - // save the data back to the point list - IPointListEdit list = _dragCurve.Points as IPointListEdit; - if ( list != null ) - list[_dragIndex] = newPt; - - // force a redraw - Refresh(); - } - - private void HandleEditFinish() - { - if ( this.PointEditEvent != null ) - this.PointEditEvent( this, _dragPane, _dragCurve, _dragIndex ); - } - - private void HandleEditCancel() - { - if ( _isEditing ) - { - IPointListEdit list = _dragCurve.Points as IPointListEdit; - if ( list != null ) - list[_dragIndex] = _dragStartPair; - _isEditing = false; - Refresh(); - } - } - - #endregion - - #region Zoom Events - - private void HandleZoomDrag( Point mousePt ) - { - // Hide the previous rectangle by calling the - // DrawReversibleFrame method with the same parameters. - Rectangle rect = CalcScreenRect( _dragStartPt, _dragEndPt ); - ControlPaint.DrawReversibleFrame( rect, this.BackColor, FrameStyle.Dashed ); - - // Bound the zoom to the ChartRect - _dragEndPt = Point.Round( BoundPointToRect( mousePt, _dragPane.Chart._rect ) ); - rect = CalcScreenRect( _dragStartPt, _dragEndPt ); - // Draw the new rectangle by calling DrawReversibleFrame again. - ControlPaint.DrawReversibleFrame( rect, this.BackColor, FrameStyle.Dashed ); - } - - private const double ZoomResolution = 1e-300; - - private void HandleZoomFinish( object sender, MouseEventArgs e ) - { - PointF mousePtF = BoundPointToRect( new Point( e.X, e.Y ), _dragPane.Chart._rect ); - - // Only accept a drag if it covers at least 5 pixels in each direction - //Point curPt = ( (Control)sender ).PointToScreen( Point.Round( mousePt ) ); - if ( ( Math.Abs( mousePtF.X - _dragStartPt.X ) > 4 || !_isEnableHZoom ) && - ( Math.Abs( mousePtF.Y - _dragStartPt.Y ) > 4 || !_isEnableVZoom ) ) - { - // Draw the rectangle to be evaluated. Set a dashed frame style - // using the FrameStyle enumeration. - //ControlPaint.DrawReversibleFrame( this.dragRect, - // this.BackColor, FrameStyle.Dashed ); - - double x1, x2, xx1, xx2; - double[] y1, y2, yy1, yy2; - //PointF startPoint = ( (Control)sender ).PointToClient( this.dragRect.Location ); - - _dragPane.ReverseTransform( _dragStartPt, out x1, out xx1, out y1, out yy1 ); - _dragPane.ReverseTransform( mousePtF, out x2, out xx2, out y2, out yy2 ); - - bool zoomLimitExceeded = false; - - if ( _isEnableHZoom ) - { - double min1 = Math.Min( x1, x2 ); - double max1 = Math.Max( x1, x2 ); - double min2 = Math.Min( xx1, xx2 ); - double max2 = Math.Max( xx1, xx2 ); - - if ( Math.Abs( x1 - x2 ) < ZoomResolution || Math.Abs( xx1 - xx2 ) < ZoomResolution ) - zoomLimitExceeded = true; - } - - if ( _isEnableVZoom && !zoomLimitExceeded ) - { - for ( int i = 0; i < y1.Length; i++ ) - { - if ( Math.Abs( y1[i] - y2[i] ) < ZoomResolution ) - { - zoomLimitExceeded = true; - break; - } - } - for ( int i = 0; i < yy1.Length; i++ ) - { - if ( Math.Abs( yy1[i] - yy2[i] ) < ZoomResolution ) - { - zoomLimitExceeded = true; - break; - } - } - } - - if ( !zoomLimitExceeded ) - { - - ZoomStatePush( _dragPane ); - //ZoomState oldState = _dragPane.ZoomStack.Push( _dragPane, - // ZoomState.StateType.Zoom ); - - - if ( _isEnableHZoom ) - { - _dragPane.XAxis._scale._min = Math.Min( x1, x2 ); - _dragPane.XAxis._scale._minAuto = false; - _dragPane.XAxis._scale._max = Math.Max( x1, x2 ); - _dragPane.XAxis._scale._maxAuto = false; - - _dragPane.X2Axis._scale._min = Math.Min( xx1, xx2 ); - _dragPane.X2Axis._scale._minAuto = false; - _dragPane.X2Axis._scale._max = Math.Max( xx1, xx2 ); - _dragPane.X2Axis._scale._maxAuto = false; - } - - if ( _isEnableVZoom ) - { - for ( int i = 0; i < y1.Length; i++ ) - { - _dragPane.YAxisList[i]._scale._min = Math.Min( y1[i], y2[i] ); - _dragPane.YAxisList[i]._scale._max = Math.Max( y1[i], y2[i] ); - _dragPane.YAxisList[i]._scale._minAuto = false; - _dragPane.YAxisList[i]._scale._maxAuto = false; - } - for ( int i = 0; i < yy1.Length; i++ ) - { - _dragPane.Y2AxisList[i]._scale._min = Math.Min( yy1[i], yy2[i] ); - _dragPane.Y2AxisList[i]._scale._max = Math.Max( yy1[i], yy2[i] ); - _dragPane.Y2AxisList[i]._scale._minAuto = false; - _dragPane.Y2AxisList[i]._scale._maxAuto = false; - } - } - - this.SetScroll( this.hScrollBar1, _dragPane.XAxis, _xScrollRange.Min, _xScrollRange.Max ); - this.SetScroll( this.vScrollBar1, _dragPane.YAxis, _yScrollRangeList[0].Min, - _yScrollRangeList[0].Max ); - - ApplyToAllPanes( _dragPane ); - - // Provide Callback to notify the user of zoom events - if ( this.ZoomEvent != null ) - this.ZoomEvent( this, _zoomState, //oldState, - new ZoomState( _dragPane, ZoomState.StateType.Zoom ) ); - - using ( Graphics g = this.CreateGraphics() ) - { - // always AxisChange() the dragPane - _dragPane.AxisChange( g ); - - foreach ( GraphPane pane in _masterPane._paneList ) - { - if ( pane != _dragPane && ( _isSynchronizeXAxes || _isSynchronizeYAxes ) ) - pane.AxisChange( g ); - } - } - } - - Refresh(); - } - } - - private void HandleZoomCancel() - { - if ( _isZooming ) - { - _isZooming = false; - Refresh(); - - ZoomStateClear(); - } - } - - private PointF BoundPointToRect( Point mousePt, RectangleF rect ) - { - PointF newPt = new PointF( mousePt.X, mousePt.Y ); - - if ( mousePt.X < rect.X ) newPt.X = rect.X; - if ( mousePt.X > rect.Right ) newPt.X = rect.Right; - if ( mousePt.Y < rect.Y ) newPt.Y = rect.Y; - if ( mousePt.Y > rect.Bottom ) newPt.Y = rect.Bottom; - - return newPt; - } - - private Rectangle CalcScreenRect( Point mousePt1, Point mousePt2 ) - { - Point screenPt = PointToScreen( mousePt1 ); - Size size = new Size( mousePt2.X - mousePt1.X, mousePt2.Y - mousePt1.Y ); - Rectangle rect = new Rectangle( screenPt, size ); - - if ( _isZooming ) - { - Rectangle chartRect = Rectangle.Round( _dragPane.Chart._rect ); - - Point chartPt = PointToScreen( chartRect.Location ); - - if ( !_isEnableVZoom ) - { - rect.Y = chartPt.Y; - rect.Height = chartRect.Height + 1; - } - else if ( !_isEnableHZoom ) - { - rect.X = chartPt.X; - rect.Width = chartRect.Width + 1; - } - } - - return rect; - } - - #endregion - - #region Selection Events - - // Revision: JCarpenter 10/06 - /// - /// Perform selection on curves within the drag pane, or under the mouse click. - /// - /// - /// - private void HandleSelectionFinish( object sender, MouseEventArgs e ) - { - if ( e.Button != _selectButtons ) - { - Refresh(); - return; - } - - PointF mousePtF = BoundPointToRect( new Point( e.X, e.Y ), _dragPane.Chart._rect ); - - PointF mousePt = BoundPointToRect( new Point( e.X, e.Y ), _dragPane.Rect ); - - Point curPt = ( (Control)sender ).PointToScreen( Point.Round( mousePt ) ); - - // Only accept a drag if it covers at least 5 pixels in each direction - //Point curPt = ( (Control)sender ).PointToScreen( Point.Round( mousePt ) ); - if ( ( Math.Abs( mousePtF.X - _dragStartPt.X ) > 4 ) && - ( Math.Abs( mousePtF.Y - _dragStartPt.Y ) > 4 ) ) - { - - #region New Code to Select on Rubber Band - - double x1, x2, xx1, xx2; - double[] y1, y2, yy1, yy2; - PointF startPoint = ( (Control)sender ).PointToClient( new Point( Convert.ToInt32( this._dragPane.Rect.X ), Convert.ToInt32( this._dragPane.Rect.Y ) ) ); - - _dragPane.ReverseTransform( _dragStartPt, out x1, out xx1, out y1, out yy1 ); - _dragPane.ReverseTransform( mousePtF, out x2, out xx2, out y2, out yy2 ); - - CurveList objects = new CurveList(); - - double left = Math.Min( x1, x2 ); - double right = Math.Max( x1, x2 ); - - double top = 0; - double bottom = 0; - - for ( int i = 0; i < y1.Length; i++ ) - { - bottom = Math.Min( y1[i], y2[i] ); - top = Math.Max( y1[i], y2[i] ); - } - - for ( int i = 0; i < yy1.Length; i++ ) - { - bottom = Math.Min( bottom, yy2[i] ); - bottom = Math.Min( yy1[i], bottom ); - top = Math.Max( top, yy2[i] ); - top = Math.Max( yy1[i], top ); - } - - double w = right - left; - double h = bottom - top; - - RectangleF rF = new RectangleF( (float)left, (float)top, (float)w, (float)h ); - - _dragPane.FindContainedObjects( rF, this.CreateGraphics(), out objects ); - - if ( Control.ModifierKeys == _selectAppendModifierKeys ) - _selection.AddToSelection( _masterPane, objects ); - else - _selection.Select( _masterPane, objects ); - // this.Select( objects ); - - //Graphics g = this.CreateGraphics(); - //this._dragPane.AxisChange( g ); - //g.Dispose(); - - #endregion - } - else // It's a single-select - { - #region New Code to Single Select - - //Point mousePt = new Point( e.X, e.Y ); - - int iPt; - GraphPane pane; - object nearestObj; - - using ( Graphics g = this.CreateGraphics() ) - { - if ( this.MasterPane.FindNearestPaneObject( mousePt, g, out pane, - out nearestObj, out iPt ) ) - { - if ( nearestObj is CurveItem && iPt >= 0 ) - { - if ( Control.ModifierKeys == _selectAppendModifierKeys ) - _selection.AddToSelection( _masterPane, nearestObj as CurveItem ); - else - _selection.Select( _masterPane, nearestObj as CurveItem ); - } - else - _selection.ClearSelection( _masterPane ); - - Refresh(); - } - else - { - _selection.ClearSelection( _masterPane ); - } - } - #endregion New Code to Single Select - } - - using ( Graphics g = this.CreateGraphics() ) - { - // always AxisChange() the dragPane - _dragPane.AxisChange( g ); - - foreach ( GraphPane pane in _masterPane._paneList ) - { - if ( pane != _dragPane && ( _isSynchronizeXAxes || _isSynchronizeYAxes ) ) - pane.AxisChange( g ); - } - } - - Refresh(); - } - - private void HandleSelectionCancel() - { - _isSelecting = false; - - _selection.ClearSelection( _masterPane ); - - Refresh(); - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Printing.cs b/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Printing.cs deleted file mode 100644 index 92f00b6..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Printing.cs +++ /dev/null @@ -1,240 +0,0 @@ -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Windows.Forms; -using System.Drawing.Imaging; -using System.Drawing.Printing; -using System.Threading; - -namespace ZedGraph -{ - partial class ZedGraphControl - { - - #region Printing - - /// - /// Handler for the "Page Setup..." context menu item. Displays a - /// . - /// - /// - /// - protected void MenuClick_PageSetup( object sender, EventArgs e ) - { - DoPageSetup(); - } - - /// - /// Handler for the "Print..." context menu item. Displays a - /// . - /// - /// - /// - protected void MenuClick_Print( object sender, EventArgs e ) - { - DoPrint(); - } - - /// - /// Rendering method used by the print context menu items - /// - /// The applicable . - /// A instance providing - /// page bounds, margins, and a Graphics instance for this printed output. - /// - private void Graph_PrintPage( object sender, PrintPageEventArgs e ) - { - PrintDocument pd = sender as PrintDocument; - - MasterPane mPane = this.MasterPane; - bool[] isPenSave = new bool[mPane.PaneList.Count + 1]; - bool[] isFontSave = new bool[mPane.PaneList.Count + 1]; - isPenSave[0] = mPane.IsPenWidthScaled; - isFontSave[0] = mPane.IsFontsScaled; - for ( int i = 0; i < mPane.PaneList.Count; i++ ) - { - isPenSave[i + 1] = mPane[i].IsPenWidthScaled; - isFontSave[i + 1] = mPane[i].IsFontsScaled; - if ( _isPrintScaleAll ) - { - mPane[i].IsPenWidthScaled = true; - mPane[i].IsFontsScaled = true; - } - } - - RectangleF saveRect = mPane.Rect; - SizeF newSize = mPane.Rect.Size; - if ( _isPrintFillPage && _isPrintKeepAspectRatio ) - { - float xRatio = (float)e.MarginBounds.Width / (float)newSize.Width; - float yRatio = (float)e.MarginBounds.Height / (float)newSize.Height; - float ratio = Math.Min( xRatio, yRatio ); - - newSize.Width *= ratio; - newSize.Height *= ratio; - } - else if ( _isPrintFillPage ) - newSize = e.MarginBounds.Size; - - mPane.ReSize( e.Graphics, new RectangleF( e.MarginBounds.Left, - e.MarginBounds.Top, newSize.Width, newSize.Height ) ); - mPane.Draw( e.Graphics ); - - using ( Graphics g = this.CreateGraphics() ) - { - mPane.ReSize( g, saveRect ); - //g.Dispose(); - } - - mPane.IsPenWidthScaled = isPenSave[0]; - mPane.IsFontsScaled = isFontSave[0]; - for ( int i = 0; i < mPane.PaneList.Count; i++ ) - { - mPane[i].IsPenWidthScaled = isPenSave[i + 1]; - mPane[i].IsFontsScaled = isFontSave[i + 1]; - } - } - - /// - /// Gets or sets the instance - /// that is used for all of the context menu printing functions. - /// - public PrintDocument PrintDocument - { - get - { - // Add a try/catch pair since the users of the control can't catch this one - try - { - if ( _pdSave == null ) - { - _pdSave = new PrintDocument(); - _pdSave.PrintPage += new PrintPageEventHandler( Graph_PrintPage ); - } - } - catch ( Exception exception ) - { - MessageBox.Show( exception.Message ); - } - - return _pdSave; - } - set { _pdSave = value; } - } - - /// - /// Display a to the user, allowing them to modify - /// the print settings for this . - /// - public void DoPageSetup() - { - PrintDocument pd = PrintDocument; - - // Add a try/catch pair since the users of the control can't catch this one - try - { - if ( pd != null ) - { - //pd.PrintPage += new PrintPageEventHandler( GraphPrintPage ); - PageSetupDialog setupDlg = new PageSetupDialog(); - setupDlg.Document = pd; - - if ( setupDlg.ShowDialog() == DialogResult.OK ) - { - pd.PrinterSettings = setupDlg.PrinterSettings; - pd.DefaultPageSettings = setupDlg.PageSettings; - - // BUG in PrintDocument!!! Converts in/mm repeatedly - // http://support.microsoft.com/?id=814355 - // from http://www.vbinfozine.com/tpagesetupdialog.shtml, by Palo Mraz - //if ( System.Globalization.RegionInfo.CurrentRegion.IsMetric ) - //{ - // setupDlg.Document.DefaultPageSettings.Margins = PrinterUnitConvert.Convert( - // setupDlg.Document.DefaultPageSettings.Margins, - // PrinterUnit.Display, PrinterUnit.TenthsOfAMillimeter ); - //} - } - } - } - - catch ( Exception exception ) - { - MessageBox.Show( exception.Message ); - } - } - - /// - /// Display a to the user, allowing them to select a - /// printer and print the contained in this - /// . - /// - public void DoPrint() - { - // Add a try/catch pair since the users of the control can't catch this one - try - { - PrintDocument pd = PrintDocument; - - if ( pd != null ) - { - //pd.PrintPage += new PrintPageEventHandler( Graph_PrintPage ); - PrintDialog pDlg = new PrintDialog(); - pDlg.Document = pd; - if ( pDlg.ShowDialog() == DialogResult.OK ) - pd.Print(); - } - } - catch ( Exception exception ) - { - MessageBox.Show( exception.Message ); - } - - } - - /// - /// Display a , allowing the user to preview and - /// subsequently print the contained in this - /// . - /// - public void DoPrintPreview() - { - // Add a try/catch pair since the users of the control can't catch this one - try - { - PrintDocument pd = PrintDocument; - - if ( pd != null ) - { - PrintPreviewDialog ppd = new PrintPreviewDialog(); - //pd.PrintPage += new PrintPageEventHandler( Graph_PrintPage ); - ppd.Document = pd; - ppd.Show( this ); - } - } - catch ( Exception exception ) - { - MessageBox.Show( exception.Message ); - } - } - - #endregion - - } -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Properties.cs b/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Properties.cs deleted file mode 100644 index cbd5ba7..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.Properties.cs +++ /dev/null @@ -1,1246 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2007 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Windows.Forms; - -namespace ZedGraph -{ - partial class ZedGraphControl - { - - #region Button and Key Properties - - /// - /// Gets or sets a value that determines which mouse button will be used as a primary option - /// to trigger a zoom event. - /// - /// - /// This value is combined with to determine the actual zoom combination. - /// A secondary zoom button/key combination option is available via and - /// . To not use this button/key combination, set the value - /// of to . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( MouseButtons.Left ), - Description( "Determines which mouse button is used as the primary for zooming" )] - public MouseButtons ZoomButtons - { - get { return _zoomButtons; } - set { _zoomButtons = value; } - } - /// - /// Gets or sets a value that determines which mouse button will be used as the secondary option - /// to trigger a zoom event. - /// - /// - /// This value is combined with to determine the actual zoom combination. - /// The primary zoom button/key combination option is available via and - /// . To not use this button/key combination, set the value - /// of to . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( MouseButtons.None ), - Description( "Determines which mouse button is used as the secondary for zooming" )] - public MouseButtons ZoomButtons2 - { - get { return _zoomButtons2; } - set { _zoomButtons2 = value; } - } - /// - /// Gets or sets a value that determines which modifier keys will be used as a primary option - /// to trigger a zoom event. - /// - /// - /// This value is combined with to determine the actual zoom combination. - /// A secondary zoom button/key combination option is available via and - /// . To not use this button/key combination, set the value - /// of to . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( Keys.None ), - Description( "Determines which modifier key used as the primary for zooming" )] - public Keys ZoomModifierKeys - { - get { return _zoomModifierKeys; } - set { _zoomModifierKeys = value; } - } - /// - /// Gets or sets a value that determines which modifier keys will be used as a secondary option - /// to trigger a zoom event. - /// - /// - /// This value is combined with to determine the actual zoom combination. - /// A primary zoom button/key combination option is available via and - /// . To not use this button/key combination, set the value - /// of to . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( Keys.None ), - Description( "Determines which modifier key used as the secondary for zooming" )] - public Keys ZoomModifierKeys2 - { - get { return _zoomModifierKeys2; } - set { _zoomModifierKeys2 = value; } - } - - /// - /// Gets or sets a value that determines which mouse button will be used as a primary option - /// to trigger a pan event. - /// - /// - /// This value is combined with to determine the actual pan combination. - /// A secondary pan button/key combination option is available via and - /// . To not use this button/key combination, set the value - /// of to . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( MouseButtons.Left ), - Description( "Determines which mouse button is used as the primary for panning" )] - public MouseButtons PanButtons - { - get { return _panButtons; } - set { _panButtons = value; } - } - /// - /// Gets or sets a value that determines which mouse button will be used as the secondary option - /// to trigger a pan event. - /// - /// - /// This value is combined with to determine the actual pan combination. - /// The primary pan button/key combination option is available via and - /// . To not use this button/key combination, set the value - /// of to . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( MouseButtons.Middle ), - Description( "Determines which mouse button is used as the secondary for panning" )] - public MouseButtons PanButtons2 - { - get { return _panButtons2; } - set { _panButtons2 = value; } - } - - // NOTE: The default value of PanModifierKeys is Keys.Shift. Because of an apparent bug in - // VS 2003, the initial value set in InitializeComponent by the code wizard is "Keys.Shift+None" - // which will not compile. As a temporary workaround, I've hidden the value so that it won't - // have compile errors. This problem does not exist in VS 2005. - - /// - /// Gets or sets a value that determines which modifier keys will be used as a primary option - /// to trigger a pan event. - /// - /// - /// This value is combined with to determine the actual pan combination. - /// A secondary pan button/key combination option is available via and - /// . To not use this button/key combination, set the value - /// of to . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( Keys.Control ), - Description( "Determines which modifier key is used as the primary for panning" )] - public Keys PanModifierKeys - { - get { return _panModifierKeys; } - set { _panModifierKeys = value; } - } - - /// - /// Gets or sets a value that determines which modifier keys will be used as a secondary option - /// to trigger a pan event. - /// - /// - /// This value is combined with to determine the actual pan combination. - /// A primary pan button/key combination option is available via and - /// . To not use this button/key combination, set the value - /// of to . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( Keys.None ), - Description( "Determines which modifier key is used as the secondary for panning" )] - public Keys PanModifierKeys2 - { - get { return _panModifierKeys2; } - set { _panModifierKeys2 = value; } - } - - /// - /// Gets or sets a value that determines which Mouse button will be used to edit point - /// data values - /// - /// - /// This setting only applies if and/or - /// are true. - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( MouseButtons.Right ), - Description( "Specify mouse button for point editing" )] - public MouseButtons EditButtons - { - get { return _editButtons; } - set { _editButtons = value; } - } - /// - /// Gets or sets a value that determines which modifier keys will be used to edit point - /// data values - /// - /// - /// This setting only applies if and/or - /// are true. - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( Keys.Alt ), - Description( "Specify modifier key for point editing" )] - public Keys EditModifierKeys - { - get { return _editModifierKeys; } - set { _editModifierKeys = value; } - } - - /// - /// Gets or sets a value that determines which Mouse button will be used to - /// select 's. - /// - /// - /// This setting only applies if is true. - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( MouseButtons.Left ), - Description( "Specify mouse button for curve selection" )] - public MouseButtons SelectButtons - { - get { return _selectButtons; } - set { _selectButtons = value; } - } - /// - /// Gets or sets a value that determines which Modifier keys will be used to - /// select 's. - /// - /// - /// This setting only applies if is true. - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( Keys.Shift ), - Description( "Specify modifier key for curve selection" )] - public Keys SelectModifierKeys - { - get { return _selectModifierKeys; } - set { _selectModifierKeys = value; } - } - - /// - /// Gets or sets a value that determines which Modifier keys will be used to - /// append a to the selection list. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( Keys.Shift | Keys.Alt ), - Description( "Specify modifier key for append curve selection" )] - public Keys SelectAppendModifierKeys - { - get { return _selectAppendModifierKeys; } - } - - /// - /// Gets or sets a value that determines which Mouse button will be used to click - /// on linkable objects - /// - /// - /// - // /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( MouseButtons.Left ), - Description( "Specify mouse button for clicking on linkable objects" )] - public MouseButtons LinkButtons - { - get { return _linkButtons; } - set { _linkButtons = value; } - } - /// - /// Gets or sets a value that determines which modifier keys will be used to click - /// on linkable objects - /// - /// - /// - // /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( Keys.Alt ), - Description( "Specify modifier key for clicking on linkable objects" )] - public Keys LinkModifierKeys - { - get { return _linkModifierKeys; } - set { _linkModifierKeys = value; } - } - - #endregion - - #region Properties - - /// - /// Gets or sets the property for the control - /// - [Bindable( false ), Browsable( false ), - DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )] - public MasterPane MasterPane - { - get { lock ( this ) return _masterPane; } - set { lock ( this ) _masterPane = value; } - } - - // Testing for Designer attribute - /* - Class1 _class1 = null; - [ Bindable( true ), Browsable( true ), Category( "Data" ), NotifyParentProperty( true ), - DesignerSerializationVisibility( DesignerSerializationVisibility.Content ), - Description( "My Class1 Test" )] - public Class1 Class1 - { - get { if ( _class1 == null ) _class1 = new Class1(); return _class1; } - set { _class1 = value; } - } - */ - - /// - /// Gets or sets the property for the control - /// - /// - /// actually uses a object - /// to hold a list of objects. This property really only - /// accesses the first in the list. If there is more - /// than one , use the - /// indexer property to access any of the objects. - [ - Bindable( false ), Browsable( false ), - DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden ) - ] - //[ - // Bindable( true ), Browsable( true ), Category( "Data" ), NotifyParentProperty( true ), - // AttributeProvider( typeof( GraphPane ) ), - // Description("Access to the primary GraphPane object associated with this control") - //] - public GraphPane GraphPane - { - get - { - // Just return the first GraphPane in the list - lock ( this ) - { - if ( _masterPane != null && _masterPane.PaneList.Count > 0 ) - return _masterPane[0]; - else - return null; - } - } - - set - { - lock ( this ) - { - //Clear the list, and replace it with the specified Graphpane - if ( _masterPane != null ) - { - _masterPane.PaneList.Clear(); - _masterPane.Add( value ); - } - } - } - } - - /// - /// Gets or sets a value that determines if all drawing operations for this control - /// will be forced to operate in Anti-alias mode. Note that if this value is set to - /// "true", it overrides the setting for sub-objects. Otherwise, the sub-object settings - /// (such as ) - /// will be honored. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to force all objects to be draw in anti-alias mode" )] - public bool IsAntiAlias - { - get { return _masterPane.IsAntiAlias; } - set { _masterPane.IsAntiAlias = value; } - } - - /// - /// Gets or sets a value that determines whether or not tooltips will be displayed - /// when the mouse hovers over data values. - /// - /// The displayed values are taken from - /// if it is a type, or - /// otherwise (using the as a format string). - /// Additionally, the user can custom format the values using the - /// event. Note that - /// may be overridden by . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to display tooltips when the mouse hovers over data points" )] - public bool IsShowPointValues - { - get { return _isShowPointValues; } - set { _isShowPointValues = value; } - } - - /// - /// Gets or sets a value that determines whether or not tooltips will be displayed - /// showing the current scale values when the mouse is within the - /// . - /// - /// The displayed values are taken from the current mouse position, and formatted - /// according to and/or . If this - /// value is set to true, it overrides the setting. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to display tooltips showing the current mouse position within the Chart area" )] - public bool IsShowCursorValues - { - get { return _isShowCursorValues; } - set { _isShowCursorValues = value; } - } - - /// - /// Gets or sets a value that determines whether or not editing of point data is allowed in - /// the horizontal direction. - /// - /// - /// Editing is done by holding down the Alt key, and left-clicking on an individual point of - /// a given to drag it to a new location. The Mouse and Key - /// combination for this mode are modifiable using and - /// . - /// - /// - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to allow horizontal editing by alt-left-click-drag" )] - public bool IsEnableHEdit - { - get { return _isEnableHEdit; } - set { _isEnableHEdit = value; } - } - - /// - /// Gets or sets a value that determines whether or not editing of point data is allowed in - /// the vertical direction. - /// - /// - /// Editing is done by holding down the Alt key, and left-clicking on an individual point of - /// a given to drag it to a new location. The Mouse and Key - /// combination for this mode are modifiable using and - /// . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to allow vertical editing by alt-left-click-drag" )] - public bool IsEnableVEdit - { - get { return _isEnableVEdit; } - set { _isEnableVEdit = value; } - } - - /// - /// Determines whether editing will be handled automatically by ZedGraphControl_MouseDown() - /// or manually by StartEditing(). This should be used in conjunction with - /// and to determine whether - /// points can be edited vertically or horizontally. - /// - [Bindable(true), Category("Display"), NotifyParentProperty(true), - DefaultValue(false), - Description("true to allow manual editing through the function StartEditing()")] - public bool IsEnableManualEditing - { - get { return _isEnableManualEditing; } - set { _isEnableManualEditing = value; } - } - - /// - /// Gets or sets a value that determines whether or not zooming is allowed for the control. - /// - /// - /// Zooming is done by left-clicking inside the to drag - /// out a rectangle, indicating the new scale ranges that will be part of the graph. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to allow horizontal and vertical zooming by left-click-drag" )] - public bool IsEnableZoom - { - set { _isEnableHZoom = value; _isEnableVZoom = value; } - } - /// - /// Gets or sets a value that determines whether or not zooming is allowed for the control in - /// the horizontal direction. - /// - /// - /// Zooming is done by left-clicking inside the to drag - /// out a rectangle, indicating the new scale ranges that will be part of the graph. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to allow horizontal zooming by left-click-drag" )] - public bool IsEnableHZoom - { - get { return _isEnableHZoom; } - set { _isEnableHZoom = value; } - } - /// - /// Gets or sets a value that determines whether or not zooming is allowed for the control in - /// the vertical direction. - /// - /// - /// Zooming is done by left-clicking inside the to drag - /// out a rectangle, indicating the new scale ranges that will be part of the graph. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to allow vertical zooming by left-click-drag" )] - public bool IsEnableVZoom - { - get { return _isEnableVZoom; } - set { _isEnableVZoom = value; } - } - - /// - /// Gets or sets a value that determines whether or not zooming is allowed via the mouse wheel. - /// - /// - /// Wheel zooming is done by rotating the mouse wheel. - /// Note that this property is used in combination with the and - /// properties to control zoom options. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to allow zooming with the mouse wheel" )] - public bool IsEnableWheelZoom - { - get { return _isEnableWheelZoom; } - set { _isEnableWheelZoom = value; } - } - - /// - /// Gets or sets a value that determines whether or not panning is allowed for the control in - /// the horizontal direction. - /// - /// - /// Panning is done by clicking the middle mouse button (or holding down the shift key - /// while clicking the left mouse button) inside the and - /// dragging the mouse around to shift the scale ranges as desired. - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to allow horizontal panning by middle-mouse-drag or shift-left-drag" )] - public bool IsEnableHPan - { - get { return _isEnableHPan; } - set { _isEnableHPan = value; } - } - - /// - /// Gets or sets a value that determines whether or not panning is allowed for the control in - /// the vertical direction. - /// - /// - /// Panning is done by clicking the middle mouse button (or holding down the shift key - /// while clicking the left mouse button) inside the and - /// dragging the mouse around to shift the scale ranges as desired. - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to allow vertical panning by middle-mouse-drag or shift-left-drag" )] - public bool IsEnableVPan - { - get { return _isEnableVPan; } - set { _isEnableVPan = value; } - } - - /// - /// Gets or sets a value that determines whether or not the context menu will be available. - /// - /// The context menu is a menu that appears when you right-click on the - /// . It provides options for Zoom, Pan, AutoScale, Clipboard - /// Copy, and toggle . - /// - /// true to allow the context menu, false to disable it - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to enable the right mouse button context menu" )] - public bool IsShowContextMenu - { - get { return _isShowContextMenu; } - set { _isShowContextMenu = value; } - } - - /// - /// Gets or sets a value that determines whether or not a message box will be shown - /// in response to a context menu "Copy" command. - /// - /// - /// Note that, if this property is set to false, the user will receive no - /// indicative feedback in response to a Copy action. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to show a message box after a 'Copy' context menu action completes" )] - public bool IsShowCopyMessage - { - get { return _isShowCopyMessage; } - set { _isShowCopyMessage = value; } - } - - /// - /// Gets or sets the instance that will be used - /// by the "Save As..." context menu item. - /// - /// - /// This provides the opportunity to modify the dialog, such as setting the - /// property. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "Provides access to the SaveFileDialog for the 'Save As' menu item" )] - public SaveFileDialog SaveFileDialog - { - get { return _saveFileDialog; } - set { _saveFileDialog = value; } - } - - /// - /// Gets or sets a value that determines whether or not the visible aspect ratio of the - /// will be preserved - /// when printing this . - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to preserve the displayed aspect ratio when printing" )] - public bool IsPrintKeepAspectRatio - { - get { return _isPrintKeepAspectRatio; } - set { _isPrintKeepAspectRatio = value; } - } - - /// - /// Gets or sets a value that determines whether or not the - /// dimensions will be expanded to fill the - /// available space when printing this . - /// - /// - /// If is also true, then the - /// dimensions will be expanded to fit as large - /// a space as possible while still honoring the visible aspect ratio. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to resize to fill the page when printing" )] - public bool IsPrintFillPage - { - get { return _isPrintFillPage; } - set { _isPrintFillPage = value; } - } - /// - /// Gets or sets a value that determines whether the settings of - /// and - /// will be overridden to true during printing operations. - /// - /// - /// Printing involves pixel maps that are typically of a dramatically different dimension - /// than on-screen pixel maps. Therefore, it becomes more important to scale the fonts and - /// lines to give a printed image that looks like what is shown on-screen. The default - /// setting for is true, but the default - /// setting for is false. - /// - /// - /// A value of true will cause both and - /// to be temporarily set to true during - /// printing operations. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( true ), - Description( "true to force font and pen width scaling when printing" )] - public bool IsPrintScaleAll - { - get { return _isPrintScaleAll; } - set { _isPrintScaleAll = value; } - } - - /// - /// Gets or sets a value that controls whether or not the axis value range for the scroll - /// bars will be set automatically. - /// - /// - /// If this value is set to true, then the range of the scroll bars will be set automatically - /// to the actual range of the data as returned by at the - /// time that was last called. Note that a value of true - /// can override any setting of , , - /// , , - /// , and . Note also that you must - /// call from the for this to - /// work properly (e.g., don't call it directly from the . - /// Alternatively, you can call at anytime to set - /// the scroll bar range.
- /// In most cases, you will probably want to disable - /// before activating this option. - ///
- [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to automatically set the scroll bar range to the actual data range" )] - public bool IsAutoScrollRange - { - get { return _isAutoScrollRange; } - set { _isAutoScrollRange = value; } - } - - /// - /// Set a "grace" value that leaves a buffer area around the data when - /// is true. - /// - /// - /// This value represents a fraction of the total range around each axis. For example, if the - /// axis ranges from 0 to 100, then a 0.05 value for ScrollGrace would set the scroll range - /// to -5 to 105. - /// - public double ScrollGrace - { - get { return _scrollGrace; } - set { _scrollGrace = value; } - } - - /// - /// Gets or sets a value that determines if the horizontal scroll bar will be visible. - /// - /// This scroll bar allows the display to be scrolled in the horizontal direction. - /// Another option is display panning, in which the user can move the display around by - /// clicking directly on it and dragging (see and ). - /// You can control the available range of scrolling with the and - /// properties. Note that the scroll range can be set automatically by - /// .
- /// In most cases, you will probably want to disable - /// before activating this option. - ///
- /// A boolean value. true to display a horizontal scrollbar, false otherwise. - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to display the horizontal scroll bar" )] - public bool IsShowHScrollBar - { - get { return _isShowHScrollBar; } - set { _isShowHScrollBar = value; ZedGraphControl_ReSize( this, new EventArgs() ); } - } - /// - /// Gets or sets a value that determines if the vertical scroll bar will be visible. - /// - /// This scroll bar allows the display to be scrolled in the vertical direction. - /// Another option is display panning, in which the user can move the display around by - /// clicking directly on it and dragging (see and ). - /// You can control the available range of scrolling with the and - /// properties. - /// Note that the vertical scroll bar only affects the ; it has no impact on - /// the . The panning options affect both the and - /// . Note also that the scroll range can be set automatically by - /// .
- /// In most cases, you will probably want to disable - /// before activating this option. - ///
- /// A boolean value. true to display a vertical scrollbar, false otherwise. - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to display the vertical scroll bar" )] - public bool IsShowVScrollBar - { - get { return _isShowVScrollBar; } - set { _isShowVScrollBar = value; ZedGraphControl_ReSize( this, new EventArgs() ); } - } - - /// - /// Gets or sets a value that determines if the - /// ranges for all objects in the will - /// be forced to match. - /// - /// - /// If set to true (default is false), then all of the objects - /// in the associated with this - /// will be forced to have matching scale ranges for the x axis. That is, zoom, pan, - /// and scroll operations will result in zoom/pan/scroll for all graphpanes simultaneously. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to force the X axis ranges for all GraphPanes to match" )] - public bool IsSynchronizeXAxes - { - get { return _isSynchronizeXAxes; } - set - { - if ( _isSynchronizeXAxes != value ) - ZoomStatePurge(); - _isSynchronizeXAxes = value; - } - } - - /// - /// Gets or sets a value that determines if the - /// ranges for all objects in the will - /// be forced to match. - /// - /// - /// If set to true (default is false), then all of the objects - /// in the associated with this - /// will be forced to have matching scale ranges for the y axis. That is, zoom, pan, - /// and scroll operations will result in zoom/pan/scroll for all graphpanes simultaneously. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to force the Y axis ranges for all GraphPanes to match" )] - public bool IsSynchronizeYAxes - { - get { return _isSynchronizeYAxes; } - set - { - if ( _isSynchronizeYAxes != value ) - ZoomStatePurge(); - _isSynchronizeYAxes = value; - } - } - - /// - /// Gets or sets a value that determines if the vertical scroll bar will affect the Y2 axis. - /// - /// - /// The vertical scroll bar is automatically associated with the Y axis. With this value, you - /// can choose to include or exclude the Y2 axis with the scrolling. Note that the Y2 axis - /// scrolling is handled as a secondary. The vertical scroll bar position always reflects - /// the status of the Y axis. This can cause the Y2 axis to "jump" when first scrolled if - /// the and values are not set to the - /// same proportions as and with respect - /// to the actual and . Also note that - /// this property is actually just an alias to the - /// property of the first element of . - /// - /// - /// - /// - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to scroll the Y2 axis along with the Y axis" )] - public bool IsScrollY2 - { - get - { - if ( _y2ScrollRangeList != null && _y2ScrollRangeList.Count > 0 ) - return _y2ScrollRangeList[0].IsScrollable; - else - return false; - } - set - { - if ( _y2ScrollRangeList != null && _y2ScrollRangeList.Count > 0 ) - { - ScrollRange tmp = _y2ScrollRangeList[0]; - tmp.IsScrollable = value; - _y2ScrollRangeList[0] = tmp; - } - } - } - - /// - /// Access the for the Y axes. - /// - /// - /// This list maintains the user scale ranges for the scroll bars for each axis - /// in the . Each ordinal location in - /// corresponds to an equivalent ordinal location - /// in . - /// - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true )] - [Description( "Sets the manual scroll bar ranges for the collection of Y axes" )] - public ScrollRangeList YScrollRangeList - { - get { return _yScrollRangeList; } - } - - /// - /// Access the for the Y2 axes. - /// - /// - /// This list maintains the user scale ranges for the scroll bars for each axis - /// in the . Each ordinal location in - /// corresponds to an equivalent ordinal location - /// in . - /// - /// - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true )] - [Description( "Sets the manual scroll bar ranges for the collection of Y2 axes" )] - public ScrollRangeList Y2ScrollRangeList - { - get { return _y2ScrollRangeList; } - } - - /// - /// The minimum value for the X axis scroll range. - /// - /// - /// Effectively, the minimum endpoint of the scroll range will cause the - /// value to be set to . Note that this - /// value applies only to the scroll bar settings. Axis panning (see ) - /// is not affected by this value. Note that this value can be overridden by - /// and . - /// - /// A double value indicating the minimum axis value - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( 0 ), - Description( "Sets the manual scroll minimum value for the X axis" )] - public double ScrollMinX - { - get { return _xScrollRange.Min; } - set { _xScrollRange.Min = value; } - } - /// - /// The maximum value for the X axis scroll range. - /// - /// - /// Effectively, the maximum endpoint of the scroll range will cause the - /// value to be set to . Note that this - /// value applies only to the scroll bar settings. Axis panning (see ) - /// is not affected by this value. Note that this value can be overridden by - /// and . - /// - /// A double value indicating the maximum axis value - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( 0 ), - Description( "Sets the manual scroll maximum value for the X axis" )] - public double ScrollMaxX - { - get { return _xScrollRange.Max; } - set { _xScrollRange.Max = value; } - } - /// - /// The minimum value for the Y axis scroll range. - /// - /// - /// Effectively, the minimum endpoint of the scroll range will cause the - /// value to be set to . Note that this - /// value applies only to the scroll bar settings. Axis panning (see ) - /// is not affected by this value. Note that this value can be overridden by - /// and . Also note that - /// this property is actually just an alias to the - /// property of the first element of . - /// - /// A double value indicating the minimum axis value - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( 0 ), - Description( "Sets the manual scroll minimum value for the Y axis" )] - public double ScrollMinY - { - get - { - if ( _yScrollRangeList != null && _yScrollRangeList.Count > 0 ) - return _yScrollRangeList[0].Min; - else - return double.NaN; - } - set - { - if ( _yScrollRangeList != null && _yScrollRangeList.Count > 0 ) - { - ScrollRange tmp = _yScrollRangeList[0]; - tmp.Min = value; - _yScrollRangeList[0] = tmp; - } - } - } - /// - /// The maximum value for the Y axis scroll range. - /// - /// - /// Effectively, the maximum endpoint of the scroll range will cause the - /// value to be set to . Note that this - /// value applies only to the scroll bar settings. Axis panning (see ) - /// is not affected by this value. Note that this value can be overridden by - /// and . Also note that - /// this property is actually just an alias to the - /// property of the first element of . - /// - /// A double value indicating the maximum axis value - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( 0 ), - Description( "Sets the manual scroll maximum value for the Y axis" )] - public double ScrollMaxY - { - get - { - if ( _yScrollRangeList != null && _yScrollRangeList.Count > 0 ) - return _yScrollRangeList[0].Max; - else - return double.NaN; - } - set - { - if ( _yScrollRangeList != null && _yScrollRangeList.Count > 0 ) - { - ScrollRange tmp = _yScrollRangeList[0]; - tmp.Max = value; - _yScrollRangeList[0] = tmp; - } - } - } - /// - /// The minimum value for the Y2 axis scroll range. - /// - /// - /// Effectively, the minimum endpoint of the scroll range will cause the - /// value to be set to . Note that this - /// value applies only to the scroll bar settings. Axis panning (see ) - /// is not affected by this value. Note that this value can be overridden by - /// and . Also note that - /// this property is actually just an alias to the - /// property of the first element of . - /// - /// A double value indicating the minimum axis value - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( 0 ), - Description( "Sets the manual scroll minimum value for the Y2 axis" )] - public double ScrollMinY2 - { - get - { - if ( _y2ScrollRangeList != null && _y2ScrollRangeList.Count > 0 ) - return _y2ScrollRangeList[0].Min; - else - return double.NaN; - } - set - { - if ( _y2ScrollRangeList != null && _y2ScrollRangeList.Count > 0 ) - { - ScrollRange tmp = _y2ScrollRangeList[0]; - tmp.Min = value; - _y2ScrollRangeList[0] = tmp; - } - } - } - /// - /// The maximum value for the Y2 axis scroll range. - /// - /// - /// Effectively, the maximum endpoint of the scroll range will cause the - /// value to be set to . Note that this - /// value applies only to the scroll bar settings. Axis panning (see ) - /// is not affected by this value. Note that this value can be overridden by - /// and . Also note that - /// this property is actually just an alias to the - /// property of the first element of . - /// - /// A double value indicating the maximum axis value - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( 0 ), - Description( "Sets the manual scroll maximum value for the Y2 axis" )] - public double ScrollMaxY2 - { - get - { - if ( _y2ScrollRangeList != null && _y2ScrollRangeList.Count > 0 ) - return _y2ScrollRangeList[0].Max; - else - return double.NaN; - } - set - { - if ( _y2ScrollRangeList != null && _y2ScrollRangeList.Count > 0 ) - { - ScrollRange tmp = _y2ScrollRangeList[0]; - tmp.Max = value; - _y2ScrollRangeList[0] = tmp; - } - } - } - - /// - /// Returns true if the user is currently scrolling via the scrollbar, or - /// false if no scrolling is taking place. - /// - /// - /// This method just tests ScrollBar.Capture to see if the - /// mouse has been captured by the scroll bar. If so, scrolling is active. - /// - public Boolean IsScrolling - { - get - { - if ( hScrollBar1 != null && vScrollBar1 != null ) - return hScrollBar1.Capture || vScrollBar1.Capture; - else - return false; - } - } - - - /// - /// Gets or sets the format for displaying tooltip values. - /// This format is passed to . - /// - /// - /// Use the type - /// to determine the format strings. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( PointPair.DefaultFormat ), - Description( "Sets the numeric display format string for the point value tooltips" )] - public string PointValueFormat - { - get { return _pointValueFormat; } - set { _pointValueFormat = value; } - } - - /// - /// Gets or sets the format for displaying tooltip values. - /// This format is passed to . - /// - /// - /// Use the type - /// to determine the format strings. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( XDate.DefaultFormatStr ), - Description( "Sets the date display format for the point value tooltips" )] - public string PointDateFormat - { - get { return _pointDateFormat; } - set { _pointDateFormat = value; } - } - - /// - /// Gets or sets the step size fraction for zooming with the mouse wheel. - /// A value of 0.1 will result in a 10% zoom step for each mouse wheel movement. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( 0.1 ), - Description( "Sets the step size fraction for zooming with the mouse wheel" )] - public double ZoomStepFraction - { - get { return _zoomStepFraction; } - set { _zoomStepFraction = value; } - } - - /// - /// Gets or sets a boolean value that determines if zooming with the wheel mouse - /// is centered on the mouse location, or centered on the existing graph. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to center the mouse wheel zoom at the current mouse location" )] - public bool IsZoomOnMouseCenter - { - get { return _isZoomOnMouseCenter; } - set { _isZoomOnMouseCenter = value; } - } - - /// - /// Gets the graph pane's current image. - /// - /// - /// - /// When the control has been disposed before this call. - /// - [Bindable( false ), Browsable( false ), - DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )] - public Image GetImage() - { - lock ( this ) - { - if ( BeenDisposed || _masterPane == null || _masterPane[0] == null ) - throw new ZedGraphException( "The control has been disposed" ); - - return _masterPane.GetImage(); - } - } - - /// - /// This checks if the control has been disposed. This is synonymous with - /// the graph pane having been nulled or disposed. Therefore this is the - /// same as ZedGraphControl.GraphPane == null. - /// - [Bindable( false ), Browsable( false ), - DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )] - public bool BeenDisposed - { - get - { - lock ( this ) return _masterPane == null; - } - } - - // Revision: JCarpenter 10/06 - /// - /// Readonly property that gets the list of selected CurveItems - /// - public Selection Selection - { - get { return _selection; } - } - - /// - /// Gets or sets a value that determines whether or not selection is allowed for the control. - /// - [Bindable( true ), Category( "Display" ), NotifyParentProperty( true ), - DefaultValue( false ), - Description( "true to allow selecting Curves" )] - public bool IsEnableSelection - { - get { return _isEnableSelection; } - set - { - _isEnableSelection = value; - - /* - if ( value ) - { - this.Cursor = Cursors.Default; - this.IsEnableZoom = false; - } - else - { - this.Cursor = Cursors.Cross; - this.IsEnableZoom = true; - } - */ - } - } - - #endregion - - } -} \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.ScrollBars.cs b/SDK/ZedGraphs/ZedGraph/ZedGraphControl.ScrollBars.cs deleted file mode 100644 index a2bb2ae..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.ScrollBars.cs +++ /dev/null @@ -1,395 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2007 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Windows.Forms; - -namespace ZedGraph -{ - partial class ZedGraphControl - { - - #region ScrollBars - - private void vScrollBar1_Scroll( object sender, ScrollEventArgs e ) - { - if ( this.GraphPane != null ) - { - if ( ( e.Type != ScrollEventType.ThumbPosition && - e.Type != ScrollEventType.ThumbTrack ) || - ( e.Type == ScrollEventType.ThumbTrack && - _zoomState == null ) ) - { - ZoomStateSave( this.GraphPane, ZoomState.StateType.Scroll ); - } - for ( int i = 0; i < this.GraphPane.YAxisList.Count; i++ ) - { - ScrollRange scroll = _yScrollRangeList[i]; - if ( scroll.IsScrollable ) - { - Axis axis = this.GraphPane.YAxisList[i]; - HandleScroll( axis, e.NewValue, scroll.Min, scroll.Max, vScrollBar1.LargeChange, - !axis.Scale.IsReverse ); - } - } - - for ( int i = 0; i < this.GraphPane.Y2AxisList.Count; i++ ) - { - ScrollRange scroll = _y2ScrollRangeList[i]; - if ( scroll.IsScrollable ) - { - Axis axis = this.GraphPane.Y2AxisList[i]; - HandleScroll( axis, e.NewValue, scroll.Min, scroll.Max, vScrollBar1.LargeChange, - !axis.Scale.IsReverse ); - } - } - - ApplyToAllPanes( this.GraphPane ); - - ProcessEventStuff( vScrollBar1, e ); - } - } - - private void ApplyToAllPanes( GraphPane primaryPane ) - { - foreach ( GraphPane pane in _masterPane._paneList ) - { - if ( pane != primaryPane ) - { - if ( _isSynchronizeXAxes ) - Synchronize( primaryPane.XAxis, pane.XAxis ); - if ( _isSynchronizeYAxes ) - Synchronize( primaryPane.YAxis, pane.YAxis ); - } - } - } - - private void Synchronize( Axis source, Axis dest ) - { - dest._scale._min = source._scale._min; - dest._scale._max = source._scale._max; - dest._scale._majorStep = source._scale._majorStep; - dest._scale._minorStep = source._scale._minorStep; - dest._scale._minAuto = source._scale._minAuto; - dest._scale._maxAuto = source._scale._maxAuto; - dest._scale._majorStepAuto = source._scale._majorStepAuto; - dest._scale._minorStepAuto = source._scale._minorStepAuto; - } - - private void hScrollBar1_Scroll( object sender, ScrollEventArgs e ) - { - if ( this.GraphPane != null ) - { - if ( ( e.Type != ScrollEventType.ThumbPosition && - e.Type != ScrollEventType.ThumbTrack ) || - ( e.Type == ScrollEventType.ThumbTrack && - _zoomState == null ) ) - ZoomStateSave( this.GraphPane, ZoomState.StateType.Scroll ); - - HandleScroll( this.GraphPane.XAxis, e.NewValue, _xScrollRange.Min, _xScrollRange.Max, - hScrollBar1.LargeChange, this.GraphPane.XAxis.Scale.IsReverse ); - - ApplyToAllPanes( this.GraphPane ); - - ProcessEventStuff( hScrollBar1, e ); - } - } - - private void ProcessEventStuff( ScrollBar scrollBar, ScrollEventArgs e ) - { - if ( e.Type == ScrollEventType.ThumbTrack ) - { - if ( this.ScrollProgressEvent != null ) - this.ScrollProgressEvent( this, hScrollBar1, _zoomState, - new ZoomState( this.GraphPane, ZoomState.StateType.Scroll ) ); - } - else // if ( e.Type == ScrollEventType.ThumbPosition ) - { - if ( _zoomState != null && _zoomState.IsChanged( this.GraphPane ) ) - { - //this.GraphPane.ZoomStack.Push( _zoomState ); - ZoomStatePush( this.GraphPane ); - - // Provide Callback to notify the user of pan events - if ( this.ScrollDoneEvent != null ) - this.ScrollDoneEvent( this, hScrollBar1, _zoomState, - new ZoomState( this.GraphPane, ZoomState.StateType.Scroll ) ); - - _zoomState = null; - } - } - - if ( this.ScrollEvent != null ) - this.ScrollEvent( scrollBar, e ); - } -/* - /// - /// Use the MouseCaptureChanged as an indicator for the start and end of a scrolling operation - /// - private void ScrollBarMouseCaptureChanged( object sender, EventArgs e ) - { - return; - - ScrollBar scrollBar = sender as ScrollBar; - if ( scrollBar != null ) - { - // If this is the start of a new scroll, then Capture will be true - if ( scrollBar.Capture ) - { - // save the original zoomstate - //_zoomState = new ZoomState( this.GraphPane, ZoomState.StateType.Scroll ); - ZoomStateSave( this.GraphPane, ZoomState.StateType.Scroll ); - } - else - { - // push the prior saved zoomstate, since the scale ranges have already been changed on - // the fly during the scrolling operation - if ( _zoomState != null && _zoomState.IsChanged( this.GraphPane ) ) - { - //this.GraphPane.ZoomStack.Push( _zoomState ); - ZoomStatePush( this.GraphPane ); - - // Provide Callback to notify the user of pan events - if ( this.ScrollDoneEvent != null ) - this.ScrollDoneEvent( this, scrollBar, _zoomState, - new ZoomState( this.GraphPane, ZoomState.StateType.Scroll ) ); - - _zoomState = null; - } - } - } - } -*/ - - private void HandleScroll( Axis axis, int newValue, double scrollMin, double scrollMax, - int largeChange, bool reverse ) - { - if ( axis != null ) - { - if ( scrollMin > axis._scale._min ) - scrollMin = axis._scale._min; - if ( scrollMax < axis._scale._max ) - scrollMax = axis._scale._max; - - int span = _ScrollControlSpan - largeChange; - if ( span <= 0 ) - return; - - if ( reverse ) - newValue = span - newValue; - - Scale scale = axis._scale; - - double delta = scale._maxLinearized - scale._minLinearized; - double scrollMin2 = scale.Linearize( scrollMax ) - delta; - scrollMin = scale.Linearize( scrollMin ); - //scrollMax = scale.Linearize( scrollMax ); - double val = scrollMin + (double)newValue / (double)span * - ( scrollMin2 - scrollMin ); - scale._minLinearized = val; - scale._maxLinearized = val + delta; - /* - if ( axis.Scale.IsLog ) - { - double ratio = axis._scale._max / axis._scale._min; - double scrollMin2 = scrollMax / ratio; - - double val = scrollMin * Math.Exp( (double)newValue / (double)span * - ( Math.Log( scrollMin2 ) - Math.Log( scrollMin ) ) ); - axis._scale._min = val; - axis._scale._max = val * ratio; - } - else - { - double delta = axis._scale._max - axis._scale._min; - double scrollMin2 = scrollMax - delta; - - double val = scrollMin + (double)newValue / (double)span * - ( scrollMin2 - scrollMin ); - axis._scale._min = val; - axis._scale._max = val + delta; - } - */ - this.Invalidate(); - } - } - - /// - /// Sets the value of the scroll range properties (see , - /// , , and - /// based on the actual range of the data for - /// each corresponding . - /// - /// - /// This method is called automatically by if - /// - /// is true. Note that this will not be called if you call AxisChange directly from the - /// . For example, zedGraphControl1.AxisChange() works properly, but - /// zedGraphControl1.GraphPane.AxisChange() does not. - public void SetScrollRangeFromData() - { - if ( this.GraphPane != null ) - { - double grace = CalcScrollGrace( this.GraphPane.XAxis.Scale._rangeMin, - this.GraphPane.XAxis.Scale._rangeMax ); - - _xScrollRange.Min = this.GraphPane.XAxis.Scale._rangeMin - grace; - _xScrollRange.Max = this.GraphPane.XAxis.Scale._rangeMax + grace; - _xScrollRange.IsScrollable = true; - - for ( int i = 0; i < this.GraphPane.YAxisList.Count; i++ ) - { - Axis axis = this.GraphPane.YAxisList[i]; - grace = CalcScrollGrace( axis.Scale._rangeMin, axis.Scale._rangeMax ); - ScrollRange range = new ScrollRange( axis.Scale._rangeMin - grace, - axis.Scale._rangeMax + grace, _yScrollRangeList[i].IsScrollable ); - - if ( i >= _yScrollRangeList.Count ) - _yScrollRangeList.Add( range ); - else - _yScrollRangeList[i] = range; - } - - for ( int i = 0; i < this.GraphPane.Y2AxisList.Count; i++ ) - { - Axis axis = this.GraphPane.Y2AxisList[i]; - grace = CalcScrollGrace( axis.Scale._rangeMin, axis.Scale._rangeMax ); - ScrollRange range = new ScrollRange( axis.Scale._rangeMin - grace, - axis.Scale._rangeMax + grace, _y2ScrollRangeList[i].IsScrollable ); - - if ( i >= _y2ScrollRangeList.Count ) - _y2ScrollRangeList.Add( range ); - else - _y2ScrollRangeList[i] = range; - } - - //this.GraphPane.CurveList.GetRange( out scrollMinX, out scrollMaxX, - // out scrollMinY, out scrollMaxY, out scrollMinY2, out scrollMaxY2, false, false, - // this.GraphPane ); - } - } - - private double CalcScrollGrace( double min, double max ) - { - if ( Math.Abs( max - min ) < 1e-30 ) - { - if ( Math.Abs( max ) < 1e-30 ) - return _scrollGrace; - else - return max * _scrollGrace; - } - else - return ( max - min ) * _scrollGrace; - } - - private void SetScroll( ScrollBar scrollBar, Axis axis, double scrollMin, double scrollMax ) - { - if ( scrollBar != null && axis != null ) - { - scrollBar.Minimum = 0; - scrollBar.Maximum = _ScrollControlSpan - 1; - - if ( scrollMin > axis._scale._min ) - scrollMin = axis._scale._min; - if ( scrollMax < axis._scale._max ) - scrollMax = axis._scale._max; - - int val = 0; - - Scale scale = axis._scale; - double minLinearized = scale._minLinearized; - double maxLinearized = scale._maxLinearized; - scrollMin = scale.Linearize( scrollMin ); - scrollMax = scale.Linearize( scrollMax ); - - double scrollMin2 = scrollMax - ( maxLinearized - minLinearized ); - /* - if ( axis.Scale.IsLog ) - scrollMin2 = scrollMax / ( axis._scale._max / axis._scale._min ); - else - scrollMin2 = scrollMax - ( axis._scale._max - axis._scale._min ); - */ - if ( scrollMin >= scrollMin2 ) - { - //scrollBar.Visible = false; - scrollBar.Enabled = false; - scrollBar.Value = 0; - } - else - { - double ratio = ( maxLinearized - minLinearized ) / ( scrollMax - scrollMin ); - - /* - if ( axis.Scale.IsLog ) - ratio = ( Math.Log( axis._scale._max ) - Math.Log( axis._scale._min ) ) / - ( Math.Log( scrollMax ) - Math.Log( scrollMin ) ); - else - ratio = ( axis._scale._max - axis._scale._min ) / ( scrollMax - scrollMin ); - */ - - int largeChange = (int)( ratio * _ScrollControlSpan + 0.5 ); - if ( largeChange < 1 ) - largeChange = 1; - scrollBar.LargeChange = largeChange; - - int smallChange = largeChange / _ScrollSmallRatio; - if ( smallChange < 1 ) - smallChange = 1; - scrollBar.SmallChange = smallChange; - - int span = _ScrollControlSpan - largeChange; - - val = (int)( ( minLinearized - scrollMin ) / ( scrollMin2 - scrollMin ) * - span + 0.5 ); - /* - if ( axis.Scale.IsLog ) - val = (int)( ( Math.Log( axis._scale._min ) - Math.Log( scrollMin ) ) / - ( Math.Log( scrollMin2 ) - Math.Log( scrollMin ) ) * span + 0.5 ); - else - val = (int)( ( axis._scale._min - scrollMin ) / ( scrollMin2 - scrollMin ) * - span + 0.5 ); - */ - if ( val < 0 ) - val = 0; - else if ( val > span ) - val = span; - - //if ( ( axis is XAxis && axis.IsReverse ) || ( ( ! axis is XAxis ) && ! axis.IsReverse ) ) - if ( ( axis is XAxis ) == axis.Scale.IsReverse ) - val = span - val; - - if ( val < scrollBar.Minimum ) - val = scrollBar.Minimum; - if ( val > scrollBar.Maximum ) - val = scrollBar.Maximum; - - scrollBar.Value = val; - scrollBar.Enabled = true; - //scrollBar.Visible = true; - } - } - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.cs b/SDK/ZedGraphs/ZedGraph/ZedGraphControl.cs deleted file mode 100644 index fe3f32c..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.cs +++ /dev/null @@ -1,857 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using System.Drawing.Imaging; -using System.Drawing.Printing; -using System.Data; -using System.Globalization; -using System.IO; -using System.Resources; -using System.Reflection; -using System.Text; -using System.Windows.Forms; -using System.Threading; - -namespace ZedGraph -{ -/* - /// - /// - /// - public struct DrawingThreadData - { - /// - /// - /// - public Graphics _g; - /// - /// - /// - public MasterPane _masterPane; - -// public DrawingThread( Graphics g, MasterPane masterPane ) -// { -// _g = g; -// _masterPane = masterPane; -// } - } -*/ - - /// - /// The ZedGraphControl class provides a UserControl interface to the - /// class library. This allows ZedGraph to be installed - /// as a control in the Visual Studio toolbox. You can use the control by simply - /// dragging it onto a form in the Visual Studio form editor. All graph - /// attributes are accessible via the - /// property. - /// - /// John Champion revised by Jerry Vos - /// $Revision: 3.86 $ $Date: 2007-11-03 04:41:29 $ - public partial class ZedGraphControl : UserControl - { - - #region Private Fields - - /// - /// This private field contains the instance for the MasterPane object of this control. - /// You can access the MasterPane object through the public property - /// . This is nulled when this Control is - /// disposed. - /// - private MasterPane _masterPane; - - /// - /// private field that determines whether or not tooltips will be displayed - /// when the mouse hovers over data values. Use the public property - /// to access this value. - /// - private bool _isShowPointValues = false; - /// - /// private field that determines whether or not tooltips will be displayed - /// showing the scale values while the mouse is located within the ChartRect. - /// Use the public property to access this value. - /// - private bool _isShowCursorValues = false; - /// - /// private field that determines the format for displaying tooltip values. - /// This format is passed to . - /// Use the public property to access this - /// value. - /// - private string _pointValueFormat = PointPair.DefaultFormat; - - /// - /// private field that determines whether or not the context menu will be available. Use the - /// public property to access this value. - /// - private bool _isShowContextMenu = true; - - /// - /// private field that determines whether or not a message box will be shown in response to - /// a context menu "Copy" command. Use the - /// public property to access this value. - /// - /// - /// Note that, if this value is set to false, the user will receive no indicative feedback - /// in response to a Copy action. - /// - private bool _isShowCopyMessage = true; - - private SaveFileDialog _saveFileDialog = new SaveFileDialog(); - - /// - /// private field that determines whether the settings of - /// and - /// will be overridden to true during printing operations. - /// - /// - /// Printing involves pixel maps that are typically of a dramatically different dimension - /// than on-screen pixel maps. Therefore, it becomes more important to scale the fonts and - /// lines to give a printed image that looks like what is shown on-screen. The default - /// setting for is true, but the default - /// setting for is false. - /// - /// - /// A value of true will cause both and - /// to be temporarily set to true during - /// printing operations. - /// - private bool _isPrintScaleAll = true; - /// - /// private field that determines whether or not the visible aspect ratio of the - /// will be preserved - /// when printing this . - /// - private bool _isPrintKeepAspectRatio = true; - /// - /// private field that determines whether or not the - /// dimensions will be expanded to fill the - /// available space when printing this . - /// - /// - /// If is also true, then the - /// dimensions will be expanded to fit as large - /// a space as possible while still honoring the visible aspect ratio. - /// - private bool _isPrintFillPage = true; - - /// - /// private field that determines the format for displaying tooltip date values. - /// This format is passed to . - /// Use the public property to access this - /// value. - /// - private string _pointDateFormat = XDate.DefaultFormatStr; - - /// - /// private value that determines whether or not zooming is enabled for the control in the - /// vertical direction. Use the public property to access this - /// value. - /// - private bool _isEnableVZoom = true; - /// - /// private value that determines whether or not zooming is enabled for the control in the - /// horizontal direction. Use the public property to access this - /// value. - /// - private bool _isEnableHZoom = true; - - /// - /// private value that determines whether or not zooming is enabled with the mousewheel. - /// Note that this property is used in combination with the and - /// properties to control zoom options. - /// - private bool _isEnableWheelZoom = true; - - /// - /// private value that determines whether or not point editing is enabled in the - /// vertical direction. Use the public property to access this - /// value. - /// - private bool _isEnableVEdit = false; - /// - /// private value that determines whether or not point editing is enabled in the - /// horizontal direction. Use the public property to access this - /// value. - /// - private bool _isEnableHEdit = false; - - /// - /// Determines whether editing will be handled automatically by ZedGraphControl_MouseDown() - /// or manually by StartEditing(). - /// - private bool _isEnableManualEditing = false; - - - /// - /// private value that determines whether or not panning is allowed for the control in the - /// horizontal direction. Use the - /// public property to access this value. - /// - private bool _isEnableHPan = true; - /// - /// private value that determines whether or not panning is allowed for the control in the - /// vertical direction. Use the - /// public property to access this value. - /// - private bool _isEnableVPan = true; - - // Revision: JCarpenter 10/06 - /// - /// Internal variable that indicates if the control can manage selections. - /// - private bool _isEnableSelection = false; - - private double _zoomStepFraction = 0.1; - - private ScrollRange _xScrollRange; - - private ScrollRangeList _yScrollRangeList; - private ScrollRangeList _y2ScrollRangeList; - - private bool _isShowHScrollBar = false; - private bool _isShowVScrollBar = false; - //private bool isScrollY2 = false; - private bool _isAutoScrollRange = false; - - private double _scrollGrace = 0.00; //0.05; - - private bool _isSynchronizeXAxes = false; - private bool _isSynchronizeYAxes = false; - - //private System.Windows.Forms.HScrollBar hScrollBar1; - //private System.Windows.Forms.VScrollBar vScrollBar1; - - // The range of values to use the scroll control bars - private const int _ScrollControlSpan = int.MaxValue; - // The ratio of the largeChange to the smallChange for the scroll bars - private const int _ScrollSmallRatio = 10; - - private bool _isZoomOnMouseCenter = false; - - private ResourceManager _resourceManager; - - /// - /// private field that stores a instance, which maintains - /// a persistent selection of printer options. - /// - /// - /// This is needed so that a "Print" action utilizes the settings from a prior - /// "Page Setup" action. - private PrintDocument _pdSave = null; - //private PrinterSettings printSave = null; - //private PageSettings pageSave = null; - - /// - /// This private field contains a list of selected CurveItems. - /// - //private List _selection = new List(); - private Selection _selection = new Selection(); - - #endregion - - #region Fields: Buttons & Keys Properties - - /// - /// Gets or sets a value that determines which Mouse button will be used to click on - /// linkable objects - /// - /// - private MouseButtons _linkButtons = MouseButtons.Left; - /// - /// Gets or sets a value that determines which modifier keys will be used to click - /// on linkable objects - /// - /// - private Keys _linkModifierKeys = Keys.Alt; - - /// - /// Gets or sets a value that determines which Mouse button will be used to edit point - /// data values - /// - /// - /// This setting only applies if and/or - /// are true. - /// - /// - private MouseButtons _editButtons = MouseButtons.Right; - /// - /// Gets or sets a value that determines which modifier keys will be used to edit point - /// data values - /// - /// - /// This setting only applies if and/or - /// are true. - /// - /// - private Keys _editModifierKeys = Keys.Alt; - - /// - /// Gets or sets a value that determines which mouse button will be used to select - /// 's. - /// - /// - /// This setting only applies if is true. - /// - /// - private MouseButtons _selectButtons = MouseButtons.Left; - /// - /// Gets or sets a value that determines which modifier keys will be used to select - /// 's. - /// - /// - /// This setting only applies if is true. - /// - /// - private Keys _selectModifierKeys = Keys.Shift; - - private Keys _selectAppendModifierKeys = Keys.Shift | Keys.Control; - - /// - /// Gets or sets a value that determines which Mouse button will be used to perform - /// zoom operations - /// - /// - /// This setting only applies if and/or - /// are true. - /// - /// - /// - /// - private MouseButtons _zoomButtons = MouseButtons.Left; - /// - /// Gets or sets a value that determines which modifier keys will be used to perform - /// zoom operations - /// - /// - /// This setting only applies if and/or - /// are true. - /// - /// - /// - /// - private Keys _zoomModifierKeys = Keys.None; - - /// - /// Gets or sets a value that determines which Mouse button will be used as a - /// secondary option to perform zoom operations - /// - /// - /// This setting only applies if and/or - /// are true. - /// - /// - /// - /// - private MouseButtons _zoomButtons2 = MouseButtons.None; - /// - /// Gets or sets a value that determines which modifier keys will be used as a - /// secondary option to perform zoom operations - /// - /// - /// This setting only applies if and/or - /// are true. - /// - /// - /// - /// - private Keys _zoomModifierKeys2 = Keys.None; - - /// - /// Gets or sets a value that determines which Mouse button will be used to perform - /// panning operations - /// - /// - /// This setting only applies if and/or - /// are true. A Pan operation (dragging the graph with - /// the mouse) should not be confused with a scroll operation (using a scroll bar to - /// move the graph). - /// - /// - /// - /// - private MouseButtons _panButtons = MouseButtons.Left; - - // Setting this field to Keys.Shift here - // causes an apparent bug to crop up in VS 2003, by which it will have the value: - // "System.Windows.Forms.Keys.Shift+None", which won't compile - /// - /// Gets or sets a value that determines which modifier keys will be used to perform - /// panning operations - /// - /// - /// This setting only applies if and/or - /// are true. A Pan operation (dragging the graph with - /// the mouse) should not be confused with a scroll operation (using a scroll bar to - /// move the graph). - /// - /// - /// - /// - private Keys _panModifierKeys = Keys.Control; - - /// - /// Gets or sets a value that determines which Mouse button will be used as a - /// secondary option to perform panning operations - /// - /// - /// This setting only applies if and/or - /// are true. A Pan operation (dragging the graph with - /// the mouse) should not be confused with a scroll operation (using a scroll bar to - /// move the graph). - /// - /// - /// - /// - private MouseButtons _panButtons2 = MouseButtons.Middle; - - // Setting this field to Keys.Shift here - // causes an apparent bug to crop up in VS 2003, by which it will have the value: - // "System.Windows.Forms.Keys.Shift+None", which won't compile - /// - /// Gets or sets a value that determines which modifier keys will be used as a - /// secondary option to perform panning operations - /// - /// - /// This setting only applies if and/or - /// are true. A Pan operation (dragging the graph with - /// the mouse) should not be confused with a scroll operation (using a scroll bar to - /// move the graph). - /// - /// - /// - /// - private Keys _panModifierKeys2 = Keys.None; - - #endregion - - #region Fields: Temporary state variables - - /// - /// Internal variable that indicates the control is currently being zoomed. - /// - private bool _isZooming = false; - /// - /// Internal variable that indicates the control is currently being panned. - /// - private bool _isPanning = false; - /// - /// Internal variable that indicates a point value is currently being edited. - /// - private bool _isEditing = false; - - // Revision: JCarpenter 10/06 - /// - /// Internal variable that indicates the control is currently using selection. - /// - private bool _isSelecting = false; - - /// - /// Internal variable that stores the reference for the Pane that is - /// currently being zoomed or panned. - /// - private GraphPane _dragPane = null; - /// - /// Internal variable that stores a rectangle which is either the zoom rectangle, or the incremental - /// pan amount since the last mousemove event. - /// - private Point _dragStartPt; - private Point _dragEndPt; - - private int _dragIndex; - private CurveItem _dragCurve; - private PointPair _dragStartPair; - /// - /// private field that stores the state of the scale ranges prior to starting a panning action. - /// - private ZoomState _zoomState; - private ZoomStateStack _zoomStateStack; - - //temporarily save the location of a context menu click so we can use it for reference - // Note that Control.MousePosition ends up returning the position after the mouse has - // moved to the menu item within the context menu. Therefore, this point is saved so - // that we have the point at which the context menu was first right-clicked - internal Point _menuClickPt; - - #endregion - - #region Constructors - - /// - /// Default Constructor - /// - public ZedGraphControl() - { - InitializeComponent(); - - // These commands do nothing, but they get rid of the compiler warnings for - // unused events - bool b = MouseDown == null || MouseUp == null || MouseMove == null; - - // Link in these events from the base class, since we disable them from this class. - base.MouseDown += new System.Windows.Forms.MouseEventHandler( this.ZedGraphControl_MouseDown ); - base.MouseUp += new System.Windows.Forms.MouseEventHandler( this.ZedGraphControl_MouseUp ); - base.MouseMove += new System.Windows.Forms.MouseEventHandler( this.ZedGraphControl_MouseMove ); - - //this.MouseWheel += new System.Windows.Forms.MouseEventHandler( this.ZedGraphControl_MouseWheel ); - - // Use double-buffering for flicker-free updating: - SetStyle( ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint - | ControlStyles.DoubleBuffer | ControlStyles.ResizeRedraw, true ); - //isTransparentBackground = false; - //SetStyle( ControlStyles.Opaque, false ); - SetStyle( ControlStyles.SupportsTransparentBackColor, true ); - //this.BackColor = Color.Transparent; - - _resourceManager = new ResourceManager( "ZedGraph.ZedGraph.ZedGraphLocale", - Assembly.GetExecutingAssembly() ); - - Rectangle rect = new Rectangle( 0, 0, this.Size.Width, this.Size.Height ); - _masterPane = new MasterPane( "", rect ); - _masterPane.Margin.All = 0; - _masterPane.Title.IsVisible = false; - - string titleStr = _resourceManager.GetString( "title_def" ); - string xStr = _resourceManager.GetString( "x_title_def" ); - string yStr = _resourceManager.GetString( "y_title_def" ); - - //GraphPane graphPane = new GraphPane( rect, "Title", "X Axis", "Y Axis" ); - GraphPane graphPane = new GraphPane( rect, titleStr, xStr, yStr ); - using ( Graphics g = this.CreateGraphics() ) - { - graphPane.AxisChange( g ); - //g.Dispose(); - } - _masterPane.Add( graphPane ); - - this.hScrollBar1.Minimum = 0; - this.hScrollBar1.Maximum = 100; - this.hScrollBar1.Value = 0; - - this.vScrollBar1.Minimum = 0; - this.vScrollBar1.Maximum = 100; - this.vScrollBar1.Value = 0; - - _xScrollRange = new ScrollRange( true ); - _yScrollRangeList = new ScrollRangeList(); - _y2ScrollRangeList = new ScrollRangeList(); - - _yScrollRangeList.Add( new ScrollRange( true ) ); - _y2ScrollRangeList.Add( new ScrollRange( false ) ); - - _zoomState = null; - _zoomStateStack = new ZoomStateStack(); - } - - /// - /// Clean up any resources being used. - /// - /// true if the components should be - /// disposed, false otherwise - protected override void Dispose( bool disposing ) - { - lock ( this ) - { - if ( disposing ) - { - if ( components != null ) - components.Dispose(); - } - base.Dispose( disposing ); - - _masterPane = null; - } - } - - #endregion - - #region Methods - - /// - /// Called by the system to update the control on-screen - /// - /// - /// A PaintEventArgs object containing the Graphics specifications - /// for this Paint event. - /// - protected override void OnPaint( PaintEventArgs e ) - { - lock ( this ) - { - if ( BeenDisposed || _masterPane == null || this.GraphPane == null ) - return; - - if ( hScrollBar1 != null && this.GraphPane != null && - vScrollBar1 != null && _yScrollRangeList != null ) - { - SetScroll( hScrollBar1, this.GraphPane.XAxis, _xScrollRange.Min, _xScrollRange.Max ); - SetScroll( vScrollBar1, this.GraphPane.YAxis, _yScrollRangeList[0].Min, - _yScrollRangeList[0].Max ); - } - - base.OnPaint( e ); - - // Add a try/catch pair since the users of the control can't catch this one - try { _masterPane.Draw( e.Graphics ); } - catch { } - } - -/* - // first, see if an old thread is still running - if ( t != null && t.IsAlive ) - { - t.Abort(); - } - - //dt = new DrawingThread( e.Graphics, _masterPane ); - //g = e.Graphics; - - // Fire off the new thread - t = new Thread( new ParameterizedThreadStart( DoDrawingThread ) ); - //ct.ApartmentState = ApartmentState.STA; - //ct.SetApartmentState( ApartmentState.STA ); - DrawingThreadData dtd; - dtd._g = e.Graphics; - dtd._masterPane = _masterPane; - - t.Start( dtd ); - //ct.Join(); -*/ - } - -// Thread t = null; - //DrawingThread dt = null; - -/* - /// - /// - /// - /// - public void DoDrawingThread( object dtdobj ) - { - try - { - DrawingThreadData dtd = (DrawingThreadData) dtdobj; - - if ( dtd._g != null && dtd._masterPane != null ) - dtd._masterPane.Draw( dtd._g ); - - // else - // { - // using ( Graphics g2 = CreateGraphics() ) - // _masterPane.Draw( g2 ); - // } - } - catch - { - - } - } -*/ - - /// - /// Called when the control has been resized. - /// - /// - /// A reference to the control that has been resized. - /// - /// - /// An EventArgs object. - /// - protected void ZedGraphControl_ReSize( object sender, System.EventArgs e ) - { - lock ( this ) - { - if ( BeenDisposed || _masterPane == null ) - return; - - Size newSize = this.Size; - - if ( _isShowHScrollBar ) - { - hScrollBar1.Visible = true; - newSize.Height -= this.hScrollBar1.Size.Height; - hScrollBar1.Location = new Point( 0, newSize.Height ); - hScrollBar1.Size = new Size( newSize.Width, hScrollBar1.Height ); - } - else - hScrollBar1.Visible = false; - - if ( _isShowVScrollBar ) - { - vScrollBar1.Visible = true; - newSize.Width -= this.vScrollBar1.Size.Width; - vScrollBar1.Location = new Point( newSize.Width, 0 ); - vScrollBar1.Size = new Size( vScrollBar1.Width, newSize.Height ); - } - else - vScrollBar1.Visible = false; - - using ( Graphics g = this.CreateGraphics() ) - { - _masterPane.ReSize( g, new RectangleF( 0, 0, newSize.Width, newSize.Height ) ); - //g.Dispose(); - } - this.Invalidate(); - } - } - /// This performs an axis change command on the graphPane. - /// - /// - /// This is the same as - /// ZedGraphControl.GraphPane.AxisChange( ZedGraphControl.CreateGraphics() ), however, - /// this method also calls if - /// is true. - /// - public virtual void AxisChange() - { - lock ( this ) - { - if ( BeenDisposed || _masterPane == null ) - return; - - using ( Graphics g = this.CreateGraphics() ) - { - _masterPane.AxisChange( g ); - //g.Dispose(); - } - - if ( _isAutoScrollRange ) - SetScrollRangeFromData(); - } - } - #endregion - - #region Zoom States - - /// - /// Save the current states of the GraphPanes to a separate collection. Save a single - /// () GraphPane if the panes are not synchronized - /// (see and ), - /// or save a list of states for all GraphPanes if the panes are synchronized. - /// - /// The primary GraphPane on which zoom/pan/scroll operations - /// are taking place - /// The that describes the - /// current operation - /// The that corresponds to the - /// . - /// - private ZoomState ZoomStateSave( GraphPane primaryPane, ZoomState.StateType type ) - { - ZoomStateClear(); - - if ( _isSynchronizeXAxes || _isSynchronizeYAxes ) - { - foreach ( GraphPane pane in _masterPane._paneList ) - { - ZoomState state = new ZoomState( pane, type ); - if ( pane == primaryPane ) - _zoomState = state; - _zoomStateStack.Add( state ); - } - } - else - _zoomState = new ZoomState( primaryPane, type ); - - return _zoomState; - } - - /// - /// Restore the states of the GraphPanes to a previously saved condition (via - /// . This is essentially an "undo" for live - /// pan and scroll actions. Restores a single - /// () GraphPane if the panes are not synchronized - /// (see and ), - /// or save a list of states for all GraphPanes if the panes are synchronized. - /// - /// The primary GraphPane on which zoom/pan/scroll operations - /// are taking place - private void ZoomStateRestore( GraphPane primaryPane ) - { - if ( _isSynchronizeXAxes || _isSynchronizeYAxes ) - { - for ( int i = 0; i < _masterPane._paneList.Count; i++ ) - { - if ( i < _zoomStateStack.Count ) - _zoomStateStack[i].ApplyState( _masterPane._paneList[i] ); - } - } - else if ( _zoomState != null ) - _zoomState.ApplyState( primaryPane ); - - ZoomStateClear(); - } - - /// - /// Place the previously saved states of the GraphPanes on the individual GraphPane - /// collections. This provides for an - /// option to undo the state change at a later time. Save a single - /// () GraphPane if the panes are not synchronized - /// (see and ), - /// or save a list of states for all GraphPanes if the panes are synchronized. - /// - /// The primary GraphPane on which zoom/pan/scroll operations - /// are taking place - /// The that corresponds to the - /// . - /// - private void ZoomStatePush( GraphPane primaryPane ) - { - if ( _isSynchronizeXAxes || _isSynchronizeYAxes ) - { - for ( int i = 0; i < _masterPane._paneList.Count; i++ ) - { - if ( i < _zoomStateStack.Count ) - _masterPane._paneList[i].ZoomStack.Add( _zoomStateStack[i] ); - } - } - else if ( _zoomState != null ) - primaryPane.ZoomStack.Add( _zoomState ); - - ZoomStateClear(); - } - - /// - /// Clear the collection of saved states. - /// - private void ZoomStateClear() - { - _zoomStateStack.Clear(); - _zoomState = null; - } - - /// - /// Clear all states from the undo stack for each GraphPane. - /// - private void ZoomStatePurge() - { - foreach ( GraphPane pane in _masterPane._paneList ) - pane.ZoomStack.Clear(); - } - - #endregion - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphControl.resx deleted file mode 100644 index 19dc0dd..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphControl.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphException.cs b/SDK/ZedGraphs/ZedGraph/ZedGraphException.cs deleted file mode 100644 index 65bf359..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphException.cs +++ /dev/null @@ -1,77 +0,0 @@ -//============================================================================ -//ZedGraphException Class -//Copyright 2004 Jerry Vos -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -using System; - -namespace ZedGraph -{ - /// - /// An exception thrown by ZedGraph. A child class of . - /// - /// - /// Jerry Vos modified by John Champion - /// $Revision: 3.2 $ $Date: 2006-06-24 20:26:44 $ - public class ZedGraphException : System.ApplicationException - { - /// - /// Initializes a new instance of the - /// class with serialized data. - /// - /// The - /// instance that holds the serialized object data about the exception being thrown. - /// The - /// instance that contains contextual information about the source or destination. - protected ZedGraphException( System.Runtime.Serialization.SerializationInfo info, - System.Runtime.Serialization.StreamingContext context ) - : base ( info, context ) - { - } - - /// - /// Initializes a new instance of the class with a specified - /// error message and a reference to the inner exception that is the cause of this exception. - /// - /// The error message that explains the reason for the exception. - /// The exception that is the cause of the current exception. - /// If the innerException parameter is not a null reference, the current exception is raised - /// in a catch block that handles the inner exception. - public ZedGraphException( System.String message, System.Exception innerException ) - : base ( message, innerException ) - { - - } - - /// - /// Initializes a new instance of the class with a specified error message. - /// - /// The error message that explains the reason for the exception. - public ZedGraphException ( System.String message ) - : base( message ) - { - } - - /// - /// Initializes a new instance of the class. - /// - public ZedGraphException() - : base() - { - } - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.de.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.de.resx deleted file mode 100644 index 2e1817d..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.de.resx +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Kopieren - - - Bild in Zwischenablage kopiert - - - Bild speichern als... - - - Maßstab auf Standardwert setzen - - - Punktwerte anzeigen - - - Überschrift - - - Alle Zoom-/Schwenkaktionen Rückgängig - - - Letzte Schwenkaktion Rückgängig - - - Letzte Zoomaktion Rückgängig - - - X-Achse - - - Y-Achse - - - Seite einrichten... - - - Drucken... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.es.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.es.resx deleted file mode 100644 index 5ff6912..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.es.resx +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copiar - - - Imagen copiada al clipboard - - - Almacenar la Imagen... - - - Escala Estándar - - - Visualizar los Valores de los Puntos - - - Título - - - Deshacer Todas las Acciones de Zoom/Desplazar - - - Deshacer Última Acción de Desplazamiento - - - Deshacer Última Acción de Zoom - - - Eje X - - - Eje Y - - - Configurar Página... - - - Imprimir... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.fr.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.fr.resx deleted file mode 100644 index 889956f..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.fr.resx +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copier l'image - - - Image copiée dans le presse-papiers - - - Enregistrer l'image sous... - - - Réinitialiser l'échelle - - - Visualiser les valeurs - - - Titre - - - Annuler tous les déplacements et les zooms - - - Annuler les déplacements - - - Annuler les zooms - - - Axe X - - - Axe Y - - - Mise en page... - - - Imprimer... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.hu.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.hu.resx deleted file mode 100644 index 3ca924c..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.hu.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Másolás - - - Az ábra a vágólapra másolva. - - - Kép mentése... - - - Alapértelmezett skála - - - Értékek mutatása - - - Cím - - - Eddigi méretezések visszavonása - - - Kicsinyítés visszavonása - - - Nagyítás visszavonása - - - X-tengely - - - Y-tengely - - - Görgetés visszavonása - - - Oldalbeállítás... - - - Nyomtatás... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.it.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.it.resx deleted file mode 100644 index ae9ab67..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.it.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copia - - - Immagine copiata negli Appunti - - - Salva Immagine come... - - - Imposta Scala di Default - - - Mostra i valori - - - Titolo - - - Annulla Tutti gli Zoom e Movimenti - - - Annulla i Movimenti - - - Annulla lo Zoom - - - Asse X - - - Asse Y - - - Annulla lo Scroll - - - Imposta pagina... - - - Stampa... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ja.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ja.resx deleted file mode 100644 index 1b04b50..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ja.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - コピー - - - 画像をクリップボードへコピーしました - - - 名前を付けて画像を保存... - - - スケールをデフォルトへ設定 - - - 座標を表示 - - - タイトル - - - 全画面表示 - - - 元に戻す - パン - - - ズームアウト - - - X 軸 - - - Y 軸 - - - 元に戻す - スクロール - - - ページ設定... - - - 印刷... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.pt.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.pt.resx deleted file mode 100644 index 68c2120..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.pt.resx +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copiar - - - Imagem copiada para o clipboard - - - Gravar Imagem... - - - Escala original - - - Ver os valores dos pontos - - - Título - - - Desfazer todas as acções Zoom/deslocar - - - Desfazer a última acção de deslocamento - - - Desfazer o último Zoom - - - Eixo X - - - Eixo Y - - - Configurar Página... - - - Imprimir... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.resx deleted file mode 100644 index 962f7e9..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Copy - - - Image copied to clipboard - - - Save Image As... - - - Set Scale to Default - - - Show Point Values - - - Title - - - Undo All Zoom/Pan - - - Un-Pan - - - Un-Zoom - - - X Axis - - - Y Axis - - - Undo Scroll - - - Page Setup... - - - Print... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ru.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ru.resx deleted file mode 100644 index f4d5a9b..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.ru.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Копировать - - - Рисунок скопирован в буфер - - - Рисунок сохранить как... - - - Установить масштаб в умолчание - - - Отображать значения точек - - - Заголовок - - - Отменить всё масштабирование/панорамирование - - - Отменить последнее панорамирование - - - Отменить последнее масштабирование - - - Оси X - - - Оси Y - - - Параметры страницы... - - - Печать... - - - Отменить прокрутку - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sk.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sk.resx deleted file mode 100644 index 3198b2c..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sk.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Kopírovať - - - Obrázok uložený do schránky - - - Uložiť obrázok ako... - - - Nastaviť štandardnú mierku - - - Ukazovať hodnoty bodov - - - Názov - - - Zrušiť všetky priblíženia/posunutia - - - Zrušiť posunutia - - - Zrušiť priblíženie - - - Os X - - - Os Y - - - Zrušiť scroll - - - Nastavenia strany... - - - Tlač... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sv.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sv.resx deleted file mode 100644 index 1bb0d34..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.sv.resx +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Kopiera - - - Bild kopierad till urklipp - - - Spara bild som... - - - >Sätt skala till standardvärde - - - Visa punktvärden - - - Titel - - - Återställ all panorering/zoomning - - - Backa panorering - - - Zooma ut - - - X-axel - - - Y-axel - - diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tr.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tr.resx deleted file mode 100644 index 1d06800..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tr.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Kopyala - - - İmaj Panoya Kopyalandı - - - İmajı Farklı Kaydet... - - - Ölçeği Varsayılan Yap - - - Nokta Değerlerini Göster - - - Başlık - - - Bütün Değişiklikleri Geri Al - - - Yatay Kaydırmayı Geri Al - - - Uzaklaştır - - - X-Ekseni - - - Y-Ekseni - - - Kaydırmayı Geri Al - - - Sayfa Ayarları... - - - Yazdır... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tw.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tw.resx deleted file mode 100644 index 2dc4c7b..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.tw.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 複製 - - - 複製圖表至剪貼簿 - - - 另存圖表... - - - 恢復成原來大小 - - - 顯示節點數值 - - - 標題 - - - 復原縮放/移動 - - - 復原移動 - - - 復原縮放 - - - X軸 - - - Y軸 - - - 復原捲動 - - - 頁面設定... - - - 列印... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.zh-cn.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.zh-cn.resx deleted file mode 100644 index 048b548..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.zh-cn.resx +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 复制 - - - 复制到剪贴板 - - - 另存图表... - - - 恢复默认大小 - - - 显示节点数值 - - - 标题 - - - 还原缩放/移动 - - - 还原移动 - - - 还原缩放 - - - X 轴 - - - Y 轴 - - - 页面设置... - - - 打印... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.zh-tw.resx b/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.zh-tw.resx deleted file mode 100644 index 2dc4c7b..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZedGraphLocale.zh-tw.resx +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 複製 - - - 複製圖表至剪貼簿 - - - 另存圖表... - - - 恢復成原來大小 - - - 顯示節點數值 - - - 標題 - - - 復原縮放/移動 - - - 復原移動 - - - 復原縮放 - - - X軸 - - - Y軸 - - - 復原捲動 - - - 頁面設定... - - - 列印... - - \ No newline at end of file diff --git a/SDK/ZedGraphs/ZedGraph/ZoomState.cs b/SDK/ZedGraphs/ZedGraph/ZoomState.cs deleted file mode 100644 index 7a6c5e1..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZoomState.cs +++ /dev/null @@ -1,191 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright © 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Text; - -#endregion - -namespace ZedGraph -{ - /// - /// A class that captures all the scale range settings for a . - /// - /// - /// This class is used to store scale ranges in order to allow zooming out to - /// prior scale range states. objects are maintained in the - /// collection. The object holds - /// a object for each of the three axes; the , - /// the , and the . - /// - /// John Champion - /// $Revision: 3.15 $ $Date: 2007-04-16 00:03:07 $ - public class ZoomState : ICloneable - { - /// - /// An enumeration that describes whether a given state is the result of a Pan or Zoom - /// operation. - /// - public enum StateType - { - /// - /// Indicates the object is from a Zoom operation - /// - Zoom, - /// - /// Indicates the object is from a Wheel Zoom operation - /// - WheelZoom, - /// - /// Indicates the object is from a Pan operation - /// - Pan, - /// - /// Indicates the object is from a Scroll operation - /// - Scroll - } - - /// - /// objects to store the state data from the axes. - /// - private ScaleState _xAxis, _x2Axis; - private ScaleStateList _yAxis, _y2Axis; - /// - /// An enum value indicating the type of adjustment being made to the - /// scale range state. - /// - private StateType _type; - - /// - /// Gets a value indicating the type of action (zoom or pan) - /// saved by this . - /// - public StateType Type - { - get { return _type; } - } - - /// - /// Gets a string representing the type of adjustment that was made when this scale - /// state was saved. - /// - /// A string representation for the state change type; typically - /// "Pan", "Zoom", or "Scroll". - public string TypeString - { - get - { - switch ( _type ) - { - case StateType.Pan: - return "Pan"; - case StateType.WheelZoom: - return "WheelZoom"; - case StateType.Zoom: - default: - return "Zoom"; - case StateType.Scroll: - return "Scroll"; - } - } - } - - /// - /// Construct a object from the scale ranges settings contained - /// in the specified . - /// - /// The from which to obtain the scale - /// range values. - /// - /// A enumeration that indicates whether - /// this saved state is from a pan or zoom. - public ZoomState( GraphPane pane, StateType type ) - { - - _xAxis = new ScaleState( pane.XAxis ); - _x2Axis = new ScaleState( pane.X2Axis ); - _yAxis = new ScaleStateList( pane.YAxisList ); - _y2Axis = new ScaleStateList( pane.Y2AxisList ); - _type = type; - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ZoomState( ZoomState rhs ) - { - _xAxis = new ScaleState( rhs._xAxis ); - _x2Axis = new ScaleState( rhs._x2Axis ); - _yAxis = new ScaleStateList( rhs._yAxis ); - _y2Axis = new ScaleStateList( rhs._y2Axis ); - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public ZoomState Clone() - { - return new ZoomState( this ); - } - - - /// - /// Copy the properties from this out to the specified . - /// - /// The to which the scale range properties should be - /// copied. - public void ApplyState( GraphPane pane ) - { - _xAxis.ApplyScale( pane.XAxis ); - _x2Axis.ApplyScale( pane.X2Axis ); - _yAxis.ApplyScale( pane.YAxisList ); - _y2Axis.ApplyScale( pane.Y2AxisList ); - } - - /// - /// Determine if the state contained in this object is different from - /// the state of the specified . - /// - /// The object with which to compare states. - /// true if the states are different, false otherwise - public bool IsChanged( GraphPane pane ) - { - return _xAxis.IsChanged( pane.XAxis ) || - _x2Axis.IsChanged( pane.X2Axis ) || - _yAxis.IsChanged( pane.YAxisList ) || - _y2Axis.IsChanged( pane.Y2AxisList ); - } - - } -} diff --git a/SDK/ZedGraphs/ZedGraph/ZoomStateStack.cs b/SDK/ZedGraphs/ZedGraph/ZoomStateStack.cs deleted file mode 100644 index 374b404..0000000 --- a/SDK/ZedGraphs/ZedGraph/ZoomStateStack.cs +++ /dev/null @@ -1,178 +0,0 @@ -//============================================================================ -//ZedGraph Class Library - A Flexible Line Graph/Bar Graph Library in C# -//Copyright 2004 John Champion -// -//This library is free software; you can redistribute it and/or -//modify it under the terms of the GNU Lesser General Public -//License as published by the Free Software Foundation; either -//version 2.1 of the License, or (at your option) any later version. -// -//This library is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -//Lesser General Public License for more details. -// -//You should have received a copy of the GNU Lesser General Public -//License along with this library; if not, write to the Free Software -//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//============================================================================= - -#region Using directives - -using System; -using System.Collections.Generic; -using System.Text; - -#endregion - -namespace ZedGraph -{ - /// - /// A LIFO stack of prior objects, used to allow zooming out to prior - /// states (of scale range settings). - /// - /// John Champion - /// $Revision: 3.1 $ $Date: 2006-06-24 20:26:44 $ - public class ZoomStateStack : List, ICloneable - { - /// - /// Default Constructor - /// - public ZoomStateStack() - { - } - - /// - /// The Copy Constructor - /// - /// The object from which to copy - public ZoomStateStack( ZoomStateStack rhs ) - { - foreach ( ZoomState state in rhs ) - { - Add( new ZoomState( state ) ); - } - } - - /// - /// Implement the interface in a typesafe manner by just - /// calling the typed version of - /// - /// A deep copy of this object - object ICloneable.Clone() - { - return this.Clone(); - } - - /// - /// Typesafe, deep-copy clone method. - /// - /// A new, independent copy of this class - public ZoomStateStack Clone() - { - return new ZoomStateStack( this ); - } - - - /// - /// Public readonly property that indicates if the stack is empty - /// - /// true for an empty stack, false otherwise - public bool IsEmpty - { - get { return this.Count == 0; } - } - - /// - /// Add the scale range information from the specified object as a - /// new entry on the stack. - /// - /// The object from which the scale range - /// information should be copied. - /// A enumeration that indicates whether this - /// state is the result of a zoom or pan operation. - /// The resultant object that was pushed on the stack. - public ZoomState Push( GraphPane pane, ZoomState.StateType type ) - { - ZoomState state = new ZoomState( pane, type ); - this.Add( state ); - return state; - } - - /// - /// Add the scale range information from the specified object as a - /// new entry on the stack. - /// - /// The object to be placed on the stack. - /// The object (same as the - /// parameter). - public ZoomState Push( ZoomState state ) - { - this.Add( state ); - return state; - } - - /// - /// Pop a entry from the top of the stack, and apply the properties - /// to the specified object. - /// - /// The object to which the scale range - /// information should be copied. - /// The object that was "popped" from the stack and applied - /// to the specified . null if no was - /// available (the stack was empty). - public ZoomState Pop( GraphPane pane ) - { - if ( !this.IsEmpty ) - { - ZoomState state = (ZoomState) this[ this.Count - 1 ]; - this.RemoveAt( this.Count - 1 ); - - state.ApplyState( pane ); - return state; - } - else - return null; - } - - /// - /// Pop the entry from the bottom of the stack, and apply the properties - /// to the specified object. Clear the stack completely. - /// - /// The object to which the scale range - /// information should be copied. - /// The object at the bottom of the stack that was applied - /// to the specified . null if no was - /// available (the stack was empty). - public ZoomState PopAll( GraphPane pane ) - { - if ( !this.IsEmpty ) - { - ZoomState state = (ZoomState) this[ 0 ]; - this.Clear(); - - state.ApplyState( pane ); - - return state; - } - else - return null; - } - - /// - /// Gets a reference to the object at the top of the stack, - /// without actually removing it from the stack. - /// - /// A object reference, or null if the stack is empty. - public ZoomState Top - { - get - { - if ( !this.IsEmpty ) - return (ZoomState) this[ this.Count - 1 ]; - else - return null; - } - } - } -} diff --git a/SDK/ZedGraphs/zedgraphmsskey.snk b/SDK/ZedGraphs/zedgraphmsskey.snk deleted file mode 100644 index de8c17b4da9686874fcff4aad571e72b6de3daa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096=SvRmj4e}_s8We0*-o8A@Y&j}=-=1|I zE;5u(Mky6Gd8vNq>8GGx&)Wnc+flXg_R1lwp~RX07NJKoH1Mz?o!c>;Ufv9l`&eWy z3|=^Gb_^Z~6hf*t07~Zts^wUoWu>8u=4e0V_~ZU_Ht`sJYE+K z#BmZhlDuk!c~7Ll7pTO#u!9W=J$z6xbQ zxFia{q9gMP86|*ITl92}h-Fu|s{X~1Sa^j%fY2dkOX)9V%mu#;xG#R0>-^sRAH*bj z%hCR)%CpQ6C5~0c2zE|LqdhM;Z0CgV<}!aSQp12b1ak(Np%^8md*1{ZPb`z>jLFUM zl_p&*Rfa=w%d`Cibo7mU#Kj~9frzANc1WGVV%@w%ZrSZOqRHES*JL}HeYC6@+FX`f zb_ZB4JqUV7Y0mC4Kj*qn{F>fQHBXg6E{S zvHC6Lu^68z3m?PkWCij4Z*Zi-5!vHV6^j}!ig=UF iY%SOzOy7@0tl>Jwc6 From 3b6f5f9a03f078b64310d932affffe43293e0101 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Mon, 19 Jun 2023 08:10:17 -0700 Subject: [PATCH 10/14] build: remove unused ZedGraph reference from the tests --- .../MidiShapeShifterTest/MidiShapeShifterTest.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj b/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj index 5d62f84..a3f47b2 100644 --- a/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj +++ b/MidiShapeShifter/MidiShapeShifterTest/MidiShapeShifterTest.csproj @@ -95,9 +95,6 @@ - - ..\lib\ZedGraph.dll - From fba16fdcf85ed2e83c4d69da3f8afd04cb5ed9f8 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Wed, 21 Jun 2023 00:53:41 -0700 Subject: [PATCH 11/14] build: add the postbuild powershell script --- .../MidiShapeShifter/MidiShapeShifter.csproj | 10 +++++----- .../MidiShapeShifter/postbuild.ps1 | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 MidiShapeShifter/MidiShapeShifter/postbuild.ps1 diff --git a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj index ef01044..ced7b6a 100644 --- a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj +++ b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj @@ -418,11 +418,11 @@ --> - rmdir "$(ProjectDir)bin\vst-dist\" /Q/S -xcopy "$(TargetDir)" "$(ProjectDir)bin\vst-dist\" /E/H/Q -del "$(ProjectDir)bin\vst-dist\$(TargetFileName)" -copy "$(TargetPath)" "$(ProjectDir)bin\vst-dist\$(TargetName).net.vstdll" -copy "$(TargetDir)\Jacobi.Vst.Interop.dll" "$(ProjectDir)bin\vst-dist\$(TargetFileName) + set ProjectDir=$(ProjectDir) +set TargetDir=$(TargetDir) +set TargetFileName=$(TargetFileName) + +powershell "$(ProjectDir)/postbuild.ps1" diff --git a/MidiShapeShifter/MidiShapeShifter/postbuild.ps1 b/MidiShapeShifter/MidiShapeShifter/postbuild.ps1 new file mode 100644 index 0000000..07e45c7 --- /dev/null +++ b/MidiShapeShifter/MidiShapeShifter/postbuild.ps1 @@ -0,0 +1,19 @@ +# The following variables should be set in Visual Studio: +# set ProjectDir=$(ProjectDir) +# set TargetDir=$(TargetDir) +# set TargetFileName=$(TargetFileName) + +$dist="$env:ProjectDir/bin/vst-dist/" + +if (Test-Path "$dist") { + rm -r -Force "$dist" +} +mkdir "$dist" + +# Copy all files except dlls +ls -r "$env:TargetDir" -Exclude *.dll | cp -r -Force -Destination "$dist" + +# Copy the main VST dll +cp "$env:TargetDir/Jacobi.Vst.Interop.dll" "$dist/$env:TargetFileName" + +ls "$dist" From 334910a5c2d040be7fbd7c1a9f863eac98dcb166 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Wed, 21 Jun 2023 00:56:33 -0700 Subject: [PATCH 12/14] feat: merge the dlls using ILRepack --- .../MidiShapeShifter/ILRepack.targets | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 MidiShapeShifter/MidiShapeShifter/ILRepack.targets diff --git a/MidiShapeShifter/MidiShapeShifter/ILRepack.targets b/MidiShapeShifter/MidiShapeShifter/ILRepack.targets new file mode 100644 index 0000000..065ca4f --- /dev/null +++ b/MidiShapeShifter/MidiShapeShifter/ILRepack.targets @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + From 5d823e3f22740adf4c113915eb6b087c92ae3439 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Wed, 21 Jun 2023 01:28:01 -0700 Subject: [PATCH 13/14] build: fix and optimize the ILRepack merge --- .../MidiShapeShifter/ILRepack.targets | 22 ++++++++++++++----- .../MidiShapeShifter/MidiShapeShifter.csproj | 12 ++++++++++ .../MidiShapeShifter/packages.config | 1 + .../MidiShapeShifter/postbuild.ps1 | 9 +++++++- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/MidiShapeShifter/MidiShapeShifter/ILRepack.targets b/MidiShapeShifter/MidiShapeShifter/ILRepack.targets index 065ca4f..34faa3b 100644 --- a/MidiShapeShifter/MidiShapeShifter/ILRepack.targets +++ b/MidiShapeShifter/MidiShapeShifter/ILRepack.targets @@ -4,26 +4,36 @@ - - + - + + + + diff --git a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj index ced7b6a..f286b51 100644 --- a/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj +++ b/MidiShapeShifter/MidiShapeShifter/MidiShapeShifter.csproj @@ -33,6 +33,8 @@ false true + + true @@ -54,6 +56,9 @@ AllRules.ruleset false + + Always + ..\packages\VST.NET.x64.1.1\lib\net40\Jacobi.Vst.Core.dll @@ -428,4 +433,11 @@ powershell "$(ProjectDir)/postbuild.ps1" + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ No newline at end of file diff --git a/MidiShapeShifter/MidiShapeShifter/packages.config b/MidiShapeShifter/MidiShapeShifter/packages.config index 7551101..261f252 100644 --- a/MidiShapeShifter/MidiShapeShifter/packages.config +++ b/MidiShapeShifter/MidiShapeShifter/packages.config @@ -1,5 +1,6 @@  + diff --git a/MidiShapeShifter/MidiShapeShifter/postbuild.ps1 b/MidiShapeShifter/MidiShapeShifter/postbuild.ps1 index 07e45c7..272ec60 100644 --- a/MidiShapeShifter/MidiShapeShifter/postbuild.ps1 +++ b/MidiShapeShifter/MidiShapeShifter/postbuild.ps1 @@ -11,9 +11,16 @@ if (Test-Path "$dist") { mkdir "$dist" # Copy all files except dlls -ls -r "$env:TargetDir" -Exclude *.dll | cp -r -Force -Destination "$dist" +ls -r "$env:TargetDir" -Exclude *.dll,*.pdb | cp -r -Force -Destination "$dist" # Copy the main VST dll cp "$env:TargetDir/Jacobi.Vst.Interop.dll" "$dist/$env:TargetFileName" +# Copy VST.net dlls +cp "$env:TargetDir/Jacobi.Vst.Core.dll" "$dist" +cp "$env:TargetDir/Jacobi.Vst.Framework.dll" "$dist" + +# Debugging symbols +cp "$env:TargetDir/MidiShapeShifter.net.pdb" "$dist" + ls "$dist" From c294247fb39c356147acfd17438e7ca182e9484a Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Wed, 21 Jun 2023 01:56:08 -0700 Subject: [PATCH 14/14] fix: add authors list to the VST --- .../Mss/UI/AboutPage.Designer.cs | 22 ++++++-- .../Mss/UI/PluginEditorView.cs | 52 +++++++++---------- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/MidiShapeShifter/MidiShapeShifter/Mss/UI/AboutPage.Designer.cs b/MidiShapeShifter/MidiShapeShifter/Mss/UI/AboutPage.Designer.cs index 299e6b9..cc643b8 100644 --- a/MidiShapeShifter/MidiShapeShifter/Mss/UI/AboutPage.Designer.cs +++ b/MidiShapeShifter/MidiShapeShifter/Mss/UI/AboutPage.Designer.cs @@ -34,6 +34,7 @@ private void InitializeComponent() this.versionLbl = new System.Windows.Forms.Label(); this.homePageLbl = new System.Windows.Forms.Label(); this.homePageLink = new System.Windows.Forms.LinkLabel(); + this.authors = new System.Windows.Forms.Label(); this.thanksLbl = new System.Windows.Forms.Label(); this.versionValueLbl = new System.Windows.Forms.Label(); this.vstNetLink = new System.Windows.Forms.LinkLabel(); @@ -102,10 +103,19 @@ private void InitializeComponent() this.homePageLink.Text = "https://github.com/robianmcd/midi-shape-shifter"; this.homePageLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.homePageLink_LinkClicked); // + // Authors + // + this.authors.AutoSize = true; + this.authors.Location = new System.Drawing.Point(9, 106); + this.authors.Name = "authors"; + this.authors.Size = new System.Drawing.Size(67, 26); + this.authors.TabIndex = 10; + this.authors.Text = "Created By:\nRob (@robianmcd), Amin Yahyaabadi (@aminya)"; + // // thanksLbl // this.thanksLbl.AutoSize = true; - this.thanksLbl.Location = new System.Drawing.Point(9, 106); + this.thanksLbl.Location = new System.Drawing.Point(9, 146); this.thanksLbl.Name = "thanksLbl"; this.thanksLbl.Size = new System.Drawing.Size(67, 13); this.thanksLbl.TabIndex = 10; @@ -122,7 +132,7 @@ private void InitializeComponent() // // vstNetLink // - this.vstNetLink.Location = new System.Drawing.Point(19, 126); + this.vstNetLink.Location = new System.Drawing.Point(19, 166); this.vstNetLink.Margin = new System.Windows.Forms.Padding(0); this.vstNetLink.Name = "vstNetLink"; this.vstNetLink.Size = new System.Drawing.Size(50, 13); @@ -133,7 +143,7 @@ private void InitializeComponent() // // iconzaLink // - this.iconzaLink.Location = new System.Drawing.Point(19, 146); + this.iconzaLink.Location = new System.Drawing.Point(19, 186); this.iconzaLink.Margin = new System.Windows.Forms.Padding(0); this.iconzaLink.Name = "iconzaLink"; this.iconzaLink.Size = new System.Drawing.Size(50, 13); @@ -148,10 +158,11 @@ private void InitializeComponent() this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.OkBtn; - this.ClientSize = new System.Drawing.Size(350, 204); + this.ClientSize = new System.Drawing.Size(400, 400); this.Controls.Add(this.iconzaLink); this.Controls.Add(this.vstNetLink); this.Controls.Add(this.versionValueLbl); + this.Controls.Add(this.authors); this.Controls.Add(this.thanksLbl); this.Controls.Add(this.homePageLink); this.Controls.Add(this.homePageLbl); @@ -180,9 +191,10 @@ private void InitializeComponent() private System.Windows.Forms.Label versionLbl; private System.Windows.Forms.Label homePageLbl; private System.Windows.Forms.LinkLabel homePageLink; + private System.Windows.Forms.Label authors; private System.Windows.Forms.Label thanksLbl; private System.Windows.Forms.Label versionValueLbl; private System.Windows.Forms.LinkLabel vstNetLink; private System.Windows.Forms.LinkLabel iconzaLink; } -} \ No newline at end of file +} diff --git a/MidiShapeShifter/MidiShapeShifter/Mss/UI/PluginEditorView.cs b/MidiShapeShifter/MidiShapeShifter/Mss/UI/PluginEditorView.cs index fc22fca..b50db13 100644 --- a/MidiShapeShifter/MidiShapeShifter/Mss/UI/PluginEditorView.cs +++ b/MidiShapeShifter/MidiShapeShifter/Mss/UI/PluginEditorView.cs @@ -356,8 +356,8 @@ public int getIndexForGenIdInListView(int id) } /// - /// Creates a ListViewItem based on the GeneratorMappingEntry specified by - /// . This ListViewItem is intended to be used in the + /// Creates a ListViewItem based on the GeneratorMappingEntry specified by + /// . This ListViewItem is intended to be used in the /// PluginEditorView's generator list box. /// /// The ListViewItem representation of a GeneratorMappingEntry @@ -388,9 +388,9 @@ private void lbKnob_KnobChangeValue(object sender, LBKnobEventArgs e) } } - //Knob values are stored as floats which are less percise than doubles. The max and min value for a parameter - //are stored as doubles so if the knob is set to 0.01f and the min value for a parameter is set to 0.01 then - //then knob value will actually be less than the min value. To avoid this we round the knob value so that it + //Knob values are stored as floats which are less percise than doubles. The max and min value for a parameter + //are stored as doubles so if the knob is set to 0.01f and the min value for a parameter is set to 0.01 then + //then knob value will actually be less than the min value. To avoid this we round the knob value so that it //should end up being the same as a double value as long as the double value is less than 6 digits. protected double GetRoundedKnobValueAsDouble(LBKnob knob) { @@ -563,7 +563,7 @@ protected void MakeAppropriateEquationControlsVisable(EquationType equationType) protected void SetGraphOutputLabelText(string outputText) { - //The following code will cause the output type label to flicker so it should be + //The following code will cause the output type label to flicker so it should be //avoided whenever possible. if (this.graphOutputLabelText != outputText) { @@ -765,7 +765,7 @@ private void editMappingBtn_Click(object sender, System.EventArgs e) this.activeMappingInfo.GetActiveMappingManager().ReplaceMappingEntry(activeMappingEntryCopy); RefreshMappingListView(); - //The equation curve needs to be updated incase the equation uses data1 or data2 + //The equation curve needs to be updated incase the equation uses data1 or data2 //and the input range for these has changed. this.commandQueue.EnqueueCommandOverwriteDups( EditorCommandId.UpdateEquationCurve, () => UpdateEquationCurve()); @@ -778,7 +778,7 @@ private void deleteMappingBtn_Click(object sender, EventArgs e) if (this.activeMappingInfo.GetActiveMappingExists() == false || this.activeMappingInfo.ActiveGraphableEntryType != GraphableEntryType.Mapping) { - //The delete button should be disabled if there is no ActiveGraphableEntry or if the + //The delete button should be disabled if there is no ActiveGraphableEntry or if the //active mapping is not in the mapping list view. Debug.Assert(false); return; @@ -792,7 +792,7 @@ private void deleteGeneratorBtn_Click(object sender, EventArgs e) if (this.activeMappingInfo.GetActiveMappingExists() == false || this.activeMappingInfo.ActiveGraphableEntryType != GraphableEntryType.Generator) { - //The delete button should be disabled if there is no ActiveGraphableEntry or if the + //The delete button should be disabled if there is no ActiveGraphableEntry or if the //active mapping is not in the mapping list view. Debug.Assert(false); return; @@ -1096,7 +1096,7 @@ protected void UpdateEquationCurve() pointsCurveEdit.Add(curControlPoint.X, curControlPoint.Y); } } - //Remove points. Itterate backwards so removing a point does not affect the + //Remove points. Itterate backwards so removing a point does not affect the //index of the next point. for (int i = pointsCurve.Points.Count - 1; i >= pointList.Count; i--) { @@ -1212,7 +1212,7 @@ protected void UpdateEquationCurve() protected void RemoveEquationCurvesFromGraph() { GraphPane pane = this.mainGraphControl.GraphPane; - //Itterate through this list backwards so that removing an element wont affect the + //Itterate through this list backwards so that removing an element wont affect the //index of the next element. for (int i = pane.CurveList.Count - 1; i >= 0; i--) { @@ -1382,8 +1382,8 @@ private void moveMappingUpBtn_Click(object sender, EventArgs e) this.activeMappingInfo.ActiveGraphableEntryType != GraphableEntryType.Mapping || this.activeMappingInfo.GetActiveMappingManager().GetMappingEntryIndexById(this.activeMappingInfo.ActiveGraphableEntryId) <= 0) { - //The move up button should be disabled if there is no ActiveGraphableEntry, - //if the ActiveGraphableEntry is not in the mapping list view or if the + //The move up button should be disabled if there is no ActiveGraphableEntry, + //if the ActiveGraphableEntry is not in the mapping list view or if the //ActiveGraphableEntry cannot be moved up. Debug.Assert(false); return; @@ -1399,7 +1399,7 @@ private void moveMappingDownBtn_Click(object sender, EventArgs e) if (this.activeMappingInfo.GetActiveMappingExists() == false || this.activeMappingInfo.ActiveGraphableEntryType != GraphableEntryType.Mapping) { - //The move up button should be disabled if there is no ActiveGraphableEntry, + //The move up button should be disabled if there is no ActiveGraphableEntry, //or if the ActiveGraphableEntry is not in the mapping list view. Debug.Assert(false); return; @@ -1511,8 +1511,8 @@ private bool mainGraphControl_MouseDownEvent(ZedGraphControl sender, MouseEventA }; - //If the click was close enough to an exsisting control point then start dragging - //it. The distances that is deemed "close enough" is defined in + //If the click was close enough to an exsisting control point then start dragging + //it. The distances that is deemed "close enough" is defined in //EqGraphConfig.ConfigureEqGraph. if (GetClickedControlPoint(mousePt, out LineItem controlPointsCurve, out int nearestPointIndex)) { @@ -1569,7 +1569,7 @@ private bool mainGraphControl_MouseDownEvent(ZedGraphControl sender, MouseEventA //segment after the new point string equationToDuplicate = curveInfo.CurveEquations[pointBeforeNewPointIndex + 1]; curveInfo.CurveEquations.Insert(pointBeforeNewPointIndex + 1, equationToDuplicate); - //If the new equation is being inserted before the one that is currently + //If the new equation is being inserted before the one that is currently //selected then the index of the currenly selected equation must be incremented. if (curveInfo.SelectedEquationType == EquationType.Curve && curveInfo.SelectedEquationIndex > pointBeforeNewPointIndex + 1) @@ -1587,8 +1587,8 @@ private bool mainGraphControl_MouseDownEvent(ZedGraphControl sender, MouseEventA if (pointAfterNewPointIndex != -1) { curveInfo.PointEquations.Insert(pointAfterNewPointIndex, newPointEquation); - //If the new point equation is being inserted before the point that is - //currently selected then the index of the currenly selected point + //If the new point equation is being inserted before the point that is + //currently selected then the index of the currenly selected point //equation must be incremented. if (curveInfo.SelectedEquationType == EquationType.Point && curveInfo.SelectedEquationIndex >= pointAfterNewPointIndex) @@ -1683,8 +1683,8 @@ private bool mainGraphControl_EditDragEvent(ZedGraphControl sender, this.commandQueue.EnqueueCommandOverwriteDups( EditorCommandId.UpdateCurveShapeControls, () => UpdateCurveShapeControls()); - //Returning false tells zedgraphs that we have already handled the drag event. We - //handel it in this method instead of letting zedgraphs handel it because zedgraphs + //Returning false tells zedgraphs that we have already handled the drag event. We + //handel it in this method instead of letting zedgraphs handel it because zedgraphs //would immeadateally force a redraw which we don't want to do until the host is idle. return false; } @@ -1698,8 +1698,8 @@ private void ZedGraphContextMenuBuilder(ZedGraphControl control, if (this.activeMappingInfo.GetActiveMappingExists()) { - //If the click was close enough to an exsisting control point then start dragging - //it. The distances that is deemed "close enough" is defined in + //If the click was close enough to an exsisting control point then start dragging + //it. The distances that is deemed "close enough" is defined in //EqGraphConfig.ConfigureEqGraph. bool controlPointClicked = GetClickedControlPoint(mousePt, out LineItem controlPointCurve, out int nearestPointIndex); @@ -1743,7 +1743,7 @@ private void ZedGraph_DeletePoint(object sender, EventArgs e) { if (this.activeMappingInfo.GetActiveMappingExists() == false) { - //This menu should be be possible to click when there is not active graphable + //This menu should be be possible to click when there is not active graphable //entry. Debug.Assert(false); return; @@ -2025,7 +2025,7 @@ private void EquationTextBox_KeyDown(object sender, KeyEventArgs e) private void EquationTextBox_KeyPress(object sender, KeyPressEventArgs e) { - //backspace triggers keypress but delete does not so we just let backspace + //backspace triggers keypress but delete does not so we just let backspace //be handeled automatically. if (e.KeyChar != '\b') { @@ -2036,7 +2036,7 @@ private void EquationTextBox_KeyPress(object sender, KeyPressEventArgs e) private void onlineHelp_Click(object sender, EventArgs e) { - System.Diagnostics.Process.Start("http://code.google.com/p/midi-shape-shifter/wiki/OnlineDocumentation"); + System.Diagnostics.Process.Start("https://github.com/aminya/midi-shape-shifter/tree/master/docs"); } }

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 diff --git a/SDK/NUnit/bin/net-2.0/tests/nunit.uiexception.tests.dll b/SDK/NUnit/bin/net-2.0/tests/nunit.uiexception.tests.dll deleted file mode 100644 index 71db6549a58b78c1f7e3000e358e4da1d3f1a430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126976 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