Changeset 2621


Ignore:
Timestamp:
Feb 8, 2011, 1:27:24 PM (11 years ago)
Author:
kopal
Message:
  • added undo/redo for moving operations
  • corrected a typo in the XMLSerialization
Location:
trunk/CrypPlugins/WorkspaceManager
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/WorkspaceManager/Model/Tools/UndoRedoManager.cs

    r2616 r2621  
    88using System.Windows.Controls;
    99using System.Windows.Input;
    10 using System.Drawing;
     10using System.Windows;
    1111
    1212namespace WorkspaceManager.Model.Tools
     
    4343            if (UndoStack.Count > 0)
    4444            {
     45                object lastModelElement = null;
    4546                Operation op = UndoStack.Pop();
     47                lastModelElement = op.Element;
    4648                op.Undo();
    4749                RedoStack.Push(op);
    4850
    49                 if (UndoStack.Count > 0 && !UndoStack.First().SingleOperation)
     51                if (UndoStack.Count > 0 && (!UndoStack.First().SingleOperation ||
     52                    (UndoStack.First() is MoveModelElementOperation &&
     53                    UndoStack.First().Element == lastModelElement)))
    5054                {
    5155                    do
    5256                    {
     57                        lastModelElement = op.Element;
    5358                        op = UndoStack.Pop();
    5459                        op.Undo();
    5560                        RedoStack.Push(op);
    56                     } while (UndoStack.Count > 0 && !UndoStack.First().SingleOperation);
     61                    } while (UndoStack.Count > 0 && (!UndoStack.First().SingleOperation || (UndoStack.First() is MoveModelElementOperation &&
     62                    UndoStack.First().Element == lastModelElement)));
    5763                }
    5864            }
     
    6773            Working = true;
    6874            if (RedoStack.Count > 0)
    69             {
     75            {               
    7076                Operation op = null;
     77                object lastModelElement = null;
    7178                do
    7279                {
    73                     op = RedoStack.Pop();
     80                    op = RedoStack.Pop();                   
     81                    lastModelElement = op.Element;
    7482                    op.Redo();
    75                     UndoStack.Push(op);                   
    76                 } while (RedoStack.Count > 0 && !op.SingleOperation);
     83                    UndoStack.Push(op);
     84                } while (RedoStack.Count > 0 && (!op.SingleOperation || (RedoStack.First() is MoveModelElementOperation &&
     85                    RedoStack.First().Element == lastModelElement)));
    7786
    7887            }
     
    111120    public interface Operation
    112121    {
     122        object Element{get;}
    113123        void Undo();
    114124        void Redo();
     
    126136
    127137        #region Operation Members
     138
     139        public object Element { get { return this.model; } }
    128140
    129141        public void Undo()
     
    250262        #region Operation Members
    251263
     264        public object Element { get { return this.model; } }
     265
    252266        public void Undo()
    253267        {
     
    361375        #endregion
    362376    }
     377
     378    public class MoveModelElementOperation : Operation
     379    {
     380
     381        VisualElementModel model = null;
     382
     383        public MoveModelElementOperation(VisualElementModel model)
     384        {
     385            this.model = model;
     386        }
     387
     388        #region Operation Members
     389
     390        public object Element { get { return this.model; } }
     391
     392        public void Undo()
     393        {
     394            if (model is PluginModel)
     395            {
     396                PluginModel pluginModel = (PluginModel)model;               
     397                if (pluginModel.UpdateableView is PluginContainerView)
     398                {
     399                    PluginContainerView pluginContainerView = (PluginContainerView)pluginModel.UpdateableView;
     400                    pluginContainerView.SetPosition(this.OldPosition);
     401                }               
     402            }
     403            else if (model is ConnectorModel)
     404            {
     405               
     406            }
     407            else if (model is ConnectionModel)
     408            {
     409               
     410            }
     411            else if (model is TextModel)
     412            {
     413               
     414            }
     415            else if (model is ImageModel)
     416            {
     417               
     418            }
     419            else
     420            {
     421                throw new NotImplementedException("Can not undo DeleteModelElement: " + model.GetType().Name);
     422            }
     423        }
     424
     425        public void Redo()
     426        {
     427            if (model is PluginModel)
     428            {
     429                PluginModel pluginModel = (PluginModel)model;
     430                if (pluginModel.UpdateableView is PluginContainerView)
     431                {
     432                    PluginContainerView pluginContainerView = (PluginContainerView)pluginModel.UpdateableView;
     433                    pluginContainerView.SetPosition(this.NewPosition);
     434                }       
     435            }
     436            else if (model is ConnectorModel)
     437            {
     438
     439            }
     440            else if (model is ConnectionModel)
     441            {
     442
     443            }
     444            else if (model is TextModel)
     445            {
     446
     447            }
     448            else if (model is ImageModel)
     449            {
     450
     451            }
     452            else
     453            {
     454                throw new NotImplementedException("Can not redo DeleteModelElement: " + model.GetType().Name);
     455            }
     456        }
     457
     458        public bool SingleOperation
     459        {
     460            get;
     461            set;
     462        }
     463
     464        public Point OldPosition
     465        {
     466            get;
     467            set;
     468        }
     469
     470        public Point NewPosition
     471        {
     472            get;
     473            set;
     474        }
     475
     476        #endregion
     477    }
    363478}
  • trunk/CrypPlugins/WorkspaceManager/Model/Tools/XMLSerialization.cs

    r2616 r2621  
    638638                        if(workspaceManager != null)
    639639                        {
    640                             workspaceManager.GuiLogMessage("Cold not deserialize model element \"" + membername.InnerText + "\" of type \"" + membertype.InnerText + "\" because of:" + ex.Message,NotificationLevel.Warning);
     640                            workspaceManager.GuiLogMessage("Could not deserialize model element \"" + membername.InnerText + "\" of type \"" + membertype.InnerText + "\" because of:" + ex.Message,NotificationLevel.Warning);
    641641                        }else
    642642                        {
    643                             Console.WriteLine("Cold not deserialize model element \"" + membername.InnerText + "\" of type \"" + membertype.InnerText + "\" because of:" + ex.Message);
     643                            Console.WriteLine("Could not deserialize model element \"" + membername.InnerText + "\" of type \"" + membertype.InnerText + "\" because of:" + ex.Message);
    644644                        }
    645645                    }
     
    680680                    if (workspaceManager != null)
    681681                    {
    682                         workspaceManager.GuiLogMessage("Cold not restore reference beteen model element \"" + membername + "\" and its reference with id \"" + reference + "\" because of:" + ex.Message, NotificationLevel.Warning);
     682                        workspaceManager.GuiLogMessage("Could not restore reference beteen model element \"" + membername + "\" and its reference with id \"" + reference + "\" because of:" + ex.Message, NotificationLevel.Warning);
    683683                    }
    684684                    else
    685685                    {
    686                         Console.WriteLine("Cold not restore reference beteen model element \"" + membername + "\" and its reference with id \"" + reference + "\" because of:" + ex.Message);
     686                        Console.WriteLine("Could not restore reference beteen model element \"" + membername + "\" and its reference with id \"" + reference + "\" because of:" + ex.Message);
    687687                    }
    688688                }
  • trunk/CrypPlugins/WorkspaceManager/View/Container/PluginContainerView.xaml.cs

    r2601 r2621  
    2525using Cryptool.PluginBase.Control;
    2626using System.Collections;
     27using WorkspaceManager.Model.Tools;
    2728namespace WorkspaceManager.View.Container
    2829{
     
    578579
    579580            Point p = GetPosition();
    580             Model.Position = p;
     581            if (Model.WorkspaceModel.UndoRedoManager != null &&
     582                !Model.WorkspaceModel.UndoRedoManager.Working
     583                && !Model.Position.Equals(p))
     584            {
     585                Model.WorkspaceModel.UndoRedoManager.DidOperation(
     586                    new MoveModelElementOperation(Model)
     587                    {
     588                        SingleOperation = true,
     589                        OldPosition = Model.Position,
     590                        NewPosition = p
     591                    });
     592            }
     593            Model.Position = p;           
    581594            PositionOnWorkSpaceX = p.X;
    582             PositionOnWorkSpaceY = p.Y;
     595            PositionOnWorkSpaceY = p.Y;           
    583596        }
    584597
  • trunk/CrypPlugins/WorkspaceManager/WorkspaceManager.cs

    r2617 r2621  
    6969            WorkspaceModel = new WorkspaceModel();
    7070            WorkspaceModel.WorkspaceManagerEditor = this;
     71            UndoRedoManager = new UndoRedoManager();
    7172            WorkspaceSpaceEditorView = new WorkSpaceEditorView(WorkspaceModel);
    72             HasChanges = false;
    73             UndoRedoManager = new UndoRedoManager();
     73            HasChanges = false;           
    7474        }
    7575
Note: See TracChangeset for help on using the changeset viewer.