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

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

ПОСТ
                     (* виды приложения *)
  впТекстовое-  = 0;
  впОконное-    = 1;
  впБиблиотека- = 2;

ПЕР
  ВклМалыйПГ+:КЛЮЧ;         (* вид преобразователя ВКЛ - "МПГ", ОТКЛ - "ПГ" *)
  видПриложения-:ЦЕЛ;
                            (* настройки (М)ПГ *)
  настройкиПроверкиПГ:КЛЮЧ;
  настройкиОтладчикПГ:КЛЮЧ;
                            (* путь к СРЕДА.отд *)
  срдПуть:ЦЕПЬ[200];
                     (* все ключи ПГ через ";" *)
  ключиПГ:ЦЕПЬ[200];

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       СписатьИмяФайла-(имя+:ЦЕПЬ);
ПЕР
            памяткаД: Памятка.Доступ;
УКАЗ
                   (* Поиск памятки "Приложение" в очереди <список_НА_память> *)
            памяткаД:=Памятка.Найти("Приложение");
  ЕСЛИ
            памяткаД.строк > 0
  ТО
    СПИСАТЬ(памяткаД.рСтроки[0]^,имя)
  ИНАЧЕ
                                имя[0]:=0X
  КОН
КОН СписатьИмяФайла;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА РазобратьЦепь(ключстрока+:ЦЕПЬ);
(*
 * Цель:  обработать <ключстрока>, содержащую только одну настройку - 
 *                    ключ компиляции из файла Настройки.ПГ
 * До:    <настройки>
 * После: <срдПуть> <настройки> 
 *)
ПЕР
      добавитьНастройкуПГ:КЛЮЧ;
УКАЗ
  ЕСЛИ
        (ключстрока[0] = '-')                  (* начало ключа преобразования *)
      ИЛИ
        (ключстрока[0] = '/')                  (* начало ключа преобразования *)
  ТО
    ЕСЛИ ключстрока[2] = '-' ТО                (* отмена ключа преобразования *)
      добавитьНастройкуПГ:=ОТКЛ
    ИНАЧЕ                                      (*   раб. ключ  преобразования *)
      добавитьНастройкуПГ:=ВКЛ
    КОН;

    ВЫБРАТЬ ключстрока[1] ИЗ                   (*  буква ключа преобразования *)
    | 'п':                             (* '-п' = проверки времени выполнения  *)
        ЕСЛИ добавитьНастройкуПГ ТО
             настройкиПроверкиПГ:=ВКЛ          (* настройка (М)ПГ *)
        ИНАЧЕ
             настройкиПроверкиПГ:=ОТКЛ         (* настройка (М)ПГ *)
        КОН
    | 'о':                             (* '-о' = включать отладочную инфу для msVS в exe-файл приложения *)
        ЕСЛИ добавитьНастройкуПГ ТО
             настройкиОтладчикПГ:=ВКЛ          (* настройка (М)ПГ *)
        ИНАЧЕ
             настройкиОтладчикПГ:=ОТКЛ         (* настройка (М)ПГ *)
        КОН
    | 'с':                             (* '-с' = путь к СРЕДА.отд *)
        оЦепи.Удалить(ключстрока,0,2);
              СПИСАТЬ(ключстрока,срдПуть)
    | 'к':                             (* '-к' *)
        оЦепи.Удалить(ключстрока,0,2);
        оЦепи.ДобавитьВКонец(ключиПГ,ключстрока);
        оЦепи.ДобавитьВКонецЗнак(ключиПГ,';')
    ИНАЧЕ
      ЕСЛИ
                ключстрока[1] = '-'  (* начало ключа преобразования *)
      ТО
        ВЫБРАТЬ ключстрока[2] ИЗ
        | 'т': ПолеНастройки.видПриложения:=ПолеНастройки.впТекстовое
        | 'о': ПолеНастройки.видПриложения:=ПолеНастройки.впОконное
        | 'б': ПолеНастройки.видПриложения:=ПолеНастройки.впБиблиотека
        ИНАЧЕ
        КОН
      КОН
    КОН
  КОН
КОН РазобратьЦепь;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА
       РазобратьФайлНастроек-;
(*
 * Цель:  обработать построчно файл Оболочка.ПГ или файл Настройки.ПГ
 *                                              с настройками для ПГ.exe,
 *       т.е. с ключами преобразования (компиляции) отделов на Глаголе
 *                                (NB! Не более одного ключа в одной строке)
 * После: <настройки> и <срдПуть>
 *)
ПЕР
    потокД:ИзФайла.ДкПотоку;
  имяФайла:  Файл.ВПолного;

  ключВстроке:ЦЕПЬ[100]; (* содержит только одну настройку - ключ компиляции из Настройки.ПГ*)
