Click here to Skip to main content
15,896,207 members
Articles / Programming Languages / C#

Universal Framework for Science and Engineering - Part 2: Regression

Rate me:
Please Sign up or sign in to vote.
4.77/5 (19 votes)
11 Jul 20067 min read 51.2K   5K   76  
An article on universal scalable engineering framework applications.
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.Collections.Generic;
using System.Configuration.Assemblies;
using System.Resources;


namespace FormulaEditor
{
	/// <summary>
	/// Performs all dynamic formula editior operations
	/// </summary>
	public class FormulaEditorPerformer : IKeySymbol
	{

		#region Fields

		/// <summary>
		/// Locale formula resources
		/// </summary>
		//static private ResourceSet resources;

		/// <summary>
		/// The pen of line
		/// </summary>
		static private readonly Pen linePen = new Pen(Color.Black);

		/// <summary>
		/// The editor component
		/// </summary>
		private Control control;

		/// <summary>
		/// The image of cursor
		/// </summary>
		private Image cursorImage;

		
		/// <summary>
		/// Formula for editing
		/// </summary>
		private MathFormulaDrawable formula;

		/// <summary>
		/// Moved symbol
		/// </summary>
		private MathSymbol movedSymbol = null;

		/// <summary>
		/// New cursor symbol
		/// </summary>
		private IInsertedObject newCursor = null;

		/// <summary>
		/// Old cursor symbol
		/// </summary>
		private IInsertedObject oldCursor = null;

		/// <summary>
		/// New cursor remove symbol
		/// </summary>
		private IInsertedObject newRemoveCursor = null;

		/// <summary>
		/// Old cursor remove symbol
		/// </summary>
		private IInsertedObject oldRemoveCursor = null;

		/// <summary>
		/// New cursor symbol on toolbox
		/// </summary>
		private MathSymbol newSymbol = null;


		/// <summary>
		/// Old cursor symbol on toolbox
		/// </summary>
		private MathSymbol oldSymbol = null;

		/// <summary>
		/// Formula position
		/// </summary>
		private Point formulaPoint = new Point();

		/// <summary>
		/// Rectangle for fomula showing
		/// </summary>
		private Rectangle formulaRectangle = new Rectangle();

		/// <summary>
		/// Rectangle of work field
		/// </summary>
		private Rectangle workFieldRectangle = new Rectangle();

		/// <summary>
		/// Symbols on toolbox
		/// </summary>
		private ArrayList symbols = new ArrayList();

		/// <summary>
		/// Color of background
		/// </summary>
		private Color backgroundColor;

		/// <summary>
		/// Color of symbol
		/// </summary>
		private Color symbolColor;

		/// <summary>
		/// The position of the formula
		/// </summary>
		private Point pointFormula = new Point();

		/// <summary>
		/// The point of transition
		/// </summary>
		private Point transPoint = new Point();

		/// <summary>
		/// The inverted transition point
		/// </summary>
		private Point invTransPoint = new Point();

		/// <summary>
		/// The relative position of mouse curso 
		/// </summary>
		private Point imagePoint = new Point(0, 0);

		/// <summary>
		/// The background image
		/// </summary>
		private Image iBkgnd = null;

		/// <summary>
		/// The buffer image
		/// </summary>
		private Image iTemp = null;

		/// <summary>
		/// The position of the editor
		/// </summary>
		private Point editorPosition = new Point(0, 0);

		/// <summary>
		/// Old mouse x position
		/// </summary>
		private int oldX;

		/// <summary>
		/// Old mouse y position
		/// </summary>
		private int oldY;

		/// <summary>
		/// Width of moved image
		/// </summary>
		private int wImage;

		/// <summary>
		/// Height of moved image
		/// </summary>
		private int hImage;

		/// <summary>
		/// Flag of on/off mouse listener
		/// </summary>
		//private bool listenerOn = false;

		/// <summary>
		/// Cursor for image moving 
		/// </summary>
		static readonly private Cursor CURSOR_MOVE = Cursors.Cross;

		/// <summary>
		/// Cursor for symbol select/delete
		/// </summary>
		static readonly private Cursor CURSOR_EDIT = Cursors.Default;

