private ListBoxItem createListItem(MillingWorkspaceItem workItem)
        {
            var item = new ListBoxItem();

            item.Content = workItem.Name;
            item.Tag     = workItem;

            var shapeItem = workItem as MillingShapeItem2D;

            if (shapeItem != null)
            {
                var menu = new ContextMenu();

                var copyItem = new MenuItem();
                copyItem.Header = "Copy";
                copyItem.Click += (e, s) =>
                {
                    Workspace.Children.Add(shapeItem.Clone(Workspace.UnusedVersion(shapeItem.Name)));
                };
                menu.Items.Add(copyItem);

                var deleteItem = new MenuItem();
                deleteItem.Header = "Delete";
                deleteItem.Click += (e, s) =>
                {
                    Workspace.Children.Remove(shapeItem);
                };
                menu.Items.Add(deleteItem);

                item.ContextMenu = menu;
            }
            return(item);
        }
        private void onItemClicked(MillingWorkspaceItem item)
        {
            if (!_addJoinsEnabled || !(item is MillingItem))
            {
                //nothing to do
                return;
            }

            if (_joinItemCandidate != null)
            {
                _joinItemCandidate.IsHighlighted = false;
            }

            if (item == _joinItemCandidate)
            {
                //selection was discarded
                _joinItemCandidate = null;
                return;
            }

            var pointProvider = item as MillingItem;

            pointProvider.IsHighlighted = true;
            if (_joinItemCandidate == null || pointProvider is EntryPoint)
            {
                //first item is set (entry point has to be first)
                _joinItemCandidate = pointProvider;
                return;
            }

            Workspace.SetJoin(_joinItemCandidate, pointProvider);
            _joinItemCandidate = pointProvider;
        }