public override void Abort()
        {
            if (IsDragging)
            {
                IsDragging = false;
                if (_ghostAdorner != null)
                {
                    RemoveAdorner(_ghostAdorner);
                    _ghostAdorner = null;
                }

                _atomList = null;
            }

            if (EditViewModel.SelectedItems.Any())
            {
                EditViewModel.ClearSelection();
                CurrentStatus = DefaultText;
            }

            if (_lassoAdorner != null)
            {
                DisposeLasso();
            }

            _initialTarget = null;
            _mouseTrack    = null;

            CurrentEditor.ReleaseMouseCapture();
            CurrentStatus = DefaultText;
        }
        private void CurrentEditor_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            var    pos = Mouse.GetPosition(CurrentEditor);
            Vector shift; //how much we want to shift the objects by

            if (MouseIsDown(e) & !IsDragging)
            {
                CurrentStatus = "Draw around atoms and bonds to select.";
                if (_initialTarget == null)
                {
                    if (_mouseTrack == null)
                    {
                        _mouseTrack = new PointCollection();
                    }

                    StreamGeometry outline = null;
                    if (!RectMode)
                    {
                        //just add the most recent point to the track
                        _mouseTrack.Add(pos);
                    }
                    else
                    {
                        //build a rectangle
                        _mouseTrack.Clear();
                        _mouseTrack.Add(StartPoint);
                        _mouseTrack.Add(new Point(pos.X, StartPoint.Y));
                        _mouseTrack.Add(new Point(pos.X, pos.Y));
                        _mouseTrack.Add(new Point(StartPoint.X, pos.Y));
                    }

                    outline = GetPolyGeometry();

                    if (_lassoAdorner == null)
                    {
                        _lassoAdorner = new LassoAdorner(CurrentEditor, outline);
                    }

                    if (Mouse.Captured != CurrentEditor)
                    {
                        Mouse.Capture(CurrentEditor);
                    }

                    _lassoAdorner.Outline = outline;
                }
                else
                {
                    var target = CurrentObject(e);

                    if (_initialTarget != target)
                    {
                        IsDragging = true;
                    }
                }
            }
            //we're dragging an object around
            if (MouseIsDown(e) & IsDragging)
            {
                if (_initialTarget is Bond b &&
                    EditViewModel.SelectionType == SelectionTypeCode.Bond &&
                    EditViewModel.SelectedItems.Count == 1)    //i.e. we have one bond selected
                {
                    CurrentStatus = "Drag bond to reposition.";
                    _atomList     = new List <Atom> {
                        b.StartAtom, b.EndAtom
                    };
                    shift = pos - StartPoint;
                    var tt = new TranslateTransform(shift.X, shift.Y);
                    _shift = new TransformGroup();
                    _shift.Children.Add(tt);
                }
                else //we're dragging an atom
                {
                    RemoveGhost();
                    DragAtom(pos);
                }

                RemoveGhost();
                _ghostAdorner = new PartialGhostAdorner(EditViewModel, _atomList, _shift);
            }
        private void CurrentEditor_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            dynamic currentObject = CurrentObject(e);

            if (IsDragging)
            {
                if (_atomList != null && _atomList.Any())
                {
                    EditViewModel.DoTransform(_shift, _atomList);
                    _atomList[0].Parent.UpdateVisual();
                }

                IsDragging = false;
                if (_ghostAdorner != null)
                {
                    RemoveAdorner(_ghostAdorner);
                    _ghostAdorner = null;
                }

                _atomList = null;
            }
            else
            {
                //did we go up on the target we went down on?
                if ((currentObject != null) & (currentObject == _initialTarget))
                {
                    //select it
                    DoSelectionClick(e);
                }
                else if (_initialTarget != null && EditViewModel.SelectedItems.Contains(_initialTarget))
                {
                    DoSelectionClick(e);
                }

                if (_lassoAdorner != null)
                {
                    _lassoHits = new List <object>();
                    GatherSelection(_lassoAdorner.Outline);
                    _lassoHits = _lassoHits.Distinct().ToList();
                    EditViewModel.AddToSelection(_lassoHits);
                }
                if (EditViewModel.SelectedItems.Any())
                {
                    CurrentStatus = ActiveSelText;
                }

                if (_lassoAdorner != null)
                {
                    DisposeLasso();
                }
            }

            _initialTarget = null;
            _mouseTrack    = null;

            CurrentEditor.ReleaseMouseCapture();

            CurrentEditor.Focus();
            var al = AdornerLayer.GetAdornerLayer(CurrentEditor);

            al.Update();
            CurrentStatus = DefaultText;
        }