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());
}
}