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

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


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

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

  промежуток = 3;                                (* промежуток между кнопками *)
                            колонок=70;
                                    занято = ДлЦепиДалее +промежуток+ДлЦепиОтмена;

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

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

  памИскатьД,
  памЗаменитьД:Памятка.Доступ;

  метИскатьД,
  метЗаменитьД:  Метка.Доступ;

  холИскатьД,
  холЗаменитьД:  Холст.Доступ; 

     черта1Д,
     черта2Д,
     черта3Д:    Черта.Доступ;

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

  кресЦелыеД,
  кресОбратныйД,
  кресЗаглавныеД,
  кресОтмеченнаяД,
  кресПодтверждениеД:Крестик.Доступ;

  запНачалоД:Записка.Доступ;
  тчкНачалоД:  Точка.Доступ;

  надписьНачало:РЯД 2 ИЗ Надел.РядНадпись;

  понятие:ЦЕПЬ[100];

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

                                                    (* создаём чёрточки=черты *)
  черта1Д   :=Черта.Создать           (5,0,1,0);
  кресЗаглавныеД:=Крестик.Создать     (6,2,"Учитывать ~заглавные буквы"); 
  кресЦелыеД:=Крестик.Создать         (7,2,"Искать ~целые слова"); 
  кресОбратныйД:=Крестик.Создать      (6,34,"О~братный просмотр"); 
  кресОтмеченнаяД:=Крестик.Создать    (8,2,"Только в ~отмеченной области"); 
  кресПодтверждениеД:=Крестик.Создать (7,34,"~Подтверждение замены"); 
  черта2Д   :=Черта.Создать           (9,0,1,0);
  запНачалоД:=Записка.Создать         (10,2,1,18,"Начинать от:");

  надписьНачало[0]:="~границы области";
  надписьНачало[1]:="положения ~указки";

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

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

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

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

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

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

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ЧитатьНастройки-(потокД:ИзФайла.ДкПотоку);
УКАЗ
  Холст.поиск.заглавные:=Настройки.ЧитатьКлюч(потокД);
  Холст.поиск.целые:=Настройки.ЧитатьКлюч(потокД);
  Холст.поиск.отмеченная:=Настройки.ЧитатьКлюч(потокД);
  Холст.поиск.обратный:=Настройки.ЧитатьКлюч(потокД);
  Холст.поиск.подтверждение:=Настройки.ЧитатьКлюч(потокД);
  Холст.поиск.отУказки:=Настройки.ЧитатьКлюч(потокД)
КОН ЧитатьНастройки;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       ПисатьНастройки-(потокД:ВФайл.ДкПотоку);
УКАЗ
  Настройки.ПисатьКлюч(потокД,"заглавные",Холст.поиск.заглавные);
  Настройки.ПисатьКлюч(потокД,"целые",Холст.поиск.целые);
  Настройки.ПисатьКлюч(потокД,"отмеченная",Холст.поиск.отмеченная);
  Настройки.ПисатьКлюч(потокД,"обратный",Холст.поиск.обратный);
  Настройки.ПисатьКлюч(потокД,"подтверждение",Холст.поиск.подтверждение);
  Настройки.ПисатьКлюч(потокД,"отУказки",Холст.поиск.отУказки)
КОН ПисатьНастройки;

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