#include <Xm/SpinBox.h> |
int XmSpinBoxValidatePosition(Widget text_field, int *position);
Функция XmSpinBoxValidatePosition используется приложением для реализации отслеживания изменений в редактируемом потомке XmSpinBox типа XmNumeric. Определение как и когда сделанные пользователем ихзменения вступят в силу остается за приложением.
Аргумент text_field указывает идентификатор виджета потомка XmSpinBox который был изменен. Обязательным тредованием к виджету text_field является сохранение им особенности accessTextual (всегда необходимой потомкам XmSpinBox). С ее помощью XmSpinBox получает возможность извлечь строку из виджета text_field даже если он не является текстовым виджетом Motif (класса XmText или XmTextField).
Определяет расположение аргумента которому будет присвоен результат трансляции, выполненной функцией.
В первую очередь функция 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 возвращает признак результата проведенной проверки. Возможнен возврат следующих значений:
Преобразование невозможно. Возврашено текущее значение.
Введенное значение меньше минимального. Возвращено минимальное значение.
Введенное значение больше максимального. Возвращено максимальное значение.
Введенное значение не поподает в допустимый ряд значений. Возвращено блищайшее меньшее значение.
Преобразование прошло успешно. Возвращено полученное значение.
Первый пример показывает использование функции 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)
| Пред. | Начало | След. |
| XmFontListRemoveEntry | Уровень выше | XmStringBaseline |