public string SelectedToClipboard()
        {
            if (SelectedTreeNode.Count == 0)
            {
                return(string.Empty);
            }

            var minLevel = int.MaxValue;
            var maxLevel = int.MinValue;

            foreach (var item in SelectedTreeNode)
            {
                if (minLevel > item.Level)
                {
                    minLevel = item.Level;
                }

                if (maxLevel < item.Level)
                {
                    maxLevel = item.Level;
                }
            }

            var buffer = new StringBuilder();
            var sbHtml = new StringBuilder();

            sbHtml.AppendLine(HTMLStyle.TableOpen);
            // Should follow display of nodes...
            foreach (var item in SelectedTreeNode)
            {
                var text = item.Text;

                sbHtml.Append(HTMLStyle.TROpen);
                // TreeData Tag is teh first column
                if (item.Tag is FormHierarchyDisplay.TreeData data)
                {
                    text = data.Title;
                    if (!string.IsNullOrEmpty(data.Tag))
                    {
                        sbHtml.Append(HTMLStyle.AddTd("<td>{0}</td>", data.Tag));
                        buffer.Append(data.Tag);
                        buffer.Append("\t");
                        if (text.StartsWith(data.Tag, StringComparison.Ordinal))
                        {
                            text = text.Substring(data.Tag.Length).TrimStart(' ', '-');
                        }
                    }
                    else
                    {
                        sbHtml.Append(HTMLStyle.TDEmpty);
                    }
                }
                // Depending on Level add columns
                for (var level = minLevel; level < item.Level; level++)
                {
                    buffer.Append("\t");
                    sbHtml.Append(HTMLStyle.TDEmpty);
                }

                sbHtml.Append(
                    HTMLStyle.AddTd(
                        "<td colspan='{0}'>{1}</td>",
                        ((maxLevel - item.Level) + 1).ToString(CultureInfo.InvariantCulture),
                        text));
                buffer.Append(text);
                for (var level = item.Level + 1; level < maxLevel; level++)
                {
                    buffer.Append("\t");
                }
                // TreeData Children Count is the last column
                if (item.Tag is FormHierarchyDisplay.TreeData data2)
                {
                    sbHtml.Append(HTMLStyle.AddTd("<td>{0}</td>", data2.Children.Count));
                    buffer.Append(data2.Children.Count);
                }
                sbHtml.AppendLine(HTMLStyle.TRClose);
                buffer.AppendLine();
            }

            sbHtml.AppendLine(HTMLStyle.TableClose);

            var dataObject = new DataObject();

            dataObject.SetData(DataFormats.Html, true, HTMLStyle.ConvertToHtmlFragment(sbHtml.ToString()));
            dataObject.SetData(DataFormats.Text, true, buffer.ToString());

            Clipboard.Clear();
            Clipboard.SetDataObject(dataObject, false, 5, 200);

            return(buffer.ToString());
        }
Пример #2
0
        /// <summary>
        ///   Copies all cells to the clipboard
        /// </summary>
        /// <param name="addErrorInfo">if set to <c>true</c> [add error information].</param>
        /// <param name="cutLength">if set to <c>true</c> [cut length].</param>
        /// <param name="alternatingRows">if set to <c>true</c> [alternating rows].</param>
        /// <param name="columns">The columns.</param>
        /// <param name="rows">The rows.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        private void CopyAllCellsIntoClipboard(
            bool addErrorInfo,
            bool cutLength,
            bool alternatingRows,
            [NotNull] DataGridViewColumnCollection columns,
            [NotNull] DataGridViewRowCollection rows,
            CancellationToken cancellationToken)
        {
            var buffer = new StringBuilder();
            var sbHtml = new StringBuilder(m_HtmlStyle.TableOpen);

            sbHtml.Append(m_HtmlStyle.TROpenAlt);
            var first = true;

            var visibleColumns = new SortedDictionary <int, DataGridViewColumn>();

            foreach (DataGridViewColumn c in columns)
            {
                // Do not include the error field it will be retrieved from the error collection with nice coloring
                if (c.Visible && c.HeaderText != ReaderConstants.cErrorField)
                {
                    visibleColumns.Add(c.DisplayIndex, c);
                }
            }
            var hasRowError = HasRowErrors(0, rows.Count, rows);

            foreach (var col in visibleColumns.Values)
            {
                var headerText = col.HeaderText;
                sbHtml.Append(HTMLStyle.AddTd(m_HtmlStyle.TH, headerText));
                if (!first)
                {
                    buffer.Append('\t');
                }
                else
                {
                    first = false;
                }

                buffer.Append(EscapeTab(headerText));
            }

            if (hasRowError && addErrorInfo)
            {
                sbHtml.Append(HTMLStyle.AddTd(m_HtmlStyle.TH, c_ErrorInfo));
                buffer.Append('\t');
                buffer.Append(c_ErrorInfo);
            }

            sbHtml.AppendLine(m_HtmlStyle.TRClose);
            buffer.AppendLine();

            var trAlternate = false;
            var lastRefresh = DateTime.Now;

            for (var row = 0; row < rows.Count; row++)
            {
                if (rows[row].IsNewRow)
                {
                    break;
                }
                sbHtml.Append(trAlternate ? m_HtmlStyle.TROpenAlt : m_HtmlStyle.TROpen);
                if (alternatingRows)
                {
                    trAlternate = !trAlternate;
                }
                first = true;
                foreach (var col in visibleColumns.Values)
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }
                    var cell = rows[row].Cells[col.Index];
                    AddCell(cell, buffer, sbHtml, !first, addErrorInfo, cutLength, m_HtmlStyle);
                    first = false;
                }

                AppendRowError(buffer, sbHtml, rows[row].ErrorText, addErrorInfo && hasRowError, m_HtmlStyle);
                sbHtml.AppendLine(m_HtmlStyle.TRClose);
                buffer.AppendLine();
                if (!((DateTime.Now - lastRefresh).TotalSeconds > 0.2))
                {
                    continue;
                }
                lastRefresh = DateTime.Now;
                Extensions.ProcessUIElements();
            }

            sbHtml.AppendLine(m_HtmlStyle.TableClose);

            var dataObject = new DataObject();

            dataObject.SetData(DataFormats.Html, true, m_HtmlStyle.ConvertToHtmlFragment(sbHtml.ToString()));
            dataObject.SetData(DataFormats.Text, true, buffer.ToString());
            dataObject.SetClipboard();
        }