Click here to Skip to main content
15,893,814 members
Articles / Programming Languages / C#

Universal Framework for Science and Engineering - Part 4: Space elevator

Rate me:
Please Sign up or sign in to vote.
4.56/5 (6 votes)
14 Aug 20066 min read 36.6K   2.2K   37  
An article on framework applications to the space elevator.
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.Configuration.Assemblies;
using System.Threading;
using System.Xml.Serialization;
using System.Xml;

using CategoryTheory;
using MathGraph;

namespace DiagramUI
{
	/// <summary>
	/// Component that shows the object on desktop
	/// </summary>
	[Serializable()]
	public class ObjectLabel : NamedComponent, ISerializable, IXmlElementCreator, IObjectLabel
	{
		/// <summary>
		/// Width
		/// </summary>
		protected int width = 100;

		/// <summary>
		/// Height
		/// </summary>
		protected int height = 100;

		/// <summary>
		/// Height of caption indicator
		/// </summary>
		protected int captionHeight = 30;

		/// <summary>
		/// The "is moved" flag
		/// </summary>
		protected bool isMoved;

		/// <summary>
		/// Old mouse x position
		/// </summary>
		protected int mouseX;

		/// <summary>
		/// Old mouse y position
		/// </summary>
		protected int mouseY;

		/// <summary>
		/// The correspond object
		/// </summary>
		protected ICategoryObject theObject;

		/// <summary>
		/// Brush for caption foreground
		/// </summary>
		protected Brush captionBrush;

		/// <summary>
		/// The pen of border
		/// </summary>
		protected Pen borderPen;
		
		/// <summary>
		/// Brush for caption foreground for inactive object
		/// </summary>
		protected Brush captionInactiveBrush;

		/// <summary>
		/// The pen of border for inactive object
		/// </summary>
		protected Pen borderInactivePen;

		/// <summary>
		/// Auxiliary variable
		/// </summary>
		protected bool arrowSelected;


		/// <summary>
		/// The events initialized flag
		/// </summary>
		protected bool eventsInitialized = false;


		/// <summary>
		/// Constructor
		/// </summary>
		private ObjectLabel()
		{
		}

		/// <summary>
		/// Construcor from correspond button
		/// </summary>
		/// <param name="button">Correspond button</param>
		public ObjectLabel(PaletteButton button) : base(button)
		{
			Initialize();
		}

		
		/// <summary>
		/// Serialization constructor
		/// </summary>
		/// <param name="info">Serialization info</param>
		/// <param name="context">Streaming context</param>
		public ObjectLabel(SerializationInfo info, StreamingContext context) : base(info, context)
		{
			Left = (int)info.GetValue("Left", typeof(int));
			Top = (int)info.GetValue("Top", typeof(int));
			theObject = (ICategoryObject)info.GetValue("Object", typeof(object));
			if (true)
			{
				IAssociatedObject obj = theObject as IAssociatedObject;
				obj.Object = this;
			}
			
		}

		
		/// <summary>
		/// ISerializable interface implementation
		/// </summary>
		/// <param name="info">Serialization info</param>
		/// <param name="context">Streaming context</param>
		new public void GetObjectData(SerializationInfo info, StreamingContext context)
		{
			base.GetObjectData(info, context);
			info.AddValue("Left", Left);
			info.AddValue("Top", Top);
			info.AddValue("Object", theObject);
		}

		#region INamedComponent Members

		public override string Name
		{
			get
			{
				return ComponentName;
			}
		}

		string INamedComponent.Kind
		{
			get
			{
				return stringKind;
			}
		}

		public override string Type
		{
			get
			{
				return type;
			}
		}

		void DiagramUI.INamedComponent.Remove()
		{
		}

		public override int X
		{
			get
			{
				return Left;
			}
			set
			{
				Left = value;
			}
		}

		public override int Y
		{
			get
			{
				return Top;
			}
			set
			{
				Top = value;
			}
		}

		IDesktop INamedComponent.Desktop
		{
			get
			{
				return Parent as IDesktop;
			}
			set
			{
			}
		}

		#endregion


		/// <summary>
		/// Desktop
		/// </summary>
		public override PanelDesktop Desktop
		{
			get
			{
				return Parent as PanelDesktop;
			}
		}




		
		/// <summary>
		/// The associated object
		/// </summary>
		public ICategoryObject Object
		{
			get
			{
                if (!PureObjectLabel.Wrappers)
                {
                    if (theObject is CategoryObjectWrapper)
                    {
                        CategoryObjectWrapper wrapper = theObject as CategoryObjectWrapper;
                        ICategoryObject ob = wrapper.TheObject;
                        if (ob != null)
                        {
                            return ob;
                        }
                    }
                }
				return theObject;
			}
			set
			{
				theObject = value;
			}
		}
		
