Розділ 3. Створення пунктів меню

Для створення додатка вам слід повідомити RKWard про нього. Отже, першим, що слід зробити, є створення файла .pluginmap (або внесення змін до наявного файла). Форматом .pluginmap є XML. Розгляньмо приклад (звичайно ж, вам слід подбати про те, щоб RKWard було налаштовано на завантаження вашого файла .pluginmap -- ПараметриНалаштувати RKWardДодатки):

Підказка

Після прочитання цієї глави зверніться до пакунка rkwarddev. У ньому реалізовано декілька функцій R для створення більшості теґів XML RKWard.

<!DOCTYPE rkpluginmap>
        

Значення типу документа (doctype) насправді не обробляється, але для нього встановлюється значення "rkpluginmap".

<document base_prefix="" namespace="myplugins" id="mypluginmap">
        

Атрибутом base_prefix можна скористатися, якщо усі ваші додатки зберігаються у одному каталозі. Загалом, тоді ви можете не вказувати каталог у назвах файлів, визначених нижче. Можна залишити для цього атрибута значення "".

Як ви побачите далі, усі додатки мають власні унікальні ідентифікатори, id. Параметр namespace призначено для упорядковування таких ідентифікаторів з метою запобігання випадковому дублюванню ідентифікаторів. На внутрішньому рівні значення namespace і «::» дописуються перед усіма ідентифікаторами, які ви визначаєте у цім .pluginmap. Загалом, якщо ви маєте намір поширювати ваші додатки як пакунок R, вам варто скористатися для значення параметра namespace назвою вашого пакунка. Додатки, які постачаються разом із офіційним дистрибутивом RKWard мають значення параметра namespace="rkward".

Атрибут id є необов’язковим, але визначення ідентифікатора для вашого .pluginmap уможливлює для інших програмістів автоматичне завантаження у їхніх .pluginmap вашого .pluginmap (див. розділ щодо залежностей).

<components>
        

Компоненти? Ми ж, начеб-то, говорили про додатки? Так, але у майбутньому, додатки будуть нічим іншим, ніж особливим класом компонентів. Тому усе, що ми тут робимо, є реєстрацією усіх компонентів або додатків у RKWard. Розгляньмо приклад запису:

<component type="standard" id="t_test_two_vars" file="t_test_two_vars.xml" label="Two Variable t-Test" />
        

Спочатку, атрибут type: поки що залишимо для нього значення "standard". Інші типи ще не реалізовано. Про id ми вже писали вище. Кожному компоненту має бути надано унікальний (у його просторі назв) ідентифікатор. Виберемо простий для розпізнавання. Не варто використовувати пробіли або символи, які не належать до типової латинської абетки. Використання таких символів не заборонено, але вони можуть мати якесь спеціальне призначення. За допомогою атрибута file ви вказуєте, де зберігається опис самого додатка. Адресу файла слід вказувати відносно каталогу, у якому зберігається файл .pluginmap та base_prefix, вказаного вище. Нарешті, надамо компоненту мітку. Цю мітку буде показано у меню (або у інших місцях інтерфейсу у майбутніх версіях).

Типово у файлі .pluginmap міститься декілька компонентів, отже, ось іще декілька компонентів:

<component type="standard" id="unimplemented_test" file="means/unimplemented.xml" />
                <component type="standard" id="fictional_t_test" file="means/ttests/fictional.xml" label="This is a fictional t-test" />
                <component type="standard" id="descriptive" file="descriptive.xml" label="Descriptive Statistics" />
                <component type="standard" id="corr_matrix" file="corr_matrix.xml" label="Correlation Matrix" />
                <component type="standard" id="simple_anova" file="simple_anova.xml" label="Simple Anova" />
        </components>
        

Гаразд, на першому кроці ми повідомили RKWard, що такі додатки існують. Як же тепер їх викликати? Слід розмістити відповідні пункти у ієрархії меню:

<hierarchy>
                <menu id="analysis" label="Analysis">
        

