244 Глава 16. Интерфейс пользователя
3. Обеспечение содержимого панелей. Приложение должно предусмот-
реть для каждой панели метод, определяющий содержимое панели. Это
обработчик события #getContents. По этому методу всегда можно опреде-
лить панель, используя имя обработчика в сообщении changed: и позволяя
приложению модифицировать панель.
4. Поддержка связей и синхронизации. Выбор или изменение содержа-
щихся в панели данных может воздействовать на другие панели и на все
приложение. Если, например, редактируется текст в текстовой панели, из-
менения текста локальны, так как не затрагивают другие панели и само
приложение. Однако когда изменения сохраняются, текст нужно или от-
компилировать в выбранном классе, или сохранить в файле, или поместить
в файл регистрации изменений. Сохранить текст может только приложение,
так как последствия сохранения уже глобальны.
Действия, приводящие к глобальным последствиям, требуют синхрони-
зации. Важнейшую роль в синхронизации играет сообщение when:perform:.
После when: указывается событие панели, а после perform: — селектор со-
общения, посылаемого приложению как реакция на событие. Сообщение
when:perform: посылается при создании окна приложения и определяет для
каждой панели селектор сообщения, которое должно посылаться приложе-
нию тогда, когда в панели происходит указанное событие. Создавая метод-
обработчик события, следует помнить, что единственным параметром та-
кого метода должна быть сама панель.
Если т ребуется изменение других панелей, то для передачи соответ-
ствующим панелям сообщений могут применяться два механизма: явная
передача, которая использует имя панели или саму панель, и передача
через механизм зависимостей (сообщения changed:, changed:with:, chan-
ged:with:with:). В Smalltalk Express принято, что в классах интерфейса поль-
зователя обычно первый аргумент этого сообщения является селектором
обработчика события #getContents панели, которая должна обновиться.
5. Определение меню панелей. Когда во время создания панели ей по-
сылается сообщение when: #getMenu perform: #message, в приложении
должен быть определен метод с селектором #message. Этот метод должен
устанавливать меню панели.
Часто в дополнение к классам окон приложения проектировщики долж-
ны создавать и диалоговые окна, которые позволяли бы обрабатывать в ин-
терактивном режиме запросы пользователя к приложению и запросы при-
ложения к пользователю. Для создания диалогового окна надо добавить но-
вый подкласс в классе WindowDialog — подклассе класса ViewManager. Эк-
земпляры WindowDialog, в отличие от окон приложений, являются модаль-
ными окнами, то есть приложение, его вызвавшее, не может продолжить