| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 | using System.Windows;using System.Windows.Controls;using System.Windows.Input;namespace OpenSEMI.Ctrlib.Controls{	public class Slot : ContentControl	{		public static readonly DependencyProperty ViewTypeProperty;		public static readonly DependencyProperty WaferStatusProperty;		public static readonly DependencyProperty SlotIDProperty;		public static readonly DependencyProperty ModuleIDProperty;		public static readonly DependencyProperty IsDragSourceProperty;		public static readonly DependencyProperty IsDropTargetProperty;		public static readonly DependencyProperty IsDragEnterProperty;		public static readonly DependencyProperty IsSelectedProperty;		public static readonly DependencyProperty HasWaferProperty;		public static readonly DependencyProperty BorderStatusProperty;		public static readonly DependencyProperty SourceNameProperty;		public static readonly DependencyProperty CanDragDropProperty;		public static readonly DependencyProperty WaferTooltipProperty;		public static readonly DependencyProperty WaferTooltipExtProperty;		public static readonly DependencyProperty SeasoningWaferTypeProperty;		public static readonly DependencyProperty DuplicatedVisibilityProperty;        public static readonly DependencyProperty SlotWidthProperty;        public bool IsDraggable		{			get;			set;		}		public bool IsLeftMouseDown		{			get;			set;		}		public string ViewType		{			get			{				return (string)GetValue(ViewTypeProperty);			}			set			{				SetValue(ViewTypeProperty, value);			}		}		public int WaferStatus		{			get			{				return (int)GetValue(WaferStatusProperty);			}			set			{				SetValue(WaferStatusProperty, value);			}		}		public int SlotID		{			get			{				return (int)GetValue(SlotIDProperty);			}			set			{				SetValue(SlotIDProperty, value);			}		}		public string ModuleID		{			get			{				return (string)GetValue(ModuleIDProperty);			}			set			{				SetValue(ModuleIDProperty, value);			}		}		public bool IsDragSource		{			get			{				return (bool)GetValue(IsDragSourceProperty);			}			set			{				SetValue(IsDragSourceProperty, value);			}		}		public bool IsDropTarget		{			get			{				return (bool)GetValue(IsDropTargetProperty);			}			set			{				SetValue(IsDropTargetProperty, value);			}		}		public bool IsDragEnter		{			get			{				return (bool)GetValue(IsDragEnterProperty);			}			set			{				SetValue(IsDragEnterProperty, value);			}		}		public bool IsSelected		{			get			{				return (bool)GetValue(IsSelectedProperty);			}			set			{				SetValue(IsSelectedProperty, value);			}		}		public bool HasWafer		{			get			{				return (bool)GetValue(HasWaferProperty);			}			set			{				SetValue(HasWaferProperty, value);			}		}		public SlotBorderStatus BorderStatus		{			get			{				return (SlotBorderStatus)GetValue(BorderStatusProperty);			}			set			{				SetValue(BorderStatusProperty, value);			}		}		public string SourceName		{			get			{				return (string)GetValue(SourceNameProperty);			}			set			{				SetValue(SourceNameProperty, value);			}		}		public bool CanDragDrop		{			get			{				return (bool)GetValue(CanDragDropProperty);			}			set			{				SetValue(CanDragDropProperty, value);			}		}		public string WaferTooltip		{			get			{				return (string)GetValue(WaferTooltipProperty);			}			set			{				SetValue(WaferTooltipProperty, value);			}		}		public string WaferTooltipExt		{			get			{				return (string)GetValue(WaferTooltipExtProperty);			}			set			{				SetValue(WaferTooltipExtProperty, value);			}		}		public string SeasoningWaferType		{			get			{				return (string)GetValue(SeasoningWaferTypeProperty);			}			set			{				SetValue(SeasoningWaferTypeProperty, value);			}		}		public Visibility DuplicatedVisibility		{			get			{				return (Visibility)GetValue(DuplicatedVisibilityProperty);			}			set			{				SetValue(DuplicatedVisibilityProperty, value);			}		}        public int SlotWidth        {            get            {                return (int)GetValue(SlotWidthProperty);            }            set            {                SetValue(SlotWidthProperty, value);            }        }        public event MouseButtonEventHandler SlotMouseButtonDown;		public event DragDropHandler WaferTransferStarted;		static Slot()		{			ViewTypeProperty = DependencyProperty.Register("ViewType", typeof(string), typeof(Slot), new UIPropertyMetadata("Front"));			WaferStatusProperty = DependencyProperty.Register("WaferStatus", typeof(int), typeof(Slot), new UIPropertyMetadata(0, WaferStatusChangedCallBack));			SlotIDProperty = DependencyProperty.Register("SlotID", typeof(int), typeof(Slot), new UIPropertyMetadata(-1));			ModuleIDProperty = DependencyProperty.Register("ModuleID", typeof(string), typeof(Slot), new UIPropertyMetadata(string.Empty));			IsDragSourceProperty = DependencyProperty.Register("IsDragSource", typeof(bool), typeof(Slot), new UIPropertyMetadata(false, IsDragSourcePropertyChangedCallBack));			IsDropTargetProperty = DependencyProperty.Register("IsDropTarget", typeof(bool), typeof(Slot), new UIPropertyMetadata(false, IsDropTargetPropertyChangedCallBack));			IsDragEnterProperty = DependencyProperty.Register("IsDragEnter", typeof(bool), typeof(Slot), new UIPropertyMetadata(false, IsDragEnterPropertyChangedCallBack));			IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(Slot), new UIPropertyMetadata(false, IsSelectedPropertyChangedCallBack));			HasWaferProperty = DependencyProperty.Register("HasWafer", typeof(bool), typeof(Slot), new UIPropertyMetadata(false, HasWaferChanged));			BorderStatusProperty = DependencyProperty.Register("BorderStatus", typeof(SlotBorderStatus), typeof(Slot), new UIPropertyMetadata(SlotBorderStatus.None));			SourceNameProperty = DependencyProperty.Register("SourceName", typeof(string), typeof(Slot), new UIPropertyMetadata(string.Empty));			CanDragDropProperty = DependencyProperty.Register("CanDragDrop", typeof(bool), typeof(Slot), new UIPropertyMetadata(true, CanDragDropPropertyChangedCallBack));			WaferTooltipProperty = DependencyProperty.Register("WaferTooltip", typeof(string), typeof(Slot), new PropertyMetadata(string.Empty));			WaferTooltipExtProperty = DependencyProperty.Register("WaferTooltipExt", typeof(string), typeof(Slot), new PropertyMetadata(string.Empty));			SeasoningWaferTypeProperty = DependencyProperty.Register("SeasoningWaferType", typeof(string), typeof(Slot), new PropertyMetadata(string.Empty));			DuplicatedVisibilityProperty = DependencyProperty.Register("DuplicatedVisibility", typeof(Visibility), typeof(Slot), new UIPropertyMetadata(Visibility.Collapsed));            SlotWidthProperty = DependencyProperty.Register("SlotWidth", typeof(int), typeof(Slot), new UIPropertyMetadata(90));            FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(Slot), new FrameworkPropertyMetadata(typeof(Slot)));		}		public override void OnApplyTemplate()		{			base.OnApplyTemplate();			DragDropStatusControl(this);		}		protected override void OnDragEnter(DragEventArgs e)		{			base.OnDragEnter(e);			IsDragEnter = true;		}		protected override void OnDragLeave(DragEventArgs e)		{			base.OnDragLeave(e);			IsDragEnter = false;		}		protected override void OnMouseDown(MouseButtonEventArgs e)		{			base.OnMouseDown(e);			if (MouseButtonState.Pressed == e.LeftButton)			{				IsLeftMouseDown = true;			}			e.Handled = true;		}		protected override void OnMouseUp(MouseButtonEventArgs e)		{			base.OnMouseUp(e);			IsLeftMouseDown = false;			this.SlotMouseButtonDown?.Invoke(this, e);		}		protected override void OnMouseEnter(MouseEventArgs e)		{			base.OnMouseEnter(e);			BorderStatus |= SlotBorderStatus.MouseOver;		}		protected override void OnMouseLeave(MouseEventArgs e)		{			base.OnMouseLeave(e);			IsLeftMouseDown = false;			BorderStatus &= ~SlotBorderStatus.MouseOver;		}		private static void DragDropStatusControl(Slot p_slot)		{			p_slot.AllowDrop = false;			p_slot.IsDraggable = false;			if (p_slot.CanDragDrop)			{				if (!p_slot.IsDropTarget && p_slot.WaferStatus == 0)				{					p_slot.AllowDrop = true;				}				if (!p_slot.IsDragSource && p_slot.WaferStatus != 0)				{					p_slot.IsDraggable = true;				}			}		}		private static void IsDropTargetPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs args)		{			Slot slot = d as Slot;			if (slot.IsDropTarget)			{				slot.BorderStatus |= SlotBorderStatus.TransferTarget;			}			else			{				slot.BorderStatus &= ~SlotBorderStatus.TransferTarget;			}			DragDropStatusControl(slot);		}		private static void IsDragSourcePropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs args)		{			Slot slot = d as Slot;			if (slot.IsDragSource)			{				slot.BorderStatus |= SlotBorderStatus.TransferSource;			}			else			{				slot.BorderStatus &= ~SlotBorderStatus.TransferSource;			}			DragDropStatusControl(slot);		}		private static void IsSelectedPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs args)		{			Slot slot = d as Slot;			if (slot.IsSelected)			{				slot.BorderStatus |= SlotBorderStatus.Selected;			}			else			{				slot.BorderStatus &= ~SlotBorderStatus.Selected;			}		}		private static void CanDragDropPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs args)		{			Slot p_slot = d as Slot;			DragDropStatusControl(p_slot);		}		private static void IsDragEnterPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs args)		{			Slot slot = d as Slot;			if (slot.IsDragEnter)			{				slot.BorderStatus |= SlotBorderStatus.TransferTarget;			}			else			{				slot.BorderStatus &= ~SlotBorderStatus.TransferTarget;			}		}		private static void WaferStatusChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs args)		{			Slot slot = d as Slot;			slot.IsDragSource = false;			slot.IsDropTarget = false;			slot.IsDragEnter = false;			DragDropStatusControl(slot);		}		public static void HasWaferChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)		{			Slot slot = d as Slot;			if (slot != null)			{				if (slot.HasWafer)				{					slot.WaferStatus = 7;				}				else				{					slot.WaferStatus = 0;				}			}		}		protected override void OnPreviewMouseMove(MouseEventArgs e)		{			base.OnPreviewMouseMove(e);			if (e.LeftButton == MouseButtonState.Pressed && IsDraggable && IsLeftMouseDown)			{				DataObject data = new DataObject(typeof(Slot), this);				DragDrop.DoDragDrop(this, data, DragDropEffects.Move);			}		}		protected override void OnDrop(DragEventArgs e)		{			if (base.AllowDrop)			{				try				{					IDataObject data = e.Data;					if (data.GetDataPresent(typeof(Slot)))					{						Slot slot = (Slot)data.GetData(typeof(Slot));						slot.IsDragSource = true;						IsDropTarget = true;						if (this.WaferTransferStarted != null)						{							DragDropEventArgs e2 = new DragDropEventArgs(slot, this);							this.WaferTransferStarted(this, e2);						}					}					else					{						string moduleID = e.Data.GetData("Station").ToString();						int slotID = (int)e.Data.GetData("Slot");						Slot p_TranferFrom = new Slot						{							ModuleID = moduleID,							SlotID = slotID						};						if (this.WaferTransferStarted != null)						{							DragDropEventArgs e3 = new DragDropEventArgs(p_TranferFrom, this);							this.WaferTransferStarted(this, e3);						}					}				}				catch				{				}			}		}		public bool IsValidSlot()		{			if (ModuleID.Length > 0 && SlotID >= 0)			{				return true;			}			return false;		}		public bool IsSameSlot(Slot slot)		{			if (slot.IsValidSlot() && IsValidSlot() && ModuleID == slot.ModuleID && SlotID == slot.SlotID)			{				return true;			}			return false;		}		public void ClearDragDropStatus()		{			IsDragEnter = false;			IsDragSource = false;			IsDropTarget = false;		}	}}
 |