		/// <summary>
		/// Removes itself
		/// </summary>
		/// <param name="formRemove">The "should remove properties editor" flag</param>
		public virtual void Remove(bool formRemove)
		{
			Desktop.Remove(this);
			if (formRemove)
			{
				RemoveForm();
			}
			if (Object is IRemovableObject)
			{
				IRemovableObject obj = Object as IRemovableObject;
				obj.RemoveObject();
			}
			theObject = null;
			GC.Collect();
		}

		/// <summary>
		/// Updates all associated properties editors
		/// </summary>
		public override void UpdateForms()
		{
			UpdateForm();
			ArrayList pairs = Desktop.Pairs;
			for (int i = 0; i < pairs.Count; i++)
			{
				ObjectsPair pair = pairs[i] as ObjectsPair;
				if (!pair.Belongs(this))
				{
					continue;
				}
				pair.UpdateForms();
			}
		}

		/// <summary>
		/// The selection flag
		/// </summary>
		public override bool Selected
		{
			get
			{
				return selected;
			}
			set
			{
				if (selected != value)
				{
					selected = value;
					Refresh();
				}
			}
		}

		/// <summary>
		/// Auxiliary property
		/// </summary>
		public bool ArrowSelected
		{
			get
			{
				return arrowSelected;
			}
			set
			{
				arrowSelected = value;
			}
		}

		/// <summary>
		/// Initialization
		/// </summary>
		public virtual void Initialize()
		{
			if (eventsInitialized)
			{
				return;
			}
			eventsInitialized = true;
			Width = width;
			Height = height;
			Rectangle r = new Rectangle();
			r.Width = Width;
			r.Height = captionHeight;
			EditorRectangle = r;
			textBrush = new SolidBrush(Color.White);
			captionBrush = new SolidBrush(Color.Blue);
			borderPen = new Pen(Color.Black);
			captionInactiveBrush = new SolidBrush(Color.DarkGray);
			borderInactivePen = new Pen(Color.LightGray);
			initEventHandlers();
			captionEditor.Visible = false;
			arrowSelected = false;
		}

		/// <summary>
		/// Creates correspond xml
		/// </summary>
		/// <param name="doc">document to create element</param>
		/// <returns>The created element</returns>
		public XmlElement CreateXml(XmlDocument doc)
		{
			XmlElement element = doc.CreateElement("ObjectLabel");
			XmlAttribute attrName = doc.CreateAttribute("Name");
			attrName.Value = ComponentName;
			element.Attributes.Append(attrName);
			if (Object is IXmlElementCreator)
			{
				IXmlElementCreator c = Object as IXmlElementCreator;
				XmlElement child = c.CreateXml(doc);
				element.AppendChild(child);
			}
			return element;
		}

		/// <summary>
		/// Event handlers initialisation
		/// </summary>
		protected void initEventHandlers()
		{
			initNamedEventHandlers();
			MouseDown += new MouseEventHandler(onMouseDownMoveEventHandler);
			MouseUp += new MouseEventHandler(onMouseUpMoveEventHandler);
			MouseLeave += new EventHandler(onLeaveEventHandler);
			MouseMove += new MouseEventHandler(onMouseMoveEventHandler) + 
				new MouseEventHandler(onMouseMoveArrow);
			Paint += new PaintEventHandler(onPaint);
		}

		/// <summary>
		/// The On Paint event handler
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		protected void onPaint(object sender, PaintEventArgs e)
		{
			Graphics g = e.Graphics;
			Brush brush = (theObject == null) ? captionInactiveBrush : captionBrush;
			g.FillRectangle(brush, EditorRectangle);
			Pen pen = (theObject == null) ? borderInactivePen : borderPen;
			g.DrawRectangle(pen, 0, 0, Width - 1, Height - 1);
			g.DrawString(ComponentName, font, textBrush, 5F, 5F);

		}
		
		/// <summary>
		/// The on mouse down event handler
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		protected void onMouseDownMoveEventHandler(object sender, MouseEventArgs e)
		{
			if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
			{
				return;
			}
			if (e.Button == MouseButtons.Right)
			{
				return;
			}
			if (EditorRectangle.Contains(e.X, e.Y))
			{
				return;
			}
			PaletteButton active = Desktop.Tools.Active; 
			if (active != null)
			{
				if (active.IsArrow & !(active.Kind == -1))
				{
					try
					{
						ICategoryArrow arrow = Desktop.Tools.Factory.CreateArrow(active);
						arrow.Source = Object;
						Desktop.ActiveArrow = arrow;
						Desktop.ActiveObjectLabel = this;
						return;
					}
					catch (Exception ex)
					{
						Desktop.Tools.Factory.ShowError(ex);
						return;
					}
				}
			}
			isMoved = true;
			mouseX = e.X;
			mouseY = e.Y;
		}

