1- using System . Collections . Generic ;
1+ using System ;
2+ using System . Collections . Generic ;
23using System . Diagnostics . Contracts ;
3- using System . Linq ;
4+ using System . IO ;
45using System . Windows . Forms ;
56using ReClassNET . Logger ;
67using ReClassNET . Nodes ;
@@ -9,146 +10,56 @@ namespace ReClassNET.DataExchange
910{
1011 public class ReClassClipboard
1112 {
12- private const string FormatClasses = "ReClass.NET::Classes" ;
13- private const string FormatNodes = "ReClass.NET::Nodes" ;
13+ /// <summary>The clipboard format string.</summary>
14+ private const string ClipboardFormat = "ReClass.NET::Nodes" ;
1415
15- public enum Format
16- {
17- Classes ,
18- Nodes
19- }
20-
21- public static bool ContainsData ( Format format ) => Clipboard . ContainsData ( format == Format . Classes ? FormatClasses : FormatNodes ) ;
22-
23- public static void CopyClasses ( IEnumerable < ClassNode > classesToCopy , IEnumerable < ClassNode > globalClasses , ILogger logger )
24- {
25- Contract . Requires ( classesToCopy != null ) ;
26- Contract . Requires ( globalClasses != null ) ;
27- Contract . Requires ( logger != null ) ;
28-
29- if ( ! classesToCopy . Any ( ) )
30- {
31- return ;
32- }
33-
34- /*var schema = SchemaBuilder.FromClasses(classesToCopy, logger);
35-
36- Clipboard.Clear();
37- Clipboard.SetData(FormatClasses, schema.BuildSchema());*/
38- }
39-
40- public static List < ClassNode > PasteClasses ( IEnumerable < ClassNode > globalClasses , ILogger logger )
41- {
42- Contract . Requires ( globalClasses != null ) ;
43- Contract . Requires ( logger != null ) ;
44-
45- var nodes = new List < ClassNode > ( ) ;
46-
47- if ( ContainsData ( Format . Classes ) )
48- {
49- /*var schemaClassNodes = Clipboard.GetData(FormatNodes) as List<SchemaClassNode>;
50- if (schemaClassNodes != null)
51- {
52- foreach (var schemaClass in schemaClassNodes)
53- {
54- // Rename classes which already exist.
55- var name = schemaClass.Name;
56- for (var i = 1; globalClasses.Any(c => c.Name == schemaClass.Name); ++i)
57- {
58- schemaClass.Name = $"{name}_{i}";
59- }
16+ /// <summary>Checks if ReClass.NET nodes are present in the clipboard.</summary>
17+ public static bool ContainsNodes => Clipboard . ContainsData ( ClipboardFormat ) ;
6018
61- // Remove all reference types with unknown references.
62- schemaClass.Nodes.RemoveAll(n => n is SchemaReferenceNode && !globalClasses.Any(c => c.Name == ((SchemaReferenceNode)n).InnerNode?.Name));
63- }
64-
65- // Now remove all reference types with unknown references.
66-
67- //schemaClassNodes.RemoveAll(n => n is SchemaReferenceNode && !globalClasses.Any(c => c.Name == ((SchemaReferenceNode)n).InnerNode?.Name));
68-
69- var classMap = schemaClassNodes.OfType<SchemaReferenceNode>().ToDictionary(
70- srn => srn.InnerNode,
71- srn => classes.First(c => c.Name == srn.InnerNode.Name)
72- );
73-
74- foreach (var schemaNode in schemaClassNodes)
75- {
76- BaseNode node;
77- if (SchemaBuilder.TryCreateNodeFromSchema(schemaNode, parentNode, classMap, logger, out node))
78- {
79- nodes.Add(node);
80- }
81- }
82- }*/
83- }
84-
85- return nodes ;
86- }
87-
88- public static void CopyNodes ( IEnumerable < BaseNode > nodes , IEnumerable < ClassNode > globalClasses , ILogger logger )
19+ /// <summary>Copies the nodes to the clipboard.</summary>
20+ /// <param name="nodes">The nodes to copy.</param>
21+ /// <param name="logger">The logger.</param>
22+ public static void Copy ( IEnumerable < BaseNode > nodes , ILogger logger )
8923 {
9024 Contract . Requires ( nodes != null ) ;
91- Contract . Requires ( globalClasses != null ) ;
9225 Contract . Requires ( logger != null ) ;
9326
94- if ( ! nodes . Any ( ) )
27+ using ( var ms = new MemoryStream ( ) )
9528 {
96- return ;
97- }
98-
99- /*var classMap = globalClasses.ToDictionary(
100- c => c,
101- c => new SchemaClassNode { Name = c.Name }
102- );
29+ ReClassNetFile . WriteNodes ( ms , nodes , logger ) ;
10330
104- var schemaNodes = new List<SchemaNode>();
105- foreach (var node in nodes)
106- {
107- SchemaNode schemaNode;
108- if (SchemaBuilder.TryCreateSchemaFromNode(node, classMap, logger, out schemaNode))
109- {
110- schemaNodes.Add(schemaNode);
111- }
31+ Clipboard . SetData ( ClipboardFormat , ms . ToArray ( ) ) ;
11232 }
113-
114- Clipboard.Clear();
115- Clipboard.SetData(FormatNodes, schemaNodes);*/
11633 }
11734
118- public static List < BaseNode > PasteNodes ( ClassNode parentNode , IEnumerable < ClassNode > globalClasses , ILogger logger )
35+ /// <summary>Pastes nodes from the clipboard.</summary>
36+ /// <param name="templateProject">The project to resolve class references.</param>
37+ /// <param name="logger">The logger.</param>
38+ /// <returns>A list of <see cref="ClassNode"/> and <see cref="BaseNode"/>. If no data was present, both lists are empty.</returns>
39+ public static Tuple < List < ClassNode > , List < BaseNode > > Paste ( ReClassNetProject templateProject , ILogger logger )
11940 {
120- Contract . Requires ( parentNode != null ) ;
121- Contract . Requires ( globalClasses != null ) ;
41+ Contract . Requires ( templateProject != null ) ;
12242 Contract . Requires ( logger != null ) ;
12343 Contract . Ensures ( Contract . Result < List < BaseNode > > ( ) != null ) ;
12444
45+ var classes = new List < ClassNode > ( ) ;
12546 var nodes = new List < BaseNode > ( ) ;
12647
127- if ( ContainsData ( Format . Nodes ) )
48+ if ( ContainsNodes )
12849 {
129- /* var schemaNodes = Clipboard.GetData(FormatNodes ) as List<SchemaNode> ;
130- if (schemaNodes != null)
50+ var data = Clipboard . GetData ( ClipboardFormat ) as byte [ ] ;
51+ if ( data != null )
13152 {
132- // Now remove all reference types with unknown references.
133- schemaNodes.RemoveAll(n => n is SchemaReferenceNode && !globalClasses.Any(c => c.Name == ((SchemaReferenceNode)n).InnerNode?.Name));
134-
135- var classMap = schemaNodes.OfType<SchemaReferenceNode>().ToDictionary(
136- srn => srn.InnerNode,
137- srn => globalClasses.First(c => c.Name == srn.InnerNode.Name)
138- );
139-
140- foreach (var schemaNode in schemaNodes)
53+ using ( var ms = new MemoryStream ( data ) )
14154 {
142- BaseNode node;
143- if (SchemaBuilder.TryCreateNodeFromSchema(schemaNode, parentNode, classMap, logger, out node))
144- {
145- nodes.Add(node);
146- }
55+ var result = ReClassNetFile . ReadNodes ( ms , templateProject , logger ) ;
56+ classes . AddRange ( result . Item1 ) ;
57+ nodes . AddRange ( result . Item2 ) ;
14758 }
148- }*/
59+ }
14960 }
15061
151- return nodes ;
62+ return Tuple . Create ( classes , nodes ) ;
15263 }
15364 }
15465}
0 commit comments