УКАЗ
                             (* имя файла головного отдела *)
  СписатьИмяФайла(имяФайла);
                             (* имя файла настроек приложения (необязательное
                                                           или
                                                               устаревшее)    *)
  ЕСЛИ
       ПолеНастройки.ВклМалыйПГ
  ТО
    Файл.ИзменитьТип(имяФайла,"МПГ")
  ИНАЧЕ
    Файл.ИзменитьТип(имяФайла,"ПГ")         (* Оболочка.ПГ в папке приложения *)
  КОН;
       потокД:=ИзФайла.Открыть(имяФайла);
  ЕСЛИ
       потокД = ПУСТО
  ТО                      (* придётся использовать файл настроек по умолчанию *)
    ЕСЛИ
       ПолеНастройки.ВклМалыйПГ
    ТО
       потокД:=ИзФайла.Открыть("Настройки.МПГ")
    ИНАЧЕ
       потокД:=ИзФайла.Открыть("Настройки.ПГ")             (* в папке \Службы *)
    КОН
  КОН;
                          (*-- значения настроек по умолчанию --*)
  ЕСЛИ
       ПолеНастройки.ВклМалыйПГ
  ТО
     настройкиПроверкиПГ:=ОТКЛ;
  ИНАЧЕ
     настройкиПроверкиПГ:=ВКЛ;
  КОН;

     настройкиОтладчикПГ:=ВКЛ;

  срдПуть:='.';                    (* '.' = "..\Отделы\Среда[\Код\СРЕДА.obj]"
                                     из \Глагол\Службы *)
        ключиПГ:='';
  видПриложения:=впТекстовое;                   (* консольные, НЕ графические *)
  ЕСЛИ
       потокД = ПУСТО
  ТО
    ВОЗВРАТ
  КОН;
            (* уточняем кодировку при чтении из файла Настройки.ПГ по доступу
 <потокД> *)
  потокД.цВидЗнаков:=ИзФайла.знУни;

  ПОКА
       НЕ ИзФайла.Конец(потокД)
  ВЫП
                                    (* читаем единственный ключ в строке файла Настройки.ПГ *)
    Настройки.ЧитатьСтроку(потокД,ключВстроке);
                               (* ключВстроке <- ключ-строка преобразования из Настройки.ПГ
                                                                       (или из  Оболочка.ПГ) *)
    ЕСЛИ
         ключВстроке # ""
    ТО
                    РазобратьЦепь(ключВстроке)    (* один ключ в одной строке *)
    КОН
  КОН;
  ИзФайла.Закрыть(потокД)
КОН РазобратьФайлНастроек;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА СобратьФайлНастроек;
(*
 * Цель:  вывести настройки (из цепочки-строки ключиПГ) в файл Оболочка.ПГ
 *)
ПЕР
    потокД:ВФайл.ДкПотоку;
  имяФайла: Файл.ВПолного;

  ключ:ЦЕПЬ[100];
  длина,
    начПоз,
    конПоз :ЦЕЛ;
УКАЗ
                             (* имя файла головного отдела *)
  СписатьИмяФайла(имяФайла);
                             (* имя файла настроек (ключей ПГ) приложения
                                      (необязательное или устаревшее)         *)
  ЕСЛИ
       ПолеНастройки.ВклМалыйПГ
  ТО
    Файл.ИзменитьТип(имяФайла,"МПГ")
  ИНАЧЕ
    Файл.ИзменитьТип(имяФайла,"ПГ")         (* Оболочка.ПГ в папке приложения *)
  КОН;
       потокД:=ВФайл.Открыть(имяФайла);
  ЕСЛИ
       потокД = ПУСТО
  ТО
    ВОЗВРАТ
  КОН;
               (* уточняем кодировку при записи в файл Оболочка.ПГ по доступу
 <потокД> *)
  потокД.цВидЗнаков:=ВФайл.знУни;

      ВФайл.ЦепьЗнаков(потокД,"; Включить CodeView отладку (не работает с ALink)^");
  ЕСЛИ
       НЕ настройкиОтладчикПГ
  ТО
      ВФайл.ЦепьЗнаков(потокД,";")
  КОН;
      ВФайл.ЦепьЗнаков(потокД,"-о^");

  ЕСЛИ
       НЕ ПолеНастройки.ВклМалыйПГ
  ТО
      ВФайл.ЦепьЗнаков(потокД,"; Отключить проверки времени выполнения^");
    ЕСЛИ
        настройкиПроверкиПГ
    ТО
      ВФайл.ЦепьЗнаков(потокД,";")
    КОН;
    ВФайл.ЦепьЗнаков(потокД,"-п-^");
    ВФайл.ЦепьЗнаков(потокД,"; Вид приложения:^");

    ВЫБРАТЬ
            ПолеНастройки.видПриложения
    ИЗ
    | ПолеНастройки.впТекстовое : ВФайл.ЦепьЗнаков(потокД,"; текстовое^--т^")
    | ПолеНастройки.впОконное   : ВФайл.ЦепьЗнаков(потокД,"; оконное^--о^")
    | ПолеНастройки.впБиблиотека: ВФайл.ЦепьЗнаков(потокД,"; библиотека^--б^")
    КОН;

  КОН;
    ВФайл.ЦепьЗнаков(потокД,"; Путь к СРЕДА.отд^-с");
    ВФайл.ЦепьЗнаков(потокД,срдПуть);
    ВФайл.ЦепьЗнаков(потокД,"^");

  начПоз:=0;
   длина:=ДЛИНА(ключиПГ);         (* длина локальной цепочки-строки <ключиПГ> *)

  КОЛЬЦО
         конПоз:=оЦепи.ПозицияЗнака(";",ключиПГ,начПоз);
    ЕСЛИ
         конПоз = -1
    ТО
         конПоз:=длина
    КОН;
    ЕСЛИ 
         начПоз >= конПоз
    ТО
      ВЫХОД
    КОН;
    оЦепи.Часть(ключиПГ,ключ,начПоз,(конПоз-начПоз));

    ВФайл.ЦепьЗнаков(потокД,"; Ключ^-к");
    ВФайл.ЦепьЗнаков(потокД,ключ);
    ВФайл.ЦепьЗнаков(потокД,"^");
    начПоз:=конПоз+1
  КОН;
    ВФайл.Закрыть(потокД)
