1
- using System . Collections . Generic ;
1
+ using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Diagnostics . Contracts ;
3
- using System . Linq ;
4
+ using System . IO ;
4
5
using System . Windows . Forms ;
5
6
using ReClassNET . Logger ;
6
7
using ReClassNET . Nodes ;
@@ -9,146 +10,56 @@ namespace ReClassNET.DataExchange
9
10
{
10
11
public class ReClassClipboard
11
12
{
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" ;
14
15
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 ) ;
60
18
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 )
89
23
{
90
24
Contract . Requires ( nodes != null ) ;
91
- Contract . Requires ( globalClasses != null ) ;
92
25
Contract . Requires ( logger != null ) ;
93
26
94
- if ( ! nodes . Any ( ) )
27
+ using ( var ms = new MemoryStream ( ) )
95
28
{
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 ) ;
103
30
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 ( ) ) ;
112
32
}
113
-
114
- Clipboard.Clear();
115
- Clipboard.SetData(FormatNodes, schemaNodes);*/
116
33
}
117
34
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 )
119
40
{
120
- Contract . Requires ( parentNode != null ) ;
121
- Contract . Requires ( globalClasses != null ) ;
41
+ Contract . Requires ( templateProject != null ) ;
122
42
Contract . Requires ( logger != null ) ;
123
43
Contract . Ensures ( Contract . Result < List < BaseNode > > ( ) != null ) ;
124
44
45
+ var classes = new List < ClassNode > ( ) ;
125
46
var nodes = new List < BaseNode > ( ) ;
126
47
127
- if ( ContainsData ( Format . Nodes ) )
48
+ if ( ContainsNodes )
128
49
{
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 )
131
52
{
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 ) )
141
54
{
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 ) ;
147
58
}
148
- }*/
59
+ }
149
60
}
150
61
151
- return nodes ;
62
+ return Tuple . Create ( classes , nodes ) ;
152
63
}
153
64
}
154
65
}
0 commit comments