예제 #1
0
        public virtual void OnDropCompleted(IDataObject obj, Point dropPoint)
        {
            var targetElement = TargetElement as FrameworkElement;

            if (targetElement == null)
            {
                return;
            }

            var targetListBox = targetElement.FindLogicalAncestorByType <ListBox>();

            if (targetListBox == null)
            {
                return;
            }

            var targetGroup = SystemAssaultScreen.GetAssaultGroup(targetListBox);

            if (targetGroup == AssaultGroup.Invalid || targetGroup == AssaultGroup.Destroyed)
            {
                return;
            }

            ICommand          dropCommand;
            List <CombatUnit> draggedUnits;

            if (!CanDrop(obj, out draggedUnits, out dropCommand))
            {
                return;
            }

            if (!draggedUnits.All(o => dropCommand.CanExecute(o)))
            {
                return;
            }

            draggedUnits.ForEach(o => dropCommand.Execute(o));
        }
예제 #2
0
        private bool CanDrop(IDataObject obj, out List <CombatUnit> draggedUnits, out ICommand dropCommand)
        {
            dropCommand  = null;
            draggedUnits = new List <CombatUnit>();

            var targetElement = TargetElement as FrameworkElement;

            if (targetElement == null)
            {
                return(false);
            }

            var targetListBox = targetElement.FindLogicalAncestorByType <ListBox>();

            if (targetListBox == null)
            {
                return(false);
            }

            var view = targetElement.FindLogicalAncestorByType <SystemAssaultScreen>();

            if (view == null || view.Model == null)
            {
                return(false);
            }

            var sourceElement = ExtractElement(obj) as DependencyObject;

            if (sourceElement == null)
            {
                return(false);
            }

            var assaultGroup = SystemAssaultScreen.GetAssaultGroup(targetListBox);

            var sourceListBox = sourceElement as ListBox;

            if (sourceListBox == null)
            {
                sourceListBox = sourceElement.FindLogicalAncestorByType <ListBox>();

                if (sourceListBox == null)
                {
                    return(false);
                }

                draggedUnits.AddRange(sourceListBox.SelectedItems.OfType <CombatUnit>().Where(o => !o.IsDestroyed));
            }
            else
            {
                var combatUnit = sourceElement.GetValue(FrameworkElement.DataContextProperty) as CombatUnit;
                if (combatUnit == null || combatUnit.IsDestroyed)
                {
                    return(false);
                }

                draggedUnits.Add(combatUnit);
            }

            if (draggedUnits.Count == 0)
            {
                return(false);
            }

            switch (assaultGroup)
            {
            case AssaultGroup.Invalid:
                goto default;

            case AssaultGroup.Standby:
                dropCommand = view.Model.StandbyOrderCommand;
                break;

            case AssaultGroup.Attack:
                dropCommand = view.Model.AttackOrderCommand;
                break;

            case AssaultGroup.LandTroops:
                dropCommand = view.Model.LandTroopsOrderCommand;
                return(!draggedUnits.Select(o => o.Source).OfType <Ship>().Any(o => o.ShipType != ShipType.Transport));

            case AssaultGroup.Destroyed:
                goto default;

            default:
                return(false);
            }

            return(true);
        }