		/// <summary>
		/// Brush of symbol
		/// </summary>
		private Brush symbolBrush = null;

		/// <summary>
		/// Brush of background
		/// </summary>
		private Brush backgroundBrush = null;

		/// <summary>
		/// The source rectanglr
		/// </summary>
		private Rectangle sRect = new Rectangle();

		/// <summary>
		/// The destination rectangle
		/// </summary>
		private Rectangle dRect = new Rectangle();

		/// <summary>
		/// The resources of errors
		/// </summary>
		//private static ResourceSet errorResources;

		/// <summary>
		/// The error help url 
		/// </summary>
		private static ResourceSet errorURLResources;


		/// <summary>
		/// Key symbol
		/// </summary>
		private IKeySymbol keySymbol;

		/// <summary>
		/// Key event handler
		/// </summary>
		private KeyPressEventHandler keyPressEventHandler;

		/// <summary>
		/// Key event handler
		/// </summary>
		private KeyEventHandler keyUpEventHandler;


        private IDateTimeSource dateTime;

		#endregion

		#region Constructors

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="control">component the editor component</param>
        /// <param name="formula">formula the formula for edit</param>
        public FormulaEditorPerformer(Control control, MathFormulaDrawable formula)
        {
            this.control = control;
            this.formula = formula;
            newCursor = formula;
            keyPressEventHandler = new KeyPressEventHandler(keyPress);
            keyUpEventHandler = new KeyEventHandler(keyUp);
            keySymbol = this;
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="control">component the editor component</param>
        /// <param name="formula">formula the formula for edit</param>
     /*   public FormulaEditorPerformer(Control control, string formula, int[] sizes)
        {
            this.control = control;
            SetFormula(formula, sizes);
            newCursor = this.formula;
            keyPressEventHandler = new KeyPressEventHandler(keyPress);
            keyUpEventHandler = new KeyEventHandler(keyUp);
            keySymbol = this;
        }*/

		#endregion

        #region IKeySymbol Members

        public MathSymbol GetSymbol(KeyPressEventArgs args)
        {
            char c = args.KeyChar;
            //string s = args.ToString();
            return new SimpleSymbolDrawable(new SimpleSymbol(c, 0x0, false, false));
        }

        #endregion

		#region Specific Members

        /// <summary>
        /// Date time source
        /// </summary>
        public IDateTimeSource DateTime
        {
            set
            {
                dateTime = value;
            }
        }

		/// <summary>
		/// The resources of help url
		/// </summary>
		public static ResourceSet ErrorURLResources
		{
			get
			{
				return errorURLResources;
			}
			set
			{
				errorURLResources = value;
			}
		}

        /// <summary>
        /// String representation of formula
        /// </summary>
        public string FormulaString
        {
            get
            {
                MathFormula f = new MathFormula(formula, UndrawableConverter.Object);
                return f.FormulaString;
            }
        }


		/// <summary>
		/// Adds symbol to toolbox
		/// </summary>
		/// <param name="symbol">symbol</param>
		public void Add(IDrawableSymbol symbol)
		{
			symbols.Add(symbol);
		}

		/// <summary>
		/// Number of symbols
		/// </summary>
		public int Count
		{
			get
			{
				return symbols.Count;
			}
		}

		/// <summary>
		/// The n th symbol on toolbox
		/// </summary>
		public IDrawableSymbol this[int n]
		{
			get
			{
				return symbols[n] as IDrawableSymbol;
			}
		}

		/// <summary>
		/// Finds symbol
		/// </summary>
		/// <param name="s">Prototype</param>
		/// <returns>Found symbol</returns>
		public MathSymbol Find(MathSymbol s)
		{
			foreach (MathSymbol sym in symbols)
			{
				if (sym.IsSame(s))
				{
					return sym;
				}
			}
			return null;
		}



		/// <summary>
		/// Sets colors
		/// </summary>
		/// <param name="colBk">colBk the background color</param>
		/// <param name="colSym">colSym the symbol color</param>
		public void SetColors(Color colBk, Color colSym)
		{
			backgroundColor = colBk;
			symbolColor = colSym;
			this.backgroundBrush = new SolidBrush(colBk);
			this.symbolBrush = new SolidBrush(colSym);
		}

		/// <summary>
		/// The edited fomula
		/// </summary>
		public MathFormulaDrawable Formula
		{
			get
			{
				return formula;
			}
			set
			{
				formula = value;
				formula.Position = pointFormula;
				formula.CalculateFullRelativeRectangle();
				formula.CalculatePositions();
				newCursor = formula;
			}
		}


		/// <summary>
		/// Sets a new editing formula
		/// </summary>
		/// <param name="formula">The formula</param>
		/// <param name="rectangle">The new rectangle of new formula</param>
		public void SetFormula(MathFormulaDrawable formula, Rectangle rectangle)
		{
			this.formula = formula;
			newCursor = this.formula;
			Rectangle r = formulaRectangle;
			r.X = rectangle.X;
			r.Y = rectangle.Y;
			r.Width = rectangle.Width;
			r.Height = rectangle.Height;
			Point p = pointFormula;
			p.X = r.X + 20;
			p.Y = r.Y + r.Height / 2;
			this.formula.Position = p;
			this.formula.CalculateFullRelativeRectangle();
			this.formula.CalculatePositions();
		}


		/// <summary>
		/// The formula rectangle
		/// </summary>
		public Rectangle FormulaRectangle
		{
			set
			{
				formulaRectangle.X = value.X;
				formulaRectangle.Y = value.Y;
				formulaRectangle.Width = value.Width;
				formulaRectangle.Height = value.Height;
			}
			get
			{
				return formulaRectangle;
			}
		}

		/// <summary>
		/// The wokfield rectangle
		/// </summary>
		public Rectangle WorkFieldRectangle
		{
			set
			{
				workFieldRectangle.X = value.X;
				workFieldRectangle.Y = value.Y;
				workFieldRectangle.Width = value.Width;
				workFieldRectangle.Height = value.Height;
			}
			get
			{
				return workFieldRectangle;
			}
		}

		/// <summary>
		/// Preparation
		/// </summary>
		/// <param name="iBkgnd">The background image</param>
		public void Prepare(Image iBkgnd)
		{
			this.iBkgnd = iBkgnd;
			Graphics g = Graphics.FromImage(iBkgnd);
			for (int i = 0; i < Count; i++)
			{
				IDrawableSymbol symbol = this[i];
				drawSymbol(symbol as MathSymbol, true);
				symbol.Prepare(this);
			}
			Rectangle r = formulaRectangle;
			pointFormula.X = r.X + 20;
			pointFormula.Y = r.Y + r.Height / 2;
			iTemp = new Bitmap(iBkgnd.Width, iBkgnd.Height);
			g = Graphics.FromImage(iTemp);
			g.DrawImage(iBkgnd, 0, 0);
			DrawFormula();
			Bitmap im = new Bitmap(iBkgnd.Width, iBkgnd.Height);
			Brush brush = new SolidBrush(Color.FromArgb(120, 50, 50, 50));
			Graphics gI = Graphics.FromImage(im);
			gI.FillRectangle(brush, 0, 0, im.Width, im.Height);
			cursorImage = im;
		}

		/// <summary>
		/// Event handlers initialization
		/// </summary>
		public void InitEventHandlers()
		{
			control.Paint += new PaintEventHandler(onPaint);
			control.MouseUp += new MouseEventHandler(onMouseClicked);
			control.MouseMove += new MouseEventHandler(onMouseMove);
			control.KeyPress += new KeyPressEventHandler(keyPress);
			control.KeyUp += new KeyEventHandler(keyUp);
		}

		/// <summary>
		/// Key press event handler
		/// </summary>
		public KeyPressEventHandler KeyPressEventHandler
		{
			get
			{
				return keyPressEventHandler;
			}
			set
			{
				keyPressEventHandler = value;
			}
		}

		/// <summary>
		/// Key press event handler
		/// </summary>
		public KeyEventHandler KeyUpEventHandler
		{
			get
			{
				return keyUpEventHandler;
			}
		}

		/// <summary>
		/// Key symbol
		/// </summary>
		public IKeySymbol KeySymbol
		{
			set
			{
				keySymbol = value;
			}
		}

        /// <summary>
        /// Sets key event to control and all its childrem
        /// </summary>
        /// <param name="c">The control</param>
        public void SetKeyEvents(Control c, List<Control> exc)
        {
            if (keyUpEventHandler == null)
            {
                return;
            }
            if (c == control)
            {
                return;
            }
            if (exc != null)
            {
                if (exc.Contains(c))
                {
                    return;
                }
            }
            c.KeyUp += keyUpEventHandler;
            c.KeyPress += keyPressEventHandler;
            foreach (Control cont in c.Controls)
            {
                SetKeyEvents(cont, exc);
            }
        }

		/// <summary>
		/// Painting
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		private void onPaint(object sender, PaintEventArgs e)
		{
			e.Graphics.DrawImage(iTemp, transPoint.X, transPoint.Y);
		}

		/// <summary>
		/// Key up
		/// </summary>
		/// <param name="sender">Sender</param>
		/// <param name="args">Arguments</param>
		private void keyUp(object sender, KeyEventArgs args)
		{
			if (args.KeyData != Keys.Back)
			{
				return;
			}
			MathSymbol sym = formula.Last;
			if (sym != null)
			{
				sym.Remove();
				drawFormulaOnComponent();
			}

		}



		/// <summary>
		/// Key up
		/// </summary>
		/// <param name="sender">Sender</param>
		/// <param name="args">Arguments</param>
		private void keyPress(object sender, KeyPressEventArgs args)
		{
			if (keySymbol != null)
			{
				MathSymbol sym = keySymbol.GetSymbol(args);
				if (sym == null)
				{
					return;
				}
				sym = Find(sym);
				if (sym == null)
				{
					return;
				}
				if (newCursor is MathSymbol)
				{
					MathSymbol ds = newCursor as MathSymbol;
					newCursor = MathSymbolDrawable.InsertObject(ds, sym) as IInsertedObject;
				}
				else if (newCursor is MathFormulaDrawable)
				{
					MathFormulaDrawable mf = newCursor as MathFormulaDrawable;
					newCursor = mf.InsertObject(sym) as IInsertedObject;
				}
				//newCursor = newCursor.InsertObject(movedSymbol);
				movedSymbol = null;
				drawCursor();
				drawFormulaOnComponent();
				oldCursor = movedSymbol as IInsertedObject;
				control.Cursor = CURSOR_EDIT;
			}
		}

		/// <summary>
		/// The editor component
		/// </summary>
		public Control EditControl
		{
			get
			{
				return control;
			}
		}

		/// <summary>
		/// The "on click" event handler
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		private void onMouseClicked(object sender, MouseEventArgs e)
		{
			translate(e);
			if (movedSymbol == null)
			{
				movedSymbol = newSymbol;
				if (movedSymbol != null)
				{
                    if (movedSymbol is DateTimeSymbol)
                    {
                        DateTimeSymbol dts = movedSymbol as DateTimeSymbol;
                        dts.DateTime = dateTime.DateTime;
                    }
					IDrawableSymbol ds = movedSymbol as IDrawableSymbol;
					wImage = ds.PureDrawable.SymbolImage.Width;
					hImage = ds.PureDrawable.SymbolImage.Height;
					control.Cursor = CURSOR_MOVE;
					oldX = imagePoint.X;
					oldY = imagePoint.Y;
					drawCursor();
					if (newCursor != null)
					{
						drawCursor(newCursor, true, true);
					}
				}
				if (newRemoveCursor != null)
				{
					MathSymbol s = (MathSymbol)newRemoveCursor;
					if (s.Contains(newCursor))
					{
						newCursor = null;
						oldCursor = null;
					}
					s.Remove();
					newRemoveCursor = null;
					oldRemoveCursor = null;
					drawFormulaOnComponent();
				}
			}
			else
			{
				if(newCursor == null)
				{
					movedSymbol = null;
					drawCursor();
					newCursor = null;
					oldCursor = null;
					control.Cursor = CURSOR_EDIT;
				}
				else
				{
					if (newCursor is MathSymbol)
					{
						MathSymbol ds = newCursor as MathSymbol;
						newCursor = MathSymbolDrawable.InsertObject(ds, movedSymbol) as IInsertedObject;
					}
					else if (newCursor is MathFormulaDrawable)
					{
						MathFormulaDrawable mf = newCursor as MathFormulaDrawable;
						newCursor = mf.InsertObject(movedSymbol) as IInsertedObject;
					}
					//newCursor = newCursor.InsertObject(movedSymbol);
					movedSymbol = null;
					drawCursor();
					drawFormulaOnComponent();
					oldCursor = movedSymbol as IInsertedObject;
					control.Cursor = CURSOR_EDIT;
				}
			}
		}

		/// <summary>
		/// The "on mouse move" event handler
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		public void onMouseMove(object sender, MouseEventArgs e)
		{
			translate(e);
			if (movedSymbol == null)
			{
				selectDelete();
			}
			else
			{
				move();
			}
		}

		/// <summary>
		/// Draws the formula
		/// </summary>
		public void DrawFormula()
		{
            if (formula == null)
            {
                return;
            }
			Rectangle r = formulaRectangle;
			Graphics g = Graphics.FromImage(iBkgnd);
			g.FillRectangle(backgroundBrush, r.X, r.Y, r.Width, r.Height);
			g.DrawLine(PureDrawableSymbol.LinePen, r.X, r.Y , r.X + r.Width - 1, r.Y);
			g.DrawLine(PureDrawableSymbol.LinePen, r.X + r.Width - 1, r.Y , r.X + r.Width - 1, r.Y + r.Height - 1);
			g.DrawLine(PureDrawableSymbol.LinePen, r.X, r.Y + r.Height - 1, r.X + r.Width - 1, r.Y + r.Height - 1);
			g.DrawLine(PureDrawableSymbol.LinePen, r.X, r.Y + r.Height - 1, r.X, r.Y);
			Point p = pointFormula;
			formula.Position = p;
			formula.CalculateFullRelativeRectangle();
			formula.CalculatePositions();
			formula.Draw(g);
			g.Dispose();
			g = Graphics.FromImage(iTemp);
			sRect.X = r.X;
			sRect.Y = r.Y;
			sRect.Width = r.Width + 1;
			sRect.Height = r.Height + 1;
			g.DrawImage(iBkgnd, sRect, sRect, GraphicsUnit.Pixel);
			g.Dispose();
		}


        /// <summary>
        /// Sets formula
        /// </summary>
        /// <param name="str"></param>
        /// <param name="sizes"></param>
        public void SetFormula(string str, int[] sizes)
        {
            string s = "";
            if (str != null)
            {
                s = str;
            }
            MathFormula f = MathFormula.FromString(sizes, s);
            MathFormulaDrawable form = new MathFormulaDrawable(f, DrawableConverter.Object);
            form.Sizes = sizes;
            formula = form;
            newCursor = form;
            DrawFormula();
        }

		/// <summary>
		/// Thranslate mouse position to editor position
		/// </summary>
		/// <param name="e">The mouse even</param>
		private void translate(MouseEventArgs e)
		{
			imagePoint.X = e.X;
			imagePoint.Y = e.Y;
			imagePoint.X += invTransPoint.X;
			imagePoint.Y += invTransPoint.Y;
		}

		/// <summary>
		/// Mouse event handler in select/delete mode
		/// </summary>
		private void selectDelete()
		{
			newSymbol = choosenSymbol;
			if (newSymbol != oldSymbol)
			{
				drawSymbol(newSymbol, false);
				drawSymbol(oldSymbol, true);
				showSybmol(newSymbol);
				showSybmol(oldSymbol);
				oldSymbol = newSymbol;
			}
			newRemoveCursor = formula.GetRemovedSymbol(imagePoint);
			if (newRemoveCursor != oldRemoveCursor)
			{
				drawCursor(oldRemoveCursor, false, false);
				drawCursor(newRemoveCursor, true, false);
				oldRemoveCursor = newRemoveCursor;
			}
		}

		/// <summary>
		/// The choosen symbol
		/// </summary>
		private MathSymbol choosenSymbol
		{
			get
			{
				for (int i = 0; i < Count; i++)
				{
					MathSymbol s = this[i] as MathSymbol;
					IDrawableSymbol ds = s as IDrawableSymbol;
					if (ds.PureDrawable.RectForShow.Contains(imagePoint))
					{
						return s;
					}
				}
				return null;
			}
		}

		/// <summary>
		///Draws symbol on tool box 
		/// </summary>
		/// <param name="s">the symbol</param>
		/// <param name="mode">the on/off mode</param>
		private void drawSymbol(MathSymbol s, bool mode)
		{
			if (s == null)
			{
				return;
			}
			IDrawableSymbol ds = s as IDrawableSymbol;
			Graphics g = Graphics.FromImage(iBkgnd);
			Color cb, cs;
			Brush bb, bs;

			if (mode)
			{
				cb = backgroundColor;
				cs = symbolColor;
				bb = this.backgroundBrush;
				bs = this.symbolBrush;
			}
			else
			{
				cs = backgroundColor;
				cb = symbolColor;
				bs = this.backgroundBrush;
				bb = this.symbolBrush;
			}
			Rectangle r = ds.PureDrawable.RectForShow;
			g.FillRectangle(bb, r.X, r.Y, r.Width, r.Height);

			Pen linePen = new Pen(Color.Black);
			ds.DrawOnComponent(g, bs, PureDrawableSymbol.LinePen);
			g.DrawLine(linePen, r.X, r.Y, r.X + r.Width - 1, r.Y);
			g.DrawLine(linePen, r.X + r.Width - 1, r.Y, r.X + r.Width - 1, r.Y + r.Height -1);
			g.DrawLine(linePen, r.X, r.Y + r.Height - 1, r.X + r.Width - 1, r.Y + r.Height - 1);
			g.DrawLine(linePen, r.X, r.Y, r.X, r.Y + r.Height - 1);
			g.Dispose();
		}

		/// <summary>
		/// Shows moved symbol
		/// </summary>
		/// <param name="s">the symbol</param>
		private void showSybmol(MathSymbol s)
		{
			if (s == null)
			{
				return;
			}
			Graphics g = Graphics.FromImage(iTemp);
			IDrawableSymbol ds = s as IDrawableSymbol;
			Rectangle r = ds.PureDrawable.RectForShow;
			sRect.X = r.X;
			sRect.Y = r.Y;
			sRect.Width = r.Width;
			sRect.Height = r.Height;
			g.DrawImage(iBkgnd, sRect, sRect, GraphicsUnit.Pixel);
			g.Dispose();
			g = Graphics.FromHwnd(control.Handle);
			Point p = transPoint;
			dRect.X = r.X + p.X;
			dRect.Y = r.Y + p.Y;
			dRect.Width = r.Width;
			dRect.Height = r.Height;
			sRect.X = r.X;
			sRect.Y = r.Y;
			sRect.Width = r.Width;
			sRect.Height = r.Height;
			g.DrawImage(iBkgnd, dRect, sRect, GraphicsUnit.Pixel);
			g.Dispose();
		}

		/// <summary>
		/// Mouse move event handler in move symbol mode
		/// </summary>
		private void move()
		{
			drawCursor();
			if (formulaRectangle.Contains(imagePoint))
			{
				newCursor = formula.GetInsertedObject(imagePoint);
			}
			drawCursor(oldCursor, false, true);
			if (oldCursor != newCursor)
			{
				oldCursor = newCursor;
			}
			drawCursor(newCursor, true, true);
		}

		/// <summary>
		/// Draws cursor in insert/delete mode
		/// </summary>
		/// <param name="obj">The selected object</param>
		/// <param name="b">The new/old flag</param>
		/// <param name="insert">The insert/delete flag</param>
		private void drawCursor(IInsertedObject obj, bool b, bool insert)
		{
			if (obj == null)
			{
				return;
			}
			Rectangle r;
			if (insert)
			{
				r = obj.InsertedRect;
			}
			else
			{
				r = ((IDrawableSymbol)obj).PureDrawable.FullRectangle;
			}
			Image im;
			if (b)
			{
				im = cursorImage;
			}
			else
			{
				im = iBkgnd;
			}
			Graphics g = Graphics.FromHwnd(control.Handle);
			Point p = transPoint;
			dRect.X = r.X + p.X;
			dRect.Y = r.Y + p.Y;
			dRect.Width = r.Width;
			dRect.Height = r.Height;
			sRect.X = r.X;
			sRect.Y = r.Y;
			sRect.Width = r.Width;
			sRect.Height = r.Height;
			g.DrawImage(im, dRect, sRect, GraphicsUnit.Pixel);
			g.Dispose();
		}


		/// <summary>
		/// Draws moved cursor
		/// </summary>
		private void drawCursor()
		{
			int minX, minY, maxX, maxY;
			Point p = imagePoint;
			if (oldX < p.X)
			{
				minX = oldX;
				maxX = p.X;
			}
			else
			{
				maxX = oldX;
				minX = p.X;
			}
			if (oldY < p.Y)
			{
				minY = oldY;
				maxY = p.Y;
			}
			else
			{
				maxY = oldY;
				minY = p.Y;
			}
			oldX = p.X;
			oldY = p.Y;
			int left = minX - 100;
			int top = minY - 60 - wImage;
			int right = maxX + 100;
			int bottom = maxY + 60 + hImage;
			if (left < 0)
			{
				left = 0;
			}
			if (top < 0)
			{
				top = 0;
			}
			Graphics g = Graphics.FromImage(iTemp);
			sRect.X = left;
			sRect.Y = top;
			sRect.Width = right - left;
			sRect.Height = bottom - top;
			g.DrawImage(iBkgnd, sRect, sRect, GraphicsUnit.Pixel);

			if (movedSymbol != null)
			{
				IDrawableSymbol ds = movedSymbol as IDrawableSymbol;
				Image im = ds.PureDrawable.SymbolImage;
				g.DrawImage(im, p.X - im.Width / 2,
					p.Y - im.Height - 20);
			}
			g.Dispose();
			Graphics gr = Graphics.FromHwnd(control.Handle);
			Point tP = transPoint;
			sRect.X += tP.X;
			sRect.Y += tP.Y;
			dRect.Width = sRect.Width;
			dRect.Height = sRect.Height;
			dRect.X = left + tP.X;
			dRect.Y = top + tP.Y;
			gr.DrawImage(iTemp, dRect, sRect, GraphicsUnit.Pixel);
			gr.Dispose();
		}

		/// <summary>
		/// Draws formula on component
		/// </summary>
		private void drawFormulaOnComponent()
		{
			DrawFormula();
			Graphics g = Graphics.FromHwnd(control.Handle);
			Rectangle r = formulaRectangle;
			Point tP = transPoint;
			dRect.X = r.X + tP.X;
			dRect.Y = r.Y + tP.Y;
			dRect.Width = r.Width + 1;
			dRect.Height = r.Height + 1;
			sRect.X = r.X;
			sRect.Y = r.Y;
			sRect.Width = r.Width + 1;
			sRect.Height = r.Height + 1;
			g.DrawImage(iBkgnd, dRect, sRect, GraphicsUnit.Pixel);
			g.Dispose();

		}
		/// <summary>
		/// Initial drawing
		/// </summary>
		public void DrawInit()
		{
			drawFormulaOnComponent();
		}

		#endregion

	}


}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Architect
Russian Federation Russian Federation
Ph. D. Petr Ivankov worked as scientific researcher at Russian Mission Control Centre since 1978 up to 2000. Now he is engaged by Aviation training simulators http://dinamika-avia.com/ . His additional interests are:

1) Noncommutative geometry

http://front.math.ucdavis.edu/author/P.Ivankov

2) Literary work (Russian only)

http://zhurnal.lib.ru/editors/3/3d_m/

3) Scientific articles
http://arxiv.org/find/all/1/au:+Ivankov_Petr/0/1/0/all/0/1

Comments and Discussions