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

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

ПОСТ
               (* действия кнопок и состояние поля *)
  состДа-  = 1;
  состНет- = 2;

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

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

                     промежуток = 2;             (* промежуток между кнопками *)

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

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

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

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

(* создаём поле *)

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

(* создаём наделы *)

  подложкаД  :=Подложка.Создать (0,0,0,0,заголовок);
  запискаД   := Записка.Создать (1,2,-3,-2,текст);
  чертаД     :=   Черта.Создать (-3,0,1,0);
  кнопДаД    :=  Кнопка.Создать (-2,позДа,ЦепьДа,состДа,ВКЛ); 
  кнопНетД   :=  Кнопка.Создать (-2,позНет,ЦепьНет,состНет,ВКЛ); 
  кнопОтменаД:=  Кнопка.Создать (-2,позОтмена,ЦепьОтмена,Поле.состОтмена,ВКЛ); 

(* заполняем наделы *)

  подложкаД.цветНадписи[Надел.состОбычный]:=Надел.цветПредупреждения;
  подложкаД.цветБуквицы[Надел.состОбычный]:=Надел.цветБуквицыПредупреждения;
   запискаД.цветНадписи[Надел.состОбычный]:=Надел.цветПредупреждения;
   запискаД.цветБуквицы[Надел.состОбычный]:=Надел.цветБуквицыПредупреждения;

(* добавляем наделы в порядке отрисовки и получения ввода *)

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

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

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

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

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

  ВОЗВРАТ полеД.состояние
КОН Выполнить;

КОН ПолеСВопросом.
