(*~\Глагол\Отделы\Поле\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                           ОТДЕЛ ПолеВвода;
(*============================================================================* 
 * НАЗНАЧЕНИЕ: ввод строки текста
 *============================================================================*)

ИСПОЛЬЗУЕТ
  Надел,
  Черта,
  Кнопка,
  Записка,
  Подложка,
  Памятка,
  Холст,
  Поле,
        (*  \Глагол\               *)
  Ввод    ИЗ "..\..\Отделы\Обмен\";

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА                                                            (*(Поле.Вид)*)
       Приём(полеД:Поле.Доступ;
          посылка+:Ввод.нПосылка); (* = Пустой.Вид; - абстрактный опорный набор *)
ПЕР
        кодПосылки:ЦЕЛ;         (* получить и обработать управляющие послания *)
УКАЗ      (*
           * полеД:Поле.Доступ - НЕ надо преобразовывать
           *)
  ДЛЯ           (* анализ многоформия (полиморфизма) у <посылка> = Пустой.Вид *)
          посылка
  ВИДА
  | Ввод.нОтКлавиш:
       кодПосылки:=посылка.код;
                   посылка.код:=0;         (* скорее всего отработаем посылку *)

      ВЫБРАТЬ кодПосылки ИЗ
      | 1BH: полеД.состояние:=Поле.состОтмена (* Esc *)
      | 79H: полеД.состояние:=Поле.состДалее  (* F10 *)
      | 0DH: полеД.состояние:=Поле.состДалее  (* Ent *)
      ИНАЧЕ
          посылка.код:=кодПосылки
      КОН
  | Кнопка.нПосылка:
             полеД.состояние:=посылка.кнопкаД.действие
  ИНАЧЕ
  КОН             
КОН Приём;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                            (*(Поле.Вид)*)
       Выполнить-(
(* Цель:  осуществить ввод строки текста *)
(*============================================================================*)
(* До: *)
      заголовок-:ЦЕПЬ;        (* заголовок подложки             *)
        колонок :ЦЕЛ;         (* желаемая ширина строки ввода   *)
     окружениеД :Поле.Доступ; (* окружающее поле                *)
   номерСправки :ЦЕЛ;         (* номер справки или 0            *)
     примечание-:ЦЕПЬ;        (* дополнительное примечание      *)
(* После: *)                                                
           цепь+:ЦЕПЬ         (* полученный текст               *)
(* Примечание: если <цепь> = "", то начальное значение берётся из памятки *)
(* Ответ: *)
                 ):ЦЕЛ;                     (* состояние поля после отработки *)
(*============================================================================*)
ПОСТ
                                     (* цепочки для кнопок *)
  ЦепьДалее ="[ Далее ]";
  ЦепьОтмена="[ Отмена ]";
                               (* длина цепочек для кнопок *)
  ДлЦепиДалее =ДЛИНА(ЦепьДалее);
  ДлЦепиОтмена=ДЛИНА(ЦепьОтмена);

  промежуток = 2;                                (* промежуток между кнопками *)
  занято = ДлЦепиДалее+промежуток+ДлЦепиОтмена;
ПЕР
      полеД:    Поле.Доступ;
  подложкаД:Подложка.Доступ;
     чертаД:   Черта.Доступ;
     холстД:   Холст.Доступ; 
   запискаД: Записка.Доступ;

  кнопДалееД,
  кнопОтменаД:Кнопка.Доступ;

  позДалее,
  позОтмена:ЦЕЛ;

УКАЗ
                                          (* вычисление местоположения кнопок *)
  ЕСЛИ
       занято > колонок
  ТО
    колонок:=занято
  КОН;
  позДалее:=2+(колонок-занято+1) ДЕЛИТЬ 2;
  позОтмена:=позДалее+ДлЦепиДалее+промежуток;
                                                              (* создаём поле *)

  полеД:=Поле.Создать(0,0,8,колонок+4,окружениеД,ВКЛ,Приём (* посылок для <полеД> *) );

                                                            (* создаём наделы *)
  подложкаД:=Подложка.Создать  (0,0,0,0,заголовок);
  ЕСЛИ
       цепь # ""
  ТО
    холстД:=Холст.СоздатьСтроку(2,2,-2,ПУСТО);
    Холст.ЗагрузитьСтрокуИзЦепи(холстД,цепь)
  ИНАЧЕ
    холстД:=Холст.СоздатьСтроку(2,2,-2,Памятка.Найти(заголовок))
  КОН;
  запискаД   :=Записка.Создать (3,2,2,-2,примечание);
  чертаД     :=  Черта.Создать (-3,0,1,0);
  кнопДалееД := Кнопка.Создать (-2,позДалее,ЦепьДалее,Поле.состДалее,ВКЛ); 
  кнопОтменаД:= Кнопка.Создать (-2,позОтмена,ЦепьОтмена,Поле.состОтмена,ВКЛ); 

                                   (* добавляем наделы <вс> порядке отрисовки
                                                            и получения ввода *)
  Поле.ДобавитьНадел(полеД,подложкаД);
  Поле.ДобавитьНадел(полеД,холстД);
  Поле.ДобавитьНадел(полеД,запискаД);
  Поле.ДобавитьНадел(полеД,чертаД);
  Поле.ДобавитьНадел(полеД,кнопДалееД);
  Поле.ДобавитьНадел(полеД,кнопОтменаД);

                            (*--- основная работа ---*)

(*......................................................... проверяем <полеД> *)
    Поле.Рисовать(полеД);
  ПОВТОРЯТЬ

    Поле.Проверить(полеД)

  ДО полеД.состояние # Поле.состРабота;
(*................................................. восстанавливаем окружение *)

    Поле.Рисовать(окружениеД);

(*...................................................... перебрасываем данные *)
  ЕСЛИ
       полеД.состояние = Поле.состДалее
  ТО
    Холст.СтрокуВПамятку(холстД);
    Холст.СтрокуВЦепь(холстД,цепь)
  КОН;
  ВОЗВРАТ полеД.состояние
КОН Выполнить;

КОН ПолеВвода.
