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

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

ПОСТ                   (* действия кнопок и состояние поля *)
  состЗаменить-   = 1;
  состВсе-        = 2;
  состПропустить- = 3;

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

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

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

  занято = длЦепиЗаменить +промежуток+
                длЦепиВсе +промежуток+
         длЦепиПропустить +промежуток+
             длЦепиОтмена;
                                       позЗаменить = 1+((колонок-занято-1) ДЕЛИТЬ 2);

                              позВсе = позЗаменить+длЦепиЗаменить+промежуток;

              позПропустить = позВсе + длЦепиВсе +промежуток;

  позОтмена = позПропустить + длЦепиПропустить +промежуток;

  позНа = 1+((колонок-2-1) ДЕЛИТЬ 2);

ПЕР
      полеД:    Поле.Доступ;
  подложкаД:Подложка.Доступ;
     чертаД:   Черта.Доступ;

  запОбразецД,
  запНаД,
  запЗаменаД:Записка.Доступ;

  кнопВсеД,
  кнопЗаменитьД,
  кнопПропуститьД,
  кнопОтменаД:Кнопка.Доступ;

  цепьОбразец,
  цепьЗамена:ЦЕПЬ[128];

  позОбразец,
  позЗамена:ЦЕЛ;

УКАЗ
  цепьОбразец:='"';

  оЦепи.ДобавитьВКонец(цепьОбразец,образец);
  оЦепи.ДобавитьВКонецЗнак(цепьОбразец,'"');

  цепьЗамена:='"';

  оЦепи.ДобавитьВКонец(цепьЗамена,замена);
  оЦепи.ДобавитьВКонецЗнак(цепьЗамена,'"');

  позОбразец:=1+((колонок-ДЛИНА(цепьОбразец)-1) ДЕЛИТЬ 2);
  позЗамена:=1+((колонок-ДЛИНА(цепьЗамена)-1) ДЕЛИТЬ 2);
                                                              (* создаём поле *)

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

                                                            (* создаём наделы *)
  подложкаД      :=Подложка.Создать (0,0,0,0,"Замена");
  запОбразецД    := Записка.Создать (1,позОбразец,1,-2,цепьОбразец);
  запНаД         := Записка.Создать (2,позНа,1,-2,'на');
  запЗаменаД     := Записка.Создать (3,позЗамена,1,-2,цепьЗамена);
  чертаД         :=   Черта.Создать (4,0,1,0);
  кнопЗаменитьД  :=  Кнопка.Создать (5,позЗаменить,ЦепьЗаменить,ПолеЗамена.состЗаменить,ВКЛ); 
  кнопВсеД       :=  Кнопка.Создать (5,позВсе,ЦепьВсе,ПолеЗамена.состВсе,ВКЛ); 
  кнопПропуститьД:=  Кнопка.Создать (5,позПропустить,ЦепьПропустить,ПолеЗамена.состПропустить,ВКЛ); 
  кнопОтменаД    :=  Кнопка.Создать (5,позОтмена,ЦепьОтмена,Поле.состОтмена,ВКЛ); 

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

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

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

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

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

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

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

КОН ПолеЗамена.