КОН СобратьФайлНастроек;

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

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

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

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

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

       памПутьД,
      памКлючиД:Памятка.Доступ;

      подложкаД:Подложка.Доступ;

         чертаД:Черта.Доступ;

       холПутьД,
      холКлючиД:Холст.Доступ; 

     крПроверки,
     крОтладчик:Крестик.Доступ;

       метПутьД,
      метКлючиД:Метка.Доступ;

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

тВидПриложенияД:Точка.Доступ;

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

УКАЗ
   памПутьД:=Памятка.Найти("НастройкиПуть");
  памКлючиД:=Памятка.Найти("НастройкиКлючи");
                                                              (* создаём поле *)
      полеД:=Поле.Создать(0,0,17,колонок,окружение,ВКЛ,Приём);
                                                            (* создаём наделы *)
  подложкаД:=Подложка.Создать   (0,0,0,0,"Настройки");

   холПутьД:=Холст.СоздатьСтроку(2,2,-2,памПутьД);
   метПутьД:=Метка.Создать      (1,2,"~Путь к отделу СРЕДА.отд",холПутьД); 

  холКлючиД:=Холст.СоздатьСтроку(5,2,-2,памКлючиД);
  метКлючиД:=Метка.Создать      (4,2,"~Ключи для ЗАДАНО()",холКлючиД); 

  крПроверки:=Крестик.Создать   (7,2,"Проверки ~времени выполнения"); 
  крОтладчик:=Крестик.Создать   (8,2,"~Создание данных для отладчика"); 

  надписи[0]:="~Текстовое приложение";
  надписи[1]:="~Оконное приложение";
  надписи[2]:="~Библиотека";

  тВидПриложенияД:=Точка.Создать (10,2,надписи); 
                                                             (* создаём черты *)
  чертаД:=Черта.Создать         (-3,0,1,0);

   кнопДалееД:=Кнопка.Создать   (-2,позДалее,ЦепьДалее,Поле.состДалее,ВКЛ); 
  кнопОтменаД:=Кнопка.Создать   (-2,позОтмена,ЦепьОтмена,Поле.состОтмена,ВКЛ); 

                               (* заполняем наделы на Поле Закладки на Холсте *)
  РазобратьФайлНастроек;

  ЕСЛИ
       ПолеНастройки.ВклМалыйПГ
  ТО
         крПроверки.состояние:=Надел.состОтключён;
    тВидПриложенияД.состояние:=Надел.состОтключён
  ИНАЧЕ
    тВидПриложенияД.текущая:=ПолеНастройки.видПриложения
  КОН;

  Холст.ЗагрузитьСтрокуИзЦепи(холПутьД,срдПуть);
  Холст.ЗагрузитьСтрокуИзЦепи(холКлючиД,ключиПГ);

  крПроверки.отмечен:=настройкиПроверкиПГ;
  крОтладчик.отмечен:=настройкиОтладчикПГ;

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

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

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

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

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

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

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

    Холст.СтрокуВЦепь(холПутьД,срдПуть);
    Холст.СтрокуВЦепь(холКлючиД,ключиПГ);

        настройкиПроверкиПГ:=крПроверки.отмечен;
        настройкиОтладчикПГ:=крОтладчик.отмечен;

    ПолеНастройки.видПриложения:=тВидПриложенияД.текущая;

    СобратьФайлНастроек
                             (* имя файла настроек (ключей ПГ) приложения = Оболочка.ПГ
                                      (необязательное или устаревшее)         *)
  КОН
КОН Выполнить;

(*-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-*)
УКАЗ
    ПолеНастройки.ВклМалыйПГ:=ОТКЛ
КОН ПолеНастройки.