Одразу після теґу <hierarchy> ви маєте почати опис того, у якому <menu> буде ваш пункт додатка. У наведеному вище рядку ви повідомляєте, що пункт додатка має бути розташовано у меню Analysis (не обов’язково у основному списку пунктів, можливо, у підменю). Меню Analysis є стандартним у RKWard, отже його не потрібно буде створювати з нуля. Втім, якщо меню ще не існує, за допомогою атрибута label ви створите його і дасте йому назву. Нарешті, атрибут id ще раз ідентифікує це <menu>. Він потрібен для того, щоб декілька файлів .pluginmap могли розмістити пункти додатків у одному меню. Програма виконує упорядковування меню, шукаючи <menu> з вказаним id. Якщо меню з таким ідентифікатором ще не існує, програма створює нове меню. Якщо ж меню з таким ідентифікатором буде знайдено, пункт додатка буде додано саме до нього.

<menu id="means" label="Means">
        

В основному, те саме: тепер ми визначаємо підменю у меню Analysis. Воно називатиметься Means.

<menu id="ttests" label="t-Tests">
        

І остаточний рівень ієрархії меню: підменю меню Means.

<entry component="t_test_two_vars" />
        

Тепер, нарешті, меню, у якому ми хочемо розташувати наш пункт додатка. Теґ <entry> повідомить програмі, що це, нарешті, сам пункт, а не ще одне підменю. Атрибут component посилається на id, який ми надали додатку або компоненту вище.

<entry component="fictional_t_test" />
                                </menu>
                                <entry component="fictional_t_test" />
                        </menu>
                        <menu id="frequency" label="Frequency" index="2"/>
        

Якщо ви ще не зрозуміли, це ще одне підменю меню Analysis. Див. наведений нижче знімок вікна. Ми пропустили частину, яку не видно, позначивши її [...].

[...]
                        </menu>
                        <entry component="corr_matrix"/>
                        <entry component="descriptive"/>
                        <entry component="simple_anova"/>
                </menu>
        

Це завершальні пункти, які видно на наведеному нижче знімку вікна.

<menu id="plots" label="Plots">
                        [...]
                </menu>
        

Звичайно ж, ви можете розташувати ваші додатки у меню, відмінних від меню Analysis.

<menu id="file" label="File">
                        [...]
                </menu>
        

Навіть у стандартних меню, зокрема File. Вам лише треба вказати відповідне значення id.

</hierarchy>        
</document>
        

Ось як це робиться. І знімок вікна, на якому показано результат:

Ієрархія меню, створена за допомогою наведеного вище коду

Незрозуміло? Найпростіше буде розпочати з файлів .pluginmap, які постачаються разом із RKWard, вносячи в них потрібні вам виправлення. Крім того, якщо вам потрібна допомога, не вагайтеся і пишіть до списку листування розробників.

Керування порядком пунктів меню

Типово, усі пункти (записи або підменю) у меню буде автоматично упорядковано за абеткою. У деяких випадках варто втрутитися у цей процес. Якщо це так, ви можете згрупувати елементи у такий спосіб:

  • Таким чином, ви можете визначити групи у будь-якому меню. Усі елементи, що належать одній групі буде згруповано:

    <group id="somegroup"/>
                                    
  • Якщо ви хочете візуально відокремити групу від інших пунктів, скористайтеся такою синтаксичною конструкцією:

    <group id="somegroup" separated="true"/>
                                    
  • Пункти, меню та групи можна додати до певної групи, ось так:

    <entry component="..." group="somegroup"/>
                                    
  • Фактично, можна визначити групи (без ліній-роздільників) неявно:

    <entry component="first" group="a"/>
                    <entry component="third"/>
                    <entry component="second" group="a"/>
                                    
  • Назви груп є специфічними для кожного меню. Наприклад, група «a» у меню «Data» не конфліктує з групою «a» у меню «Analysis».

  • Найпоширенішим випадком визначення груп є пункти на початку і наприкінці меню. Для таких пунктів передбачено групи «top» (верх) і «bottom» (низ) у кожному меню.

  • Записи у межах кожної з груп упорядковуються за абеткою. Групи упорядковуються за порядком оголошення (якщо їх, звичайно ж, не дописано до іншої групи).

  • Меню і пункти без визначеної групи, логічно, також утворюють групу окрему групу ("").