main
1using System;
2using System.Collections.Generic;
3using System.Diagnostics;
4using System.IO;
5using System.Linq;
6using System.Windows;
7
8namespace solidware.financials.windows.ui.views.controls
9{
10 static public class ClipboardHelper
11 {
12 static public List<string[]> ParseClipboardData()
13 {
14 var dataObj = Clipboard.GetDataObject();
15 if (dataObj == null) return new List<string[]>();
16
17 var clipboardRawData = dataObj.GetData(DataFormats.Text);
18 if (clipboardRawData == null) return new List<string[]>();
19
20 var rawDataStr = clipboardRawData as string;
21 if (rawDataStr == null && clipboardRawData is MemoryStream)
22 {
23 var ms = clipboardRawData as MemoryStream;
24 var sr = new StreamReader(ms);
25 rawDataStr = sr.ReadToEnd();
26 }
27 Debug.Assert(rawDataStr != null, string.Format("clipboardRawData: {0}, could not be converted to a string or memorystream.", clipboardRawData));
28
29 var clipboardData = new List<string[]>();
30 var rows = rawDataStr.Split(new[] {"\r\n"}, StringSplitOptions.RemoveEmptyEntries);
31 if (rows.Length > 0)
32 {
33 clipboardData = rows.Select(row => ParseTextFormat(row)).ToList();
34 }
35 else
36 {
37 Debug.WriteLine("unable to parse row data. possibly null or contains zero rows.");
38 }
39
40 return clipboardData.Where(x => x != null && x.Count() > 0 && x.First() != "\0").ToList();
41 }
42
43 static string[] ParseTextFormat(string value)
44 {
45 var outputList = new List<string>();
46 const char separator = '\t';
47 var startIndex = 0;
48 var endIndex = 0;
49
50 for (var i = 0; i < value.Length; i++)
51 {
52 var ch = value[i];
53 if (ch == separator)
54 {
55 outputList.Add(value.Substring(startIndex, endIndex - startIndex));
56
57 startIndex = endIndex + 1;
58 endIndex = startIndex;
59 }
60 else if (i + 1 == value.Length)
61 {
62 // add the last value
63 outputList.Add(value.Substring(startIndex));
64 break;
65 }
66 else
67 {
68 endIndex++;
69 }
70 }
71
72 return outputList.ToArray();
73 }
74 }
75}