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}