KBS2.Controls.BlueprintPanel.SetEditMode C# (CSharp) Method

SetEditMode() public method

public SetEditMode ( bool editMode, bool restore = false ) : void
editMode bool
restore bool
return void
        public void SetEditMode(bool editMode, bool restore = false)
        {
            if(this._editMode == editMode) return;

            this._editMode = editMode;
            if(this._editMode) {
                this.BackColor = this.Renderer.ColorTable.BackgroundEdit;

                this.OriginalBlueprint = this.ActiveBlueprint;
                this.ActiveBlueprint = this.OriginalBlueprint.Clone();
            } else {
                this.BackColor = this.Renderer.ColorTable.BackgroundNormal;

                if(restore) this.ActiveBlueprint = this.OriginalBlueprint;
                this.OriginalBlueprint = null;

                this.HoveredRoom = null;
                this.HoveredCorner = null;
                this.HoveredWall = null;
                this.SelectedRoom = null;
                this.SelectedCorner = null;
                this.SelectedWall = null;
                this._currentRoom = null;
            }

            List<Corner> ac = new List<Corner>((IEnumerable<Corner>)WallHandler.GetInstance().GetAllWallCorners());
            List<Wall> aw = new List<Wall>((IEnumerable<Wall>)WallHandler.GetInstance().GetAllWalls());
            List<Room> ar = new List<Room>((IEnumerable<Room>)RoomHandler.GetInstance().GetAllRooms());

            //This first loop saves all corners...
            foreach(Room room in this.ActiveBlueprint.Rooms) {
                foreach(Corner corner in room.GetCorners()) {
                    corner.SaveChanges = !editMode;
                    if(!restore && !editMode) {
                        Corner orig = WallHandler.GetInstance().GetWallCornerByID(corner.GetID());
                        ac.Remove(orig);
                        if(orig != null) {
                            WallHandler.GetInstance().ReplaceWallCorner(orig, corner);
                        } else {
                            WallHandler.GetInstance().GetAllWallCorners().Add(corner);
                        }
                        if(corner.IsChanged) corner.OnChange(EventArgs.Empty);
                    }
                }
            }
            //This second loop is required because of foreign key constraints in the DB...
            //All corners need to exist before the walls can be saved.
            foreach(Room room in this.ActiveBlueprint.Rooms) {
                foreach(Corner corner in room.GetCorners()) {
                    foreach(Wall wall in corner.GetWalls()) {
                        wall.SaveChanges = !editMode;
                        if(!restore && !editMode) {
                            Wall orig = WallHandler.GetInstance().GetWallBy((w) => w.GetID() == wall.GetID());
                            aw.Remove(orig);
                            if(orig != null) {
                                WallHandler.GetInstance().ReplaceWall(orig, wall);
                            } else {
                                WallHandler.GetInstance().GetAllWalls().Add(wall);
                            }
                            if(wall.IsChanged) wall.OnChange(EventArgs.Empty);
                        }
                    }
                }
            }
            //This third loop is required because of foreign key constraints in the DB...
            //All walls need to exist before the rooms can be saved.
            foreach(Room room in this.ActiveBlueprint.Rooms) {
                room.SaveChanges = !editMode;
                if(!restore && !editMode) {
                    Room orig = RoomHandler.GetInstance().GetRoomBy((r) => r.GetID() == room.GetID());
                    ar.Remove(orig);
                    if(orig != null) {
                        RoomHandler.GetInstance().ReplaceRoom(orig, room);
                    } else {
                        RoomHandler.GetInstance().GetAllRooms().Add(room);
                    }
                    if(room.IsChanged) room.OnChange(EventArgs.Empty);
                }
            }

            //Remove removed rooms
            if(!restore && !editMode) {
                List<Room> removeR = new List<Room>();
                List<Wall> removeW = new List<Wall>();
                List<Corner> removeC = new List<Corner>();
                foreach(Room room in ar) {
                    if(room.GetFloorID() == DocumentHandler.GetInstance().CurrentFloor.GetID()) removeR.Add(room);
                }
                foreach(Wall wall in aw) {
                    foreach(Room room in RoomHandler.GetInstance().GetAllRooms()) {
                        if(room.GetFloorID() == DocumentHandler.GetInstance().CurrentFloor.GetID()
                            && (room.GetCorners().Contains(wall.Left) || room.GetCorners().Contains(wall.Right))
                            && !removeW.Contains(wall)) removeW.Add(wall);
                    }
                }
                foreach(Corner corner in ac) {
                    foreach(Room room in RoomHandler.GetInstance().GetAllRooms()) {
                        if(room.GetFloorID() == DocumentHandler.GetInstance().CurrentFloor.GetID()
                            && room.GetCorners().Contains(corner)
                            && !removeC.Contains(corner)) removeC.Add(corner);
                    }
                }
                ((ExtendedObservableCollection<Room>)RoomHandler.GetInstance().GetAllRooms()).RemoveRange(removeR.ToArray());
                ((ExtendedObservableCollection<Wall>)WallHandler.GetInstance().GetAllWalls()).RemoveRange(removeW.ToArray());
                ((ExtendedObservableCollection<Corner>)WallHandler.GetInstance().GetAllWallCorners()).RemoveRange(removeC.ToArray());
            }
        }