C.4 Классы калькулятора с графическим интерфейсом

Предыдущая  Содержание  Следующая V*D*V

Введение — предисловие к приложению "калькулятор"

Objct                            Class

  Event

  Ic                             IcClass

    Button

    Calc

    Crt

      CButton

      CLineOut

    LineOut

    Mux

  List                           ListClass

  Xt

    XawBox

    XawCommand

      XButton

    XawForm

    XawLabel

      XLineOut

    XtApplicationShell

 

Object(3) является корневым классом. Object должен быть переименован в Objct, потому что такое имя используется X11.

Event(4) — класс для представления входных данных, например, нажатия клавиш или щелчки мыши.

Ic(4) является базовым классом для представления объектов, которые могут получать, обрабатывать и отправлять события. Button преобразовывает входящие события в события с определёнными текстовыми значениями. Calc обрабатывает тексты и пересылает результат дальше. LineOut выводит на экран входящий текст. Mux пытается отправить входящее событие в один из нескольких объектов.

Crt(4) является классом для работы с пакетом функций экрана терминала curses. Он отправляет события с позицией для курсора и текстовых события для других нажатий клавиш. CButton реализует Button на экране curses. CLineOut реализует LineOut.

List управляет списком объектов и взят из главы 7.

Xt(4) является классом для работы с X Toolkit. Его подклассы обёртывают виджеты этого пакета и виджеты Athena. XButton реализует Button с помощью виджета Command. XLineOut реализует LineOut с помощью виджета Label.

СМОТРИ ТАКЖЕ       curses(3), X(1)

IcClass Crt: Ic — ввод/вывод объектов для curses

Objct

  Ic

    Crt

      CButton

      CLineout

 

new(Crt());

new(CButton(), "text"yx);

new(CLineOut(), yxlen);

 

void makeWindow (self, int rows, int cols, int x, int y)

void addStr (self, int y, int x, const char * s)

void crtBox (self)

 

Объект Crt обёртывает окно curses(3). curses инициализируются, когда создается первый объект Crt.

Crt_gate() является циклом обработки событий: он мониторит клавиатуру; он реализует перемещение курсора vi-стиля для клавиш hjkl, и возможно, для клавиш со стрелками; если нажимается клавиша return, он отправляет объект Event с kind 1 и массив с позицией строки и столбца; если нажимается control-D, gate возвращает reject; нажатие любой другой клавишы отсылается как объект Event со строкой, содержащей символ клавиши.

Объект CLineOut реализует объект LineOut на экране curses. Входящие строки не должны превышать len байт.

Объект CButton реализует объект Button на экране curses. Если он получает совпадающий текст, то отправляет его. Кроме того, если он получает событие с позицией, например, от объекта Crt, и если координаты находятся в пределах его окна, он пересылает свой текст.

СМОТРИ ТАКЖЕ       Event(4)

Класс Event: Objct — элемент ввода

Objct

  Event

 

new(Event(), kinddata);

 

int kind (self)

void * data (self)

 

Объект Event представляет элемент ввода, такой как часть текста, щелчок мыши, и так далее.

kind равен нулю, если данные — статическая строка. kind не нуль, если данные — указатель. В частности, щелчок мыши может быть представлен с помощью kind 1 и data, указывающим на массив с двумя целочисленными координатами.

СМОТРИ ТАКЖЕ       Ic(4)

IcClass: Class Ic: Objct — основные объекты ввода/вывода/обмена

Objct

  Ic

    Button

    Calc

    LineOut

    Mux

 

new(Ic());

new(Button(), "text");

new(Calc());

new(LineOut());

new(Mux());

 

%-

void wire (Objct @ toself)

enum { reject, accept } gate (self, const void * item)

 

У объекта Ic есть выходной контакт и входное действие. wire() соединяет выход с некоторым другим объектом. Если объект Ic отправит данные item с помощью gate(), он выполнит некоторое действие и отправит некоторый результат в свой выходной контакт; некоторые объекты Ic создают только вывод, а другие только потребляют входные данные. gate() возвращает accept, если приёмник принимает данные.

