示例#1
0
        internal void Paste()
        {
            //Вставка объекта из буфера
            if (PasteOptions.PasteObject)
            {
                if (Clipboard.GetData(typeof(ClipboardData).FullName) is ClipboardData data && data.GetObject(ItemsCollection.SourceItemType, true) is List <object> items && items.Count > 0)
                {
                    InsertItems(null, items, data.DropLevel, FocusItem);
                    return;
                }
            }

            //Преобразование текста из буфера в объекты
            if (PasteOptions.ParseText)
            {
                string str      = Clipboard.GetDataObject()?.GetData(DataFormats.UnicodeText) as string;
                Type   itemType = ItemsCollection.SourceItemType;
                if (String.IsNullOrEmpty(str) || itemType == null || itemType.GetInterface(typeof(ITableRow).FullName) == null)
                {
                    return;
                }

                string[]   preArr   = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                string[][] tableArr = new string[preArr.Length][];
                for (int i = 0; i < preArr.Length; i++)
                {
                    tableArr[i] = preArr[i].Split('\t');
                }

                int[] dropLevels  = new int[preArr.Length];
                bool  isSetLevels = ItemsCollection.SourceItemsIsIChildCollection;
                if (isSetLevels)
                {
                    for (int i = 0; i < tableArr.Length; i++)
                    {
                        if (tableArr[i].Length > 0)
                        {
                            if (Int32.TryParse(tableArr[i][0], out int droplevel) && droplevel >= 0)
                            {
                                dropLevels[i] = droplevel;
                            }
                            else
                            {
                                isSetLevels = false;
                                break;
                            }
                        }
                    }
                }

                int           level = int.MaxValue;
                List <object> items = new List <object>();
                if (isSetLevels)
                {
                    if (dropLevels.Length > 0)
                    {
                        level = dropLevels[0];
                    }
                    List <object> lasLevels = new List <object>();
                    for (int i = 0; i <= level; i++)
                    {
                        lasLevels.Add(null);
                    }
                    for (int i = 0; i < tableArr.Length; i++)
                    {
                        object    obj = Activator.CreateInstance(itemType);
                        ITableRow ti  = obj as ITableRow;
                        for (int j = 1; j < tableArr[i].Length; j++)
                        {
                            ti.SetValue(j - 1, tableArr[i][j]?.Trim());
                        }

                        if (dropLevels[i] == level)
                        {
                            items.Add(ti);
                            lasLevels[level] = ti;
                        }
                        else
                        {
                            if (lasLevels.Count > dropLevels[i] - 1)
                            {
                                (lasLevels[dropLevels[i] - 1] as IChildCollection)?.Add(ti);
                            }
                            if (dropLevels[i] < lasLevels.Count)
                            {
                                lasLevels[dropLevels[i]] = ti;
                            }
                            else if (dropLevels[i] == lasLevels.Count)
                            {
                                lasLevels.Add(ti);
                            }
                        }
                    }
                }
                else
                {
                    level = 1;
                    for (int i = 0; i < tableArr.Length; i++)
                    {
                        object    obj = Activator.CreateInstance(itemType);;
                        ITableRow ti  = obj as ITableRow;
                        for (int j = 0; j < tableArr[i].Length; j++)
                        {
                            ti.SetValue(j, tableArr[i][j]?.Trim());
                        }
                        items.Add(ti);
                    }
                }
                if (items.Count > 0)
                {
                    InsertItems(null, items, level, FocusItem);
                    return;
                }
            }
        }