﻿$engine JScript
$uname TextChangesWatcher
$dname Класс TextChangesWatcher
$addin stdlib
$addin vbs

////////////////////////////////////////////////////////////////////////////////////////
////{ TextChangesWatcher (Александр Орефков)
////
// Класс для отслеживания изменения текста в поле ввода, для замены
// события АвтоПодборТекста. Штатное событие плохо тем, что не возникает
// - при установке пустого текста
// - при изменении текста путем вставки/вырезания из/в буфера обмена
// - при отмене редактирования (Ctrl+Z)
// не позволяет регулировать задержку
// Параметры конструктора
// field - элемент управления поле ввода, чье изменение хотим отслеживать
// ticks - величина задержки после ввода текста в десятых секунды (т.е. 3 - 300 мсек)
// invoker - функция обратного вызова, вызывается после окончания изменения текста,
//  новый текст передается параметром функции
////
////} TextChangesWatcher
////////////////////////////////////////////////////////////////////////////////////////

TextChangesWatcher = stdlib.Class.extend({

    construct: function (field, ticks, invoker) {
        this.ticks = ticks
        this.invoker = invoker
        this.field = field
    },

    // Начать отслеживание изменения текста
    start: function() {
        this.lastText = this.field.Значение.replace(/^\s*|\s*$/g, '').toLowerCase()
        this.noChangesTicks = this.ticks + 1
        this.timerID = createTimer(100, this, "onTimer")
    },
    
    // Остановить отслеживание изменения текста
    stop: function() {
        killTimer(this.timerID)
    },
    
    // Обработчик события таймера
    onTimer: function() {
        // Получим текущий текст из поля ввода
        vbs.var0 = this.field
        vbs.DoExecute("var0.GetTextSelectionBounds var1, var2, var3, var4")
        this.field.УстановитьГраницыВыделения(1, 1, 1, 10000)
        var newText = this.field.ВыделенныйТекст.replace(/^\s*|\s*$/g, '').toLowerCase()
        this.field.УстановитьГраницыВыделения(vbs.var1, vbs.var2, vbs.var3, vbs.var4)
        // Проверим, изменился ли текст по сравению с прошлым разом
        if(newText != this.lastText)
        {
            // изменился, запомним его
            this.lastText = newText
            this.noChangesTicks = 0
        }
        else
        {
            // Текст не изменился. Если мы еще не сигнализировали об этом, то увеличим счетчик тиков
            if(this.noChangesTicks <= this.ticks)
            {
                if(++this.noChangesTicks > this.ticks)  // Достигли заданного количества тиков.
                    this.invoker(newText)               // Отрапортуем
            }
        }
    }
});