Ic — базовый класс. Подклассы перезаписывают gate(), чтобы реализовать их собственную обработку. Ic_gate() берёт item и использует gate(), чтобы переслать его выходному контакту, то есть подкласс будет использовать super_gate(), чтобы отправить что-то в свой выходной контакт.

Объект Button содержит текст, который отсылается наружу в ответ на определённые входные данные. Он ожидает в качестве ввода объект Event. Если Event содержит совпадающий текст или нулевой указатель или другие данные, Button принимает ввод и отсылает наружу собственный текст. Несовпадающий текст отклоняется.

Button разработана как базовый класс. Подклассы должны проверять позиции мыши и так далее, и использовать super_gate(), чтобы отослать соответствующий текст.

Объект Calc получает строку, вычисляет результат и пересылает текущий результат далее в виде строки. Обрабатывается первый символ строки ввода: цифры собираются в неотрицательное десятичное число; +, -, * и / выполняют арифметические операции с двумя операндами; = завершает арифметическую операцию; C сбрасывает калькулятор; а Q завершает приложение. Наш калькулятор — простой конечный автомат без приоритетов: первый набор цифр определяет первый операнд; первый оператор сохраняется; следующие цифры определяют другой операнд; если другой оператор принят, выполняется сохранённый оператор, а новый оператор сохраняется. Недопустимые входные данные принимаются и тихо игнорируются.

Объект LineOut принимает строку и выводит её на экран.

Объект Mux может быть соединён со списком выходов. Это отправляет свои входные данные в каждый из этих выходов, пока один из них не принимает эти данные. Список создаётся и поиск в нём производится в порядке, в котором вызывался wire().

СМОТРИ ТАКЖЕ       Crt(4), Event(4), Xt(4)

Класс Xt: Object — объекты ввода/вывода для X11

Objct

  Xt

    XawBox

    XawCommand

      XButton

    XawForm

    XawLabel

      XLineOut

    XtApplicationShell

 

new(Xt());

new(XtApplicationShell(), & argcargv);

new(XawBox(), parent, "name");

new(XawCommand(), parent, "name");

new(XawForm(), parent, "name");

new(XawLabel(), parent, "name");

new(XButton(), parent, "name", "label");

new(XLineOut(), parent, "name", "label");

 

void * makeWidget (self, WidgetClass wc, va_list * app)

void addAllAccelerators (self)

void setLabel (self, const char * label)

void addCallback (self, XtCallbackProc fun, XtPointer data)

 

void mainLoop (self)

 

Объект Xt обёртывают виджеты пакета X. makeWidget() используется, чтобы создать и установить виджет в иерархию; он берёт объект Xt parent и виджет name из указателя списка аргументов, на который указывает app. addAllAccelerators() используется, чтобы установить акселераторы, скрытые внутри объекта Xt. setLabel() устанавливает ресурс метки. addCallback() добавляет функцию обратного вызова к списку обратных вызовов.

Объект XtApplicationShell обёртывает виджет оболочки приложения из пакета X. Когда он создаётся, также создаётся виджет оболочки, и из списка аргументов основной программы, передаваемого в new(), удаляются опции пакета  X. Основной цикл приложения — mainLoop().

Объекты XawBox, XawCommand, XawForm и XawLabel обёртывают соответствующие виджеты Athena. Когда они создаются, также создаются эти виджеты. setLabel() принимается XawCommand и XawLabel. Функция обратного вызова может быть зарегистрирована в объекте XawCommand через addCallback().

Объект XButton представляет собой объект Button, реализованный с помощью объекта XawCommand. Он направляет wire() к своему внутреннему объекту Button и устанавливает обратный вызов к gate() для этой кнопки так, чтобы она отсылала свой текст, если выполняется notify(), то есть если эта кнопка нажата. Для организации других вызовов notify() могут использоваться акселераторы.

Объект XLineOut представляет собой объект LineOut, реализованный с помощью объекта XawLabel. Он направляет gate() к себе, чтобы получить и вывести строку на экран. Если родительский виджет это допускает, его виджет изменит свой размер в соответствии со строкой.

СМОТРИ ТАКЖЕ       Event(4)

 

Предыдущая  Содержание  Следующая