lbernstein123 Ответов: 2

Копирование текста из сетки в Редактор табличные текстовые столбцы не сохраняются


Пользователь сталкивается с проблемой копирования текста из сетки моего приложения в другой текстовый редактор приложения (если быть точным - приложение на принимающем сайте-Bloomberg IB Chat) - текстовые столбцы не выровнены должным образом.

Вы можете увидеть мой код - это работает на простых текстовых редакторах, таких как notepad, notepad++. Я думаю, что это работает, потому что блокнот-это моно-редактор шрифтов, каждая ширина символа одинакова. Например, когда я копирую текст в Word, текст не отображается правильно выровненным, как это было в моем приложении grid. То же самое происходит, когда я копирую текст в чат IB в Bloomberg.

Код прилагается, я вызываю метод FormatFromClipBoard (), когда пользователь нажимает ctrl+C. Пожалуйста помочь.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows;

namespace Utils
{
    public class CopyFormatter
    {
        Literal [][] matrix;

        public void FormatFromClipBoard()
        {
            try
            {
                string clipboardText = Clipboard.GetText(TextDataFormat.Text);

                BuildMatrx(clipboardText);
                CalculateTabs();
                string sReformatedText = ReformatText();
                Clipboard.SetText(sReformatedText);
            }
            catch( Exception e)
            {
            }
        }

        private string ReformatText()
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < matrix.Length; i++)
            {
                for (int j = 0; j < matrix[0].Length; j++)
                {
                    sb.Append(matrix[i][j].StringWithTabs());
                }
                sb.AppendLine();
            }
            return sb.ToString();
        }

        private void CalculateTabs()
        {
            for (int j = 0; j < matrix[0].Length; j++)
            {
                //scan vertically all first elements, all second elements to get longest token for each column
                ReferenceInt maxChars = new ReferenceInt();
                for (int i = 0; i < matrix.Length; i++)
                {
                    maxChars.LocalInt = maxChars.LocalInt > matrix[i][j].Length ? maxChars.LocalInt : matrix[i][j].Length;
                    maxChars.ContainsPeriod = matrix[i][j].text.Contains('.') ? true : maxChars.ContainsPeriod;
                    matrix[i][j].MaxCharCount = maxChars;
                }
            }
        }


        private void BuildMatrx(string clipboardText)
        {
            string[] arr = clipboardText.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            if (arr != null && arr.Length > 0)
            {
                //number of lines
                matrix = new Literal[arr.Length][];

                List<string[]> lst = new List<string[]>();
                int maxlen = 0;
                Array.ForEach(arr, line =>
                {
                    string[] l = line.Split(new char[] { '\t' }, StringSplitOptions.None);
                    lst.Add(l);
                    maxlen = l.Length > maxlen ? l.Length : maxlen;
                });

                if (maxlen > 0)
                {
                    int i = 0;
                    lst.ForEach(line =>
                    {
                        matrix[i] = new Literal[maxlen];
                        int j = 0;
                        Array.ForEach(line, token =>
                        {
                            matrix[i][j++] = new Literal(token);
                        });
                        for(; j < maxlen; j++)
                        {
                            matrix[i][j] = new Literal(string.Empty);
                        }
                        i++;
                    });
                }
            }
        }
    }

    private class Literal
    {
        public Literal(string token)
        {
            text = token;
        }
        public string text { get; set; } = string.Empty;
        public int Length { get { return text.Length; } }
        public ReferenceInt MaxCharCount { get; set; }

        public string StringWithTabs()
        {
            int tabSize = 5;
            int numberOfFlights = MaxCharCount.LocalInt / tabSize;                    
            int currWordFlights = Length / tabSize;
            int totalTabs = numberOfFlights - currWordFlights + 1;
            string s = new String('\t', totalTabs);
            return text + s;
        }
    }

    private class ReferenceInt
    {
        public int LocalInt { get; set; } = 0;
    }
}

2 Ответов

Рейтинг:
2

Gerry Schmitz

Текст есть текст.

"Шрифт" (например, моно, размер, вес и т. д.) контролируется приемником / документом / "контейнером" / почтовым клиентом / браузером / доступностью шрифта.

Если только нет функций, позволяющих вставлять "как есть" (например для mono), материал получает, какой когда-либо шрифт ОС "думает" наиболее близким для данного "семейства" (шрифтов).


Рейтинг:
0

lbernstein123

Джерри, спасибо. Я понимаю вашу точку зрения. Тем не менее, публикуя вопрос, я подумал, что, возможно, есть некоторые люди в сообществе, которые делают что-то вроде:
1. Установите глобальный крюк для вставки функции.
2. Определите семейство шрифтов окна, которое получает результат вставки.
3. Выясните, как выровнять данные на основе самого длинного слова в каждом столбце.


Richard Deeming

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" нажмите кнопку под этим решением и оставьте комментарий.

НЕ оставьте свой комментарий в разделе "Добавить свой решение вот" шкатулка.