XmSpinBoxValidatePosition

XmSpinBoxValidatePosition — трансляция текущего значения указанного потомка XmSpinBox в допустимое значение положения

Использование

#include <Xm/SpinBox.h>

int XmSpinBoxValidatePosition(Widget text_field, int *position);

Описание

Функция XmSpinBoxValidatePosition используется приложением для реализации отслеживания изменений в редактируемом потомке XmSpinBox типа XmNumeric. Определение как и когда сделанные пользователем ихзменения вступят в силу остается за приложением.

text_field

Аргумент text_field указывает идентификатор виджета потомка XmSpinBox который был изменен. Обязательным тредованием к виджету text_field является сохранение им особенности accessTextual (всегда необходимой потомкам XmSpinBox). С ее помощью XmSpinBox получает возможность извлечь строку из виджета text_field даже если он не является текстовым виджетом Motif (класса XmText или XmTextField).

position

Определяет расположение аргумента которому будет присвоен результат трансляции, выполненной функцией.

В первую очередь функция XmSpinBoxValidatePosition проверяет имеет ли указанный виджет тип XmNUMERIC. Если виджет не является числовым значением, то XmSpinBoxValidatePosition устанавливает возвращаемое значение положения в текущее значение и возвращает XmCURRENT_VALUE.

Функция XmSpinBoxValidatePosition пытается произвести преобразование введенной строки в число с плавающей точкой. Если такое преобразование невозможно, то XmSpinBoxValidatePosition устанавливает значение возвращаемого положения в значение текущего положения и возвращает XmCURRENT_VALUE.

Далее XmSpinBoxValidatePosition преобразует число с плавающей точкой в целочисленное значение, используя ресурс XmNdecimalPoints. Лишние десятичные знаки отбрасываются. Полученное целочисленное значение проверяется на попадание в допустимый диапазон определенный ресурсами XmNminimumValue и XmNmaximumValue, включая сами эти значения. Если значение оказывается вне допустимого диапазона, то XmSpinBoxValidatePosition устанавливает значение возвращаемого положения в значение ближайшего предельного значения и возвращает соотвтественно либо XmMINIMUM_VALUE либо XmMAXIMUM_VALUE.

В заключении XmSpinBoxValidatePosition проверяет принадлежность полученного целочисленного значения последовательности XmNminimumValue ... XmNminimumValue + (n - 1) * XmNincrementValue. Если значение не принадлежит этой последовательности, то XmSpinBoxValidatePosition устанавливает возвращаемое значение положения в значение ближайшего элемента последовательности который меньше либо равен полученному значению и возвращает XmINCREMENT_VALUE.

В противном случае XmSpinBoxValidatePosition присваивает возвращаемому значению положения полученное целочисленное значение и возвращает XmVALID_VALUE.

Возвращаемое значение

XmSpinBoxValidatePosition возвращает признак результата проведенной проверки. Возможнен возврат следующих значений:

XmCURRENT_VALUE

Преобразование невозможно. Возврашено текущее значение.

XmMINIMUM_VALUE

Введенное значение меньше минимального. Возвращено минимальное значение.

XmMAXIMUM_VALUE

Введенное значение больше максимального. Возвращено максимальное значение.

XmINCREMENT_VALUE

Введенное значение не поподает в допустимый ряд значений. Возвращено блищайшее меньшее значение.

XmVALID_VALUE

Преобразование прошло успешно. Возвращено полученное значение.

Примеры

Первый пример показывает использование функции XmSpinBoxValidatePosition в процедуре обратного вызова XmNmodifyVerifyCallback, установленной для виджетов XmSpinBox и XmSimpleSpinBox:
    /*
     * Install a callback on a spin arrow press.
     */
    XtAddCallback(sb, XmNmodifyVerifyCallback, ModifyVerifyCB, NULL);
    XtAddcallback(simple_sb, XmNmodifyVerifyCallback, ModifyVerifyCB, NULL);
Сама процедура обратного вызова выглядит следующим образом:
    void ModifyVerifyCB(widget, call_data, client_data) {
        XmPinBoxCallbackStruct *cbs = (XmSpinBoxCallbackStruct *) call_data;
        int position;
        Widget textual = NULL;
        if (XtIsSubclass(w, xmSimpleSpinBoxWidgetClass))
        {
            Arg args[1];
            XtSetArg(args[0], XmNtextField, &textual);
            XtGetValues(w, args, 1);
        }
        else if (XtIsSubclass(w, xmSpinBoxWidgetClass))
            textual = cbs->widget;
        else
            textual = (Widget) NULL;

        ...

        if (XmSpinBoxValidatePosition(textual, &position) == XmCURRENT_VALUE)
            XBell(XtDisplay(w), 0);
        else
            cbs->position = position;
    }

Второй пример показывает использование функции XmSpinBoxValidatePosition в процедуре обратного вызова XmNactivateCallback, установленной для текстового потомка XmSpinBox:
    /*
     * Install a callback on spin box arrow press.
     */
    XtAddCallback(tf, XmNactivateCallback, ModifyVerifyChildCB, NULL);
Сама процедура обратного вызова выглядит следующим образом:
    void ModifyVerifyChildCB(widget, call_data, client_data) {
        int    position;
        Widget textual = widget;
        Arg    args[1];
        
        if (XmSpinBoxValidatePosition (textual, &position) == XmCURRENT_VALUE)
            XBell(XtDisplay(widget), 0);
           
        /* Set the position constraint resource of the textfield */
        XtSetArg(args[0], XmNposition, position);
        XtSetValues(textual, args, 1);
    }

Связанная информация

XmSpinBox(3), XmSimpleSpinBox(3), XmCreateSpinBox(3) и XmCreateSimpleSpinBox(3)