public string TabTableToHTML(string text, bool firstLineHeader, bool addTable) { var sbHtml = new StringBuilder(); if (addTable) { sbHtml.Append(TableOpen); } var lineNo = 0; foreach (var line in text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)) { lineNo++; if (lineNo == 1 && firstLineHeader) { sbHtml.Append(TROpenAlt); foreach (var column in line.Split(new[] { '\t' }, StringSplitOptions.None)) { sbHtml.Append(HTMLStyle.AddTd(TH, column)); } sbHtml.AppendLine(TRClose); } else { sbHtml.Append(TROpen); foreach (var column in line.Split(new[] { '\t' }, StringSplitOptions.None)) { sbHtml.Append(HTMLStyle.AddTd(TD, column)); } sbHtml.AppendLine(TRClose); } } if (addTable) { sbHtml.Append(TableClose); } return(sbHtml.ToString()); }
/// <summary> /// Raises the <see cref="KeyDown" /> event. /// </summary> /// <param name="e"> /// A <see cref="KeyEventArgs" /> that contains the event data. /// </param> protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); // Handle CRTL -A if (e.Control && e.KeyCode == Keys.A) { SelectedTreeNode.Clear(); foreach (TreeNode item in Nodes) { AddNodeWithSubnodes(item); } PaintSelectedNodes(); // SelectedTreeNode = this.Nodes; } // Handle CRTL -C if (!e.Control || e.KeyCode != Keys.C) { return; } { if (SelectedTreeNode.Count == 0) { return; } 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(); var style = ApplicationSetting.HTMLStyle; sbHtml.AppendLine(style.TableOpen); foreach (var item in SelectedTreeNode.OrderBy(x => x.FullPath)) { var text = item.Text; sbHtml.Append(style.TROpen); if (item.Tag is FormHierachyDisplay.TreeData data) { text = data.Title; if (!string.IsNullOrEmpty(data.Tag)) { sbHtml.Append(HTMLStyle.AddTd("<td>{0}</td>", data.Tag)); if (text.StartsWith(data.Tag, StringComparison.Ordinal)) { text = text.Substring(data.Tag.Length).TrimStart(' ', '-'); } } else { sbHtml.Append(style.TDEmpty); } } for (var level = minLevel; level <= maxLevel; level++) { buffer.Append("\t"); if (level < item.Level) { sbHtml.Append(style.TDEmpty); } if (level != item.Level) { continue; } sbHtml.Append(HTMLStyle.AddTd("<td colspan='{0}'>{1}</td>", (maxLevel - level + 1).ToString(System.Globalization.CultureInfo.InvariantCulture), text)); buffer.Append(item.Text); } sbHtml.AppendLine(style.TRClose); buffer.AppendLine(); } sbHtml.AppendLine(style.TableClose); var dataObject = new DataObject(); dataObject.SetData(DataFormats.Html, true, style.ConvertToHtmlFragment(sbHtml.ToString())); dataObject.SetData(DataFormats.Text, true, buffer.ToString()); Clipboard.Clear(); Clipboard.SetDataObject(dataObject, false, 5, 200); } }
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()); }
/// <summary> /// Copies the selected cells into 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="selectedCells">The selected cells.</param> /// <param name="cancellationToken">The cancellation token.</param> private void CopySelectedCellsIntoClipboard( bool addErrorInfo, bool cutLength, bool alternatingRows, [NotNull] DataGridViewColumnCollection columns, [NotNull] DataGridViewRowCollection rows, [NotNull] DataGridViewSelectedCellCollection selectedCells, CancellationToken cancellationToken) { var buffer = new StringBuilder(); var dataObject = new DataObject(); // If there are multiple cells Add a header and a neat HTML table var sbHtml = new StringBuilder(m_HtmlStyle.TableOpen); var leftCol = int.MaxValue; var rightCol = int.MinValue; var topRow = int.MaxValue; var bottomRow = int.MinValue; foreach (DataGridViewCell cell in selectedCells) { if (cell.OwningColumn.DisplayIndex < leftCol) { leftCol = cell.OwningColumn.DisplayIndex; } if (cell.OwningColumn.DisplayIndex > rightCol) { rightCol = cell.OwningColumn.DisplayIndex; } if (cell.RowIndex < topRow) { topRow = cell.RowIndex; } if (cell.RowIndex > bottomRow) { bottomRow = cell.RowIndex; } } var hasRowError = HasRowErrors(topRow, bottomRow + 1, rows); var visibleColumns = new List <int>(); sbHtml.Append(m_HtmlStyle.TROpenAlt); for (var col = leftCol; col <= rightCol; col++) { foreach (DataGridViewColumn diplayCol in columns) { if (diplayCol.DisplayIndex == col && diplayCol.Visible && diplayCol.HeaderText != ReaderConstants.cErrorField) { visibleColumns.Add(col); sbHtml.Append(HTMLStyle.AddTd(m_HtmlStyle.TH, diplayCol.HeaderText)); if (buffer.Length > 0) { buffer.Append('\t'); } buffer.Append(EscapeTab(diplayCol.HeaderText)); break; } } } 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 = topRow; row <= bottomRow; row++) { if (rows[row].IsNewRow) { continue; } if (cancellationToken.IsCancellationRequested) { return; } sbHtml.Append(trAlternate ? m_HtmlStyle.TROpenAlt : m_HtmlStyle.TROpen); if (alternatingRows) { trAlternate = !trAlternate; } var written = false; if (cancellationToken.IsCancellationRequested) { return; } for (var col = leftCol; col <= rightCol; col++) { if (!visibleColumns.Contains(col)) { continue; } foreach (DataGridViewCell cell in selectedCells) { if (cell.RowIndex != row) { continue; } if (cell.OwningColumn.DisplayIndex != col) { continue; } AddCell(cell, buffer, sbHtml, col > leftCol, addErrorInfo, cutLength, m_HtmlStyle); written = true; break; } if (written) { continue; } buffer.Append('\t'); sbHtml.Append(m_HtmlStyle.TDEmpty); } 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); dataObject.SetData(DataFormats.Html, true, m_HtmlStyle.ConvertToHtmlFragment(sbHtml.ToString())); dataObject.SetData(DataFormats.Text, true, buffer.ToString()); dataObject.SetClipboard(); }
/// <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(); }