		/// <summary>
		/// The on mouse up event handler
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		protected void onMouseUpMoveEventHandler(object sender, MouseEventArgs e)
		{
			isMoved = false;
			ICategoryArrow arrow = Desktop.ActiveArrow;
			if (e.Button == MouseButtons.Right)
			{
				return;
			}
			try
			{
				if (arrow == null)
				{
					return;
				}
				int x = Left + e.X;
				int y = Top + e.Y;
				for (int i = 0; i < Desktop.Controls.Count; i++)
				{
					if (!(Desktop.Controls[i] is ChildObjectLabel) & !(Desktop.Controls[i] is ObjectLabel))
					{
						continue;
					}
					Control c = Desktop.Controls[i];
					bool hor = x < c.Left | x > c.Left + c.Width;
					bool vert = y < c.Top | y > c.Top + c.Height;
					if (hor | vert)
					{
						continue;
					}
					IObjectLabel label = null;
					if (Desktop.Controls[i] is IObjectLabel)
					{
						label = Desktop.Controls[i] as IObjectLabel;
					}
					else
					{
						ChildObjectLabel child = Desktop.Controls[i] as ChildObjectLabel;
						label = child.label;
					}

					arrow.Target = label.Object;
					ArrowLabel lab = Desktop.Tools.Factory.CreateArrowLabel(Desktop.Tools.Active, arrow, this, label);
					lab.Arrow.Object = lab;
					Desktop.AddArrowLabel(lab);
					break;
				}
			}
			catch (Exception ex)
			{
				if (arrow != null)
				{
					if (arrow is IRemovableObject)
					{
						IRemovableObject rem = arrow as IRemovableObject;
						rem.RemoveObject();
					}
				}
				Desktop.Tools.Factory.ShowError(ex);
			}
			Desktop.ActiveArrow = null;
			Desktop.Redraw();
		}

		/// <summary>
		/// The on mouse move event handler
		/// Draws correspond arrows
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		protected void onMouseMoveArrow(object sender, MouseEventArgs e)
		{
			if (e.Button == MouseButtons.Right)
			{
				return;
			}
			if (Desktop.ActiveArrow == null)
			{
				return;
			}
			Desktop.DrawArrow(this, e);
		}

		/// <summary>
		/// The on mouse move event handler
		/// Moves itself
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		protected void onMouseMoveEventHandler(object sender, MouseEventArgs e)
		{
			if (!isMoved)
			{
				return;
			}
			Left += e.X - mouseX;
			Top += e.Y - mouseY;
			//Desktop.IsMoved = true;
			if (Selected)
			{
				foreach (Control control in Desktop.Controls)
				{
					if (!(control is ObjectLabel))
					{
						continue;
					}
					ObjectLabel comp = control as ObjectLabel;
					if (comp.Selected & comp != this)
					{
						comp.Left += e.X - mouseX;
						comp.Top += e.Y - mouseY;
					}
				}
			}
			Desktop.Redraw();
		}

        protected override void imagedPaintEventHandler(object sender, PaintEventArgs e)
        {
            Image im = button.ButtonImage;
            if (Object is IPropertiesEditor)
            {
                IPropertiesEditor pe = Object as IPropertiesEditor;
                object o = pe.Editor;
                if (o is Array)
                {
                    Array arr = o as Array;
                    if (arr.Length > 1)
                    {
                        object image = arr.GetValue(1);
                        if (image is Image)
                        {
                            im = image as Image;
                        }
                        if (image is Icon)
                        {
                            Icon ic = image as Icon;
                            im = ic.ToBitmap();
                        }
                    }
                }
            }
            Graphics g = e.Graphics;
            if (selected)
            {
                BackColor = Color.LightGray;
            }
            else
            {
                BackColor = Color.White;
            }
            g.DrawImage(im, imagePosition);

        }
		
		/// <summary>
		/// The on mouse leave event handler
		/// </summary>
		/// <param name="sender">The sender</param>
		/// <param name="e">The event arguments</param>
		protected void onLeaveEventHandler(object sender,	EventArgs e)
		{
			isMoved = false;
		}
	}

}

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