Copyright (c) Prolog Development Center SPb

AppFrame CookBook

Встроенные функции

Язык приложения

AppFrame включает механизм выбора языка пользовательского интерфейса.
Выбор рабочего языка из панели управления производится с помощью динамически формируемого меню.
Меню активизируется вызовом предиката  команды languageList_Menu() объекта fe_Command.
Для формирования списка поддерживаемых языков в xml-конфигурации приложения  узел language должен содержать список как показано ниже

      <language ...>
        <support flag="ru" id="rus" title="Russian" />
        <support flag="us" id="eng" title="English" />
        <support flag="dk" id="dk" title="Danish" />
      </language>

Аттрибут flag определяет флаг какой страны  должен быть ассоциирован с этим языком. Аттрибут выбирается на основании суффикса имени иконки флага из директории 
Bin\febeAppData\pdcVipIcons\flags. Например, имя флага государства Азорские острова представлено как flag_azores.ico, соответственно, имя флага в файле конфигурации должно быть указано как flag="azores".
Аттрибут title определяет какой строкой язык будет представлен в меню, если не применяется словарь.
Аттрибут id определяет идентификатор, по которому будет определяться окончательный выбор языка.
Фактический идентификатор команды активизации языка имеет строковую структуру вида  
"ribbon.menu.language.cmd.<id>", где <id> означает id, указанный в списке языков файла конфигурации.
Соответственно, идентификатор для
tooltip будет иметь вид  "ribbon.menu.language.cmd.<id>.tooltip", а идентификатор для menuLabel будет иметь вид
"ribbon.menu.language.cmd.<id>.
menulabel".

Определение команды в файле xml-панели должно выглядеть, например, следующим образом (обязательные аттрибуты выделены)

        <menu
            cmdstyle="image-and-text-vertical"
            enabled="true"
            function="language-list"
            id="ribbon.menu.language-list"
            label="Language"
            layout="render"
            style="popupmenu">
          <icon file="$(pdc-external)\_license-cc\categories\applications-education-language.ico" />
          <tooltip text="Change UI Language (Render)" />

При определении контекста для вызова команды, определенной в xml-панели должно быть указано
    ...       
    ContextObj:setMenuRender("language-list",fe_Command():languageList_Menu),
    ...

Что и связывает xml-панель c активизацией меню в объекте  fe_Command.

Если предусматривается применение словаря для меню команды выбора языка, то  должен быть активизирован словарь, определенный в файле
bin\febeAppData\ribbonLanguage_Dictionary.xml c namespace="language".

Директория  bin\febeAppData содержит файл xml-панели ribbonLanguageRender.xml, который может быть использован.

Все необходимые операции обмена данными между FrontEnd и BackEnd, переименования элементов пользовательского интерфейса ядра выполняются далее автоматически.
Для элементов пользовательского интерфейса, активных на момент изменения языка должны быть инициированы операции замены текстовых названий после выполнения операции загрузки словарей в объекте fe_CoreTasks

clauses
    setNewLanguage(NewLanguageID):-
        request(methodChain,fe_UpdateUILanguage_C, s(NewLanguageID)),
        fe_Dictionary():currentLanguage_P:=NewLanguageID,
    % change here text titles for user-defined active elements of the UI
        success().

или в объекте fe_Command

    defaultHandler(CommandID,_NameSpace,_RibbonCmdID):-
        string::hasPrefixIgnoreCase(CommandID,"ribbon.menu.language.cmd.",Language),
        fe_CoreTasks():setNewLanguage(Language),
    % change here text titles for user-defined active elements of the UI
        success().

Для работы механизма смены языков в файле конфигурации узел language должен иметь аттрибут  use-dictionary="yes".

Генерация словаря для xml-панели

Ядро AppFrame включает инструмент создания и модификации файла словаря для xml-панели.
Эту функцию выполняет класс  fe_CreateOrModifyRbnDictionary, который во FrontEnd создает диалог, отвечающий за выполнение задачи.
Вызов диалога  из объекта класса fe_CoreTasks
        fe_CreateOrModifyRbnDictionary::new(frontEnd_P):onCreateOrModifyRbnDictionary().

При вызове этого предиката FrontEnd обращается к BackEnd и получает список файлов xml-панелей и связанные с каждым из них словарем.

При этом появляется диалог как показано ниже




В выпадающем списке Ribbon Script FileName представлен набор xml-панелей, хранящихся в директории bin\<projectName>AppData в контексте BackEnd, а по кнопке Browse... можно выбрать файл из любой директории в контексте FrontEnd.
Поле Dictionary NameSpace представляет имя NameSpace, свазянное с файлом xml-панели (пусто, если не установлено).
Поле Dictionary FileName определяет относительное имя файла словаря (относительно директории Bin, пусто если не установлено).
Флаг Modify Source Script устанавливает, надо ли корректировать имя файлв словаря и nameSpace в файле xml-панели. Если флаг установлен, то содержимое файла панели корректируется.

Для построения начальных значений текстовых фраз используются  идентификаторы команд и меню и соответствующие текстовы фразы, которые представлены в  файле xml-панели.
Фразы генерируются для всех языков, поддержка которых предусмотрена в файле конфигурации. Для всех языков фраза генерируется та, которая указана в файле xml-панели (на базовом языке приложения). Пользователь затем должен вручную перевести фразы для соответствующего языка.

Одновременно в словаре генерируются фразы для manuLabel и tooltip.
Если текст xml-панели изменен, то при выполнении создания-модификации словаря создаются текстовые фразы только новых  элементов. Существующе фразы не изменяются.

Расширение панели управления

Ядро AppFrame включает инструмент расширения панели управления.

Для расширения панели вызывается предикат addExtension() объекта класса fe_CoreTasks.
Предикат addExtension() вызывает процесс обмена сообщениями между FrontEnd и BackEnd. В результате FrontEnd получает список файлов xml-панелей и вызывает диалог, приведенный ниже



После выбора имени файла xml-панели справа к действующей панели добавляется новый фрагмент панели.

Удаление фрагментов панели в текущей версии не предусматривается и может быть выполнено удалением подузлов <ext> в файле конфигурации приложения.

Конфигурация панели

Конфигурация панели изменяется вызовом редактора конфигурации панели.
Вызов редактора осуществляется предикатом designRibbonLayout() объекта класса fe_Comamnd.
Редактор конфигурации панели позволяет перемещать и удалять команды, создавать новые и удалять секции панели.
После закрытия редактора новая конфигурация панели сохраняется в файле конфигурации приложения.
При запуске приложения конфигурация панели восстанавливается до положения закрытия.
Восстановление конфигурации панели, включающей все расширения, осуществляется предикатом  
reloadRibbon() объекта класса fe_Command.