diff --git a/Source/Core/Editing/CopyPasteManager.cs b/Source/Core/Editing/CopyPasteManager.cs index 703e5c39e929bf2d15234dc6f43ff4b3abb90539..60c91f70500684ed8f7dfc345a27bdd64cff7097 100644 --- a/Source/Core/Editing/CopyPasteManager.cs +++ b/Source/Core/Editing/CopyPasteManager.cs @@ -27,6 +27,7 @@ using CodeImp.DoomBuilder.Geometry; using CodeImp.DoomBuilder.GZBuilder.Data; using CodeImp.DoomBuilder.IO; using CodeImp.DoomBuilder.Map; +using CodeImp.DoomBuilder.Types; using CodeImp.DoomBuilder.Windows; #endregion @@ -38,6 +39,7 @@ namespace CodeImp.DoomBuilder.Editing #region ================== Constants private const string CLIPBOARD_DATA_FORMAT = "GZDOOM_BUILDER_GEOMETRY"; + private const string CLIPBOARD_DATA_FORMAT_DB2 = "DOOM_BUILDER_GEOMETRY"; #endregion @@ -287,8 +289,11 @@ namespace CodeImp.DoomBuilder.Editing // Check if possible to copy/paste if(General.Editing.Mode.Attributes.AllowCopyPaste) { + bool havepastedata = Clipboard.ContainsData(CLIPBOARD_DATA_FORMAT); //mxd + bool havedb2pastedata = Clipboard.ContainsData(CLIPBOARD_DATA_FORMAT_DB2); //mxd + // Anything to paste? - if(Clipboard.ContainsData(CLIPBOARD_DATA_FORMAT)) + if(havepastedata || havedb2pastedata) { // Cancel volatile mode General.Editing.DisengageVolatileMode(); @@ -307,22 +312,42 @@ namespace CodeImp.DoomBuilder.Editing General.Map.Map.ClearAllMarks(true); // Read from clipboard - using(Stream memstream = (Stream)Clipboard.GetData(CLIPBOARD_DATA_FORMAT)) + if(havepastedata) { - // Rewind before use - memstream.Seek(0, SeekOrigin.Begin); - - // Read data stream - ClipboardStreamReader reader = new ClipboardStreamReader(); //mxd - General.Map.Map.BeginAddRemove(); - bool success = reader.Read(General.Map.Map, memstream); - General.Map.Map.EndAddRemove(); - if(!success) //mxd + using(Stream memstream = (Stream)Clipboard.GetData(CLIPBOARD_DATA_FORMAT)) + { + // Rewind before use + memstream.Seek(0, SeekOrigin.Begin); + + // Read data stream + ClipboardStreamReader reader = new ClipboardStreamReader(); //mxd + General.Map.Map.BeginAddRemove(); + bool success = reader.Read(General.Map.Map, memstream); + General.Map.Map.EndAddRemove(); + if(!success) //mxd + { + General.Map.UndoRedo.WithdrawUndo(); // This will also mess with the marks... + General.Map.Map.ClearAllMarks(true); // So re-mark all current geometry... + } + } + } + // mxd. DB2/DB64 interop + else if(havedb2pastedata) + { + using(Stream memstream = (Stream)Clipboard.GetData(CLIPBOARD_DATA_FORMAT_DB2)) { - General.Map.UndoRedo.WithdrawUndo(); // This will also mess with the marks... - General.Map.Map.ClearAllMarks(true); // So re-mark all current geometry... + // Read data stream + UniversalStreamReader reader = new UniversalStreamReader(new Dictionary<MapElementType, Dictionary<string, UniversalType>>()); + reader.StrictChecking = false; + General.Map.Map.BeginAddRemove(); + reader.Read(General.Map.Map, memstream); + General.Map.Map.EndAddRemove(); } } + else + { + throw new NotImplementedException("Unknown clipboard data format!"); + } // The new geometry is not marked, so invert the marks to get it marked General.Map.Map.InvertAllMarks();