Поймать текст, прежде чем вставить его - PullRequest
3 голосов
/ 11 ноября 2009

У меня есть текстовое представление, и когда что-то вставляется в него из буфера обмена, мне нужно перехватить этот текст и выполнить некоторую предварительную обработку, прежде чем он попадет в текстовое представление.

Я пытался прослушать событие "PasteClipboard", которое не дает мне способа изменить входящий текст. и событие textview.Buffer.Changed, которое запускается после того, как вставленный текст попадает в текстовое представление.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 20 ноября 2009

AFAIK ваш лучший вариант - это постобработка текста после того, как он был вставлен - у события InsertText в TextBuffer есть аргументы, которые сообщают вам позицию и размер вставленного текста, так что вы можете удалить, обработать и повторно вставить его. Вы, конечно, хотели бы избежать перехвата вставок в 1 символ (нажатия клавиш) и собственных повторных вставок, но это тривиально.

Единственный другой вариант, о котором я могу подумать, - это заново реализовать поддержку вставки, перехватывая команду вставки клавиши, средний щелчок и т. Д., Но учтите, что клавиши команд могут быть переопределены в пользовательских файлах gtkrc, поэтому реализация это правильно может стать волосатым.

Возможно, стоит спросить об этом на канале # gtk + IRC на irc.gnome.org.

1 голос
/ 19 ноября 2009

Делая небольшое гугление, я нашел следующую документацию по Gtk.TextBuffer и GTK, альтернативной .net WndProc в Mono . Возможно, вы захотите добавить атрибут [GLib.ConnectBefore] в свой код, чтобы получить доступ к методу WndProc в GTK. Приведенный выше код Бинера, вероятно, будет работать с небольшими изменениями для инфраструктуры GTK.

0 голосов
/ 12 ноября 2009

Возможно, это вам не поможет, но я ловлю сообщение WM_PASTE в пользовательском элементе управления, который реализует TextBox. Я получаю GetText из буфера обмена в строковую переменную и, если он соответствует тому, что я ищу, я делаю свои изменения в переменной и устанавливаю переменную .Text в свою переменную и проглатываю событие, чтобы текстовое поле его получило Если это не то, что я ищу, но разрешено, я просто передаю событие с base.WndProc (ref m).

Пример:

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_PASTE)
    {
        string clipboardVin = Clipboard.GetText();
        string newVin = "";
        if (SelectionLength > 0)
        {
            newVin = Text.Replace(SelectedText, "");
        }
        else
        {
            newVin = Text;
        }
        newVin = newVin.Insert(SelectionStart, clipboardVin);
        if (!vinRegEx.IsMatch(newVin))
        {
            m.Result = new IntPtr(Convert.ToInt32(true));
            MessageBox.Show("The resulting text is not a valid VIN.", "Can Not Paste", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else
        {
            base.WndProc(ref m);
        }
    }
    else
    {
        base.WndProc(ref m);
    }
}
...