(*~\Глагол\Отделы\Поле\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                             ОТДЕЛ Надел;
(*============================================================================* 
 * НАЗНАЧЕНИЕ: надел это область на экранном поле для ввода/вывода
 *                                                    текстовых данных.
 * Вид Надел.Вид является основой для видимых наделов.
 * Также в данном отделе содержатся вспомогательные задачи для вывода
 *           надписей с выделяемыми особым цветом буквами - буквицами.
 * При нажатии Альт-кода буквицы происходит переключение клавиатурного ввода
 *           на надел, в надписи которого содержится данная буквица.
 *============================================================================*)

ИСПОЛЬЗУЕТ 
  Рамка,
        (*  \Глагол\               *)
 оЗнака   ИЗ "..\..\Отделы\Иное\",
        (*  \Глагол\               *)
  ОС      ИЗ "..\..\Отделы\Обмен\",
  ЦвЗнак  ИЗ "..\..\Отделы\Обмен\",
  Окно    ИЗ "..\..\Отделы\Обмен\",
  Ввод    ИЗ "..\..\Отделы\Обмен\";

ПОСТ
                             (* всего состояний надела = *)
  Состояний- = 3;
                             (* надел может находится в следующих состояниях: *)

  состОбычный-  = 0;    (* отображается на поле без осуществления ввода *)
  состВыбран-   = 1;    (* осуществляется ввод в данный надел *)
  состОтключён- = 2;    (* выбор данного надела невозможен *)

                             (* признаки поведения *)

  признакВыбираемый- = 0;    (* может выбираться человеком для ввода *)
  признакГлухой-     = 1;    (* не воспринимает действия человека *)
  
               (* цвета ОС (место,знак), используемые для отображения наделов *)

  цветОбычный-               = 70X;
  цветБуквицы-               = 7EX;
  цветОтключённый-           = 78X;
  цветВыбраннойКнопки-       = 30X;
  цветБуквицыВыбраннойКнопки-= 3EX;
  цветХолста-                = 1BX;
  цветОтметкиХолста-         = 30X;
  цветОтключённогоХолста-    = 18X;
  цветСтроки-                = 3FX;
  цветОтметкиСтроки-         = 3BX;
  цветОтключённойСтроки-     = 38X;
  цветОтметкиСтрокиПамятки-  = 0FX;
  цветПредупреждения-        = 4FX;
  цветБуквицыПредупреждения- = 4EX;

ВИД
(*
   Доступ к двунаправленому набору-звену слеД+преД + полеД - двусвязного списка
*)
  Доступ- = ДОСТУП К Вид;                     (* Надел.Доступ <- Рамка.Доступ *)

  Задача = ЗАДАЧА(наделД:Надел.Доступ;
                посылка+:Ввод.нПосылка); (* опорный вид набора - предстоит уточнение тек.вида *)
(*
   набор-звено слеД+преД + полеД - двусвязного списка
*)
                     Вид- =                   (* Надел.Вид    <- Рамка.Вид    *)
  НАБОР (Рамка.Вид) 
    слеД-       :Надел.Доступ;       (* следующий  надел на поле  *)
    преД-       :Надел.Доступ;       (* предыдущий надел на поле  *)

    Приём-      :Задача;             (* приём и обработка посылок - локальная *)

    признаки-   :МНОЖ;               (* признаки (множество из пр...)    *)
    состояние+  :ЦЕЛ;                (* текущее состояние (одно из с...) *)
    полеД+      :Рамка.Доступ;       (* поле, содержащее надел *)
    цветНадписи+:ЦЕПЬ[Состояний];    (* цвет надписи в определённом состоянии *)
    цветБуквицы+:ЦЕПЬ[Состояний];    (* цвет буквицы в определённом состоянии *)
  КОН;

  РядНадпись- = ЦЕПЬ[64];                 (* перед буквицей ставится знак "~" *)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                           (*(Надел.Вид)*)
       Очистить-(наделД:Надел.Доступ);
(*
 * Заполняет <наделД> пробелом с цветом надписи текущего состояния
 *)
УКАЗ
  Окно.ЦветнойПробел(наделД.вс,
                     наделД.лк,
                     наделД.нс,
                     наделД.пк,
                     наделД.цветНадписи[наделД.состояние]
                    )
КОН Очистить;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                           (*(Надел.Вид)*)
       ВыводНадписи-(наделД  :Надел.Доступ;
                     надпись-:Надел.РядНадпись; с:ЦЕЛ);
(*
 * Цель:  отобразить надпись на заданной строке надела
 * До:    <наделД>   - данный надел
 *        <надпись>  - цепочка отображаемых знаков
 *        <с>        - строка надела, на которую необходимо вывести надпись
 *)
ПЕР
  рЦветнаяСтрока:ЦвЗнак.РядСтрока;                (* = РЯД 800 ИЗ ЦвЗнак.Вид; *)
     к,
  цПоз,
  цПко        :ЦЕЛ;

  былЗнак,
     знак     :ЗНАК;
  цветНадписи,
  цветБуквицы,                   (* буквица - это горячая буква в пункте меню *)
  цвет        :ЗНАК;
УКАЗ
                                                    (* определим цвета *)
  цветНадписи:=наделД.цветНадписи[наделД.состояние];
  цветБуквицы:=наделД.цветБуквицы[наделД.состояние];
                                                    (* начальные значения *)
  к:= -1;

  цПко:=наделД.пк - наделД.лк;

  цПоз:=0;

  былЗнак:=0X;

  КОЛЬЦО
    ЕСЛИ 
          цПоз >= РАЗМЕР(надпись)
    ТО
      ВЫХОД
    КОН;
          знак:=надпись[цПоз];
    ЕСЛИ
         (знак = 0X) ИЛИ (к > цПко)
    ТО
      ВЫХОД
    КОН;
    ЕСЛИ
         (былЗнак = "~") И оЗнака.БукваЦифра(знак)
    ТО
      цвет:=цветБуквицы
    ИНАЧЕ  
      цвет:=цветНадписи;
      УВЕЛИЧИТЬ(к)
    КОН;
    ЦвЗнак.ИзЗнакаИЦвета(знак,цвет,рЦветнаяСтрока[к]);
    былЗнак:=знак;
    УВЕЛИЧИТЬ(цПоз)
  КОН;
  Окно.ПисатьСтроку(рЦветнаяСтрока,наделД.вс+с,
                                   наделД.лк,
                                   к+1)
КОН ВыводНадписи;

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

         СПИСАТЬ(цепь,надпись);

  ОТ цПоз:=0 ДО ДЛИНА(надпись)-1 ВЫП

            знак:=надпись[цПоз];
    ЕСЛИ
         былЗнак = "~"
    ТО
      ЕСЛИ
           оЗнака.БукваЦифра(знак)
      ТО
        УМЕНЬШИТЬ(длина);
        буква:=знак
      КОН
    КОН;
    УВЕЛИЧИТЬ(длина);
    былЗнак:=знак
  КОН;
  буквица:=ОС.ВинЗнакВКодКлавиши(буква)
КОН СчитатьНадпись;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                           (*(Надел.Вид)*)
       ДобавитьВКонец-(наделыД+,
                       наделД  :Надел.Доступ);
                   (* <наделД> в конец двусвязанного списка <наделыД> *)
ПЕР
  слеД,
  преД:Надел.Доступ;
УКАЗ
(*
   нового звена не создаём, а используем локальные переменные  слеД, преД

*)
  ЕСЛИ                     (* связка ещё пуста (список 'наделы' пуст) *)
       наделыД = ПУСТО
  ТО                       (* наделД - будет 1-м звеном списка 'наделы' *)
    наделД.слеД:=наделД;
    наделД.преД:=наделД;

            наделыД:=наделД
  ИНАЧЕ                    (* присоединение наделД как следующего за звеном 'наделы', т.е. в конце списка *)
      слеД:=наделыД;
      преД:=слеД.преД;

      преД.слеД:=наделД;
      слеД.преД:=наделД;

    наделД.преД:=преД;
    наделД.слеД:=слеД
  КОН
КОН ДобавитьВКонец;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                           (*(Надел.Вид)*)
       Подготовить-(наделД:Надел.Доступ;
                    верх,лево,строк,колонок:ЦЕЛ;
                    признаки:МНОЖ;
                    Приём:Задача                                 (* локальная *)
                   );
УКАЗ
  Рамка.Подготовить(наделД,верх,лево,строк,колонок);

  наделД.признаки:=признаки;

  наделД.Приём:=Приём;

  наделД.цветНадписи[Надел.состОбычный] :=Надел.цветОбычный;
  наделД.цветБуквицы[Надел.состОбычный] :=Надел.цветБуквицы;
  наделД.цветНадписи[Надел.состВыбран]  :=Надел.цветОбычный;
  наделД.цветБуквицы[Надел.состВыбран]  :=Надел.цветБуквицы;
  наделД.цветНадписи[Надел.состОтключён]:=Надел.цветОтключённый;
  наделД.цветБуквицы[Надел.состОтключён]:=Надел.цветОтключённый
КОН Подготовить;
                              
КОН Надел.
