예제 #1
0
        static public bool MoveNext(this iBoard b, ref MoveType lastMove)
        {
            while (lastMove < MoveType.Stop)
            {
                lastMove = lastMove + 1;
                switch (lastMove)
                {
                case MoveType.Left:
                case MoveType.Up:
                case MoveType.Right:
                case MoveType.Down:
                    if (b.Move(lastMove))
                    {
                        return(true);
                    }
                    break;
                }
            }

            if (b.Steps.Any())
            {
                UndoStep last = b.PeekStep();
                lastMove = last._type;
                b.UndoMove();
                return(b.MoveNext(ref lastMove));
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Goes back to the previously selected asset
        /// </summary>
        private void UndoSelection()
        {
            _undoSteps.Pop();
            UndoStep undoStep = _undoSteps.Peek();

            ChangeSelection(undoStep.Id, undoStep.Type, false);
        }
예제 #3
0
        static public void UndoMove(this iBoard b)
        {
            if (!b.Steps.Any())
            {
                return;
            }

            UndoStep step = b.PopStep();
            int      dx = 0, dy = 0;

            step._type.Move(ref dx, ref dy);
            int bx = b.BuddyX, by = b.BuddyY;

            Debug.Assert(Is(b[bx, by], CellType.Buddy));
            b[bx, by] &= ~CellType.Buddy;
            Debug.Assert(IsEmpty(b[bx - dx, by - dy]));
            b[bx - dx, by - dy] |= CellType.Buddy;
            if (step._boxMoved)
            {
                int obx = bx + dx, oby = by + dy;
                Debug.Assert(Is(b[obx, oby], CellType.Box));
                b[obx, oby] &= ~CellType.Box;
                b[bx, by]   |= CellType.Box;
            }
            b.BuddyX -= dx;
            b.BuddyY -= dy;
        }
예제 #4
0
 /// <summary>
 /// 登记追加多个元素动作
 /// </summary>
 /// <param name="myList">追加的元素列表</param>
 public void LogAddRang(System.Collections.ArrayList myList)
 {
     if (CanLog)
     {
         UndoStep NewStep = new UndoStep();
         NewStep.Elements = myList;
         NewStep.Style    = 5;
         myUndoSteps.Add(NewStep);
     }
 }
예제 #5
0
 /// <summary>
 /// 登记追加元素动作
 /// </summary>
 /// <param name="NewElement">追加的元素</param>
 public void LogAdd(ZYTextElement NewElement)
 {
     if (CanLog)
     {
         UndoStep NewStep = new UndoStep();
         NewStep.Style   = 2;
         NewStep.Element = NewElement;
         myUndoSteps.Add(NewStep);
     }
 }
예제 #6
0
 /// <summary>
 /// 登记新增多个元素动作
 /// </summary>
 /// <param name="index">第一个新增元素在元素列表中的序号</param>
 /// <param name="myList">新增的元素集合</param>
 public void LogInsertRange(int index, System.Collections.ArrayList myList)
 {
     if (CanLog)
     {
         UndoStep NewStep = new UndoStep();
         NewStep.index    = index;
         NewStep.Elements = myList;
         NewStep.Style    = 1;
         myUndoSteps.Add(NewStep);
     }
 }
예제 #7
0
 /// <summary>
 /// 登记新增元素动作
 /// </summary>
 /// <param name="index">新增元素在元素列表中的序号</param>
 /// <param name="NewElement">新增的元素</param>
 public void LogInsert(int index, ZYTextElement NewElement)
 {
     if (CanLog)
     {
         UndoStep NewStep = new UndoStep();
         NewStep.index   = index;
         NewStep.Element = NewElement;
         NewStep.Style   = 0;
         myUndoSteps.Add(NewStep);
     }
 }
예제 #8
0
 /// <summary>
 /// 登记删除元素动作
 /// </summary>
 /// <param name="index">元素在元素列表中的序号</param>
 /// <param name="myElement">要删除的元素</param>
 public void LogRemove(int index, ZYTextElement myElement)
 {
     if (CanLog)
     {
         UndoStep NewStep = new UndoStep();
         NewStep.Style   = 3;
         NewStep.index   = index;
         NewStep.Element = myElement;
         myUndoSteps.Add(NewStep);
     }
 }
예제 #9
0
 public void LogRemoveRange(int index, System.Collections.ArrayList myList)
 {
     if (CanLog)
     {
         UndoStep NewStep = new UndoStep();
         NewStep.Elements = new System.Collections.ArrayList();
         NewStep.Elements.AddRange(myList);
         NewStep.index = index;
         NewStep.Style = 6;
         myUndoSteps.Add(NewStep);
     }
 }
예제 #10
0
 /// <summary>
 /// 添加修改对象属性的记录
 /// </summary>
 /// <param name="vElement">该属性所属的元素</param>
 /// <param name="vAttribute">属性对象</param>
 /// <param name="NewValue">将要设置的新的属性值</param>
 public void LogAttribute(ZYTextElement vElement, ZYAttribute vAttribute, object NewValue)
 {
     if (CanLog)
     {
         UndoStep NewStep = new UndoStep();
         NewStep.Element   = vElement;
         NewStep.Attribute = vAttribute;
         NewStep.OldValue  = vAttribute.Value;
         NewStep.NewValue  = NewValue;
         NewStep.Style     = 4;
         myUndoSteps.Add(NewStep);
     }
 }
예제 #11
0
        public static void HandleException(Exception exception, string name, UndoStep undoStep = null)
        {
            Decider decider = new Decider();

            string message;

            if (undoStep == null)
            {
                message = "Es ist ein Fehler beim Erzeugen aufgetreten:";
            }
            else
            {
                message = "Es ist ein Fehler beim Erzeugen aufgetreten. Soll die Aktion rückgängig gemacht werden?";
            }

            string        errorText;
            StringBuilder sb = new StringBuilder();

            switch (exception)
            {
            case LockingException e:
                string[] failedLockingObjects = e.GetAllFailed2LockAsString();
                foreach (var id in failedLockingObjects)
                {
                    var storableObject = StorableObject.FromStringIdentifier(id);
                    sb.AppendLine(storableObject.GetType().ToString());
                }

                errorText = $"{message}{Environment.NewLine}{exception.Message}{Environment.NewLine}{Environment.NewLine}{sb}{Environment.NewLine}";
                break;

            default:
                errorText = $"{message}{Environment.NewLine}{exception.Message}{Environment.NewLine}{Environment.NewLine}";
                break;
            }

            // Log
            BaseException bexError = new BaseException($"{name}: {errorText}{Environment.NewLine}{exception}", MessageLevel.Error);

            bexError.FixMessage();

            // Show
            EnumDecisionReturn decision;

            if (undoStep != null)
            {
                decision = decider.Decide(EnumDecisionType.eYesNoDecision, errorText,
                                          name, EnumDecisionReturn.eYES,
                                          EnumDecisionReturn.eYES, name, false, EnumDecisionIcon.eFATALERROR);
            }
            else
            {
                decision = decider.Decide(EnumDecisionType.eOkDecision, errorText,
                                          name, EnumDecisionReturn.eOK,
                                          EnumDecisionReturn.eOK, name, false, EnumDecisionIcon.eFATALERROR);
            }
            switch (decision)
            {
            case EnumDecisionReturn.eYES:
                undoStep?.DoUndo();
                break;
            }
        }
예제 #12
0
 public void PushStep(UndoStep step)
 {
     _undoStack.Push(step);
 }
예제 #13
0
 private void UndoPush(UndoStep.Field field, int value, int index)
 {
     Undos[UndoTop].field = field;
     Undos[UndoTop].index = index;
     Undos[UndoTop].value = value;
     UndoTop++;
 }
예제 #14
0
 public void PushStep(UndoStep step)
 {
     _undoStack.Push(step);
 }
예제 #15
0
 public void PushStep(UndoStep step)
 {
     _undoStack.Push(step); NotifyPropertyChanged("Moves");
 }
예제 #16
0
 public void PushStep(UndoStep step)
 {
     _undoStack.Push(step); NotifyPropertyChanged("Moves");
 }
예제 #17
0
        /// <summary>
        /// 已重载:执行撤销操作
        /// </summary>
        /// <returns></returns>
        public override bool Undo()
        {
            ZYTextElement NewStart           = null;
            int           NewIndex           = -1;
            bool          bolRefreshElements = false;

            if (myUndoSteps.Count > 0)
            {
                for (int iCount = myUndoSteps.Count - 1; iCount >= 0; iCount--)
                {
                    UndoStep myStep = (UndoStep)myUndoSteps[iCount];

                    switch (myStep.Style)
                    {
                    case 0:
                        Container          = myStep.Element.Parent;
                        bolRefreshElements = true;
                        NewIndex           = myStep.Element.Index;
                        Container.ChildElements.Remove(myStep.Element);
                        break;

                    case 1:
                        bolRefreshElements = true;
                        foreach (ZYTextElement e in myStep.Elements)
                        {
                            Container = e.Parent;
                            NewIndex  = e.Index;
                            Container.ChildElements.Remove(e);
                        }
                        break;

                    case 2:
                        Container          = myStep.Element.Parent;
                        bolRefreshElements = true;
                        NewIndex           = myStep.Element.Index;
                        Container.ChildElements.Remove(myStep.Element);
                        break;

                    case 3:
                        Container          = myStep.Element.Parent;
                        bolRefreshElements = true;
                        //先从此处控制,索引小于0的不进行操作edit by ywk 2013年3月11日17:31:02
                        if (myStep.index >= 0)
                        {
                            Container.ChildElements.Insert(myStep.index, myStep.Element);
                            NewStart = myStep.Element;
                        }
                        //Container.ChildElements.Insert(myStep.index, myStep.Element);
                        //NewStart = myStep.Element;
                        break;

                    case 4:

                        myStep.Attribute.SetValue(myStep.OldValue);
                        myStep.Element.UpdateAttrubute();
                        myStep.Element.RefreshSize();
                        NewStart = myStep.Element;
                        break;

                    case 5:

                        bolRefreshElements = true;
                        foreach (ZYTextElement e in myStep.Elements)
                        {
                            Container = e.Parent;
                            NewIndex  = e.Index;
                            Container.ChildElements.Remove(e);
                        }
                        break;

                    case 6:
                        Container          = (myStep.Elements[0] as ZYTextElement).Parent;
                        bolRefreshElements = true;
                        //索引需大于等于0才进入  add by ywk 2013年4月2日16:16:48
                        if (myStep.index >= 0)
                        {
                            Container.ChildElements.InsertRange(myStep.index, myStep.Elements);
                            NewIndex = myStep.index;
                        }
                        break;
                    }
                }
                if (bolRefreshElements)
                {
                    myOwnerDocument.RefreshElements();
                }
                myOwnerDocument.RefreshLine();
                myOwnerDocument.UpdateView();

                #region  以前是被注释的,现在放出来
                myOwnerDocument.Content.SelectLength = 0;
                if (NewStart != null)
                {
                    myOwnerDocument.Content.CurrentElement = NewStart;
                }
                else if (NewIndex >= 0)
                {
                    myOwnerDocument.Content.MoveSelectStart(NewIndex);
                }
                #endregion



                return(true);
            }
            return(false);
        }
예제 #18
0
 public UndoStep PopStep()
 {
     UndoStep step = _undoStack.Pop(); NotifyPropertyChanged("Moves"); return(step);
 }