Программа-интерпретатор языка ACL -- vkACL.jar сделана в таком виде, что она способна работать в трех модификациях:
___ 0 - полный вариант, то есть среда разработки и проигрыватель всех готовых ACL программ
___ 1 - специальный вариант с окном под конкретную ACL программу
___ 2 - проигрыватель конкретной ACL программы без внешнего вида
Указание в какой модификации должна работать программа делается следующим образом. В тексте файла стартовой ACL программы [start.acl] в первой строке должны быть набраны 12 параметров, заканчивающихся символом вертикальной черты. Как раз 11-й параметр и должен иметь значение 0, 1 или 2 для разных модификаций (мод). Остальные параметры имеют смысл только для моды 0. Cодержание программы [start.acl], которая исходно находится внутри jar файла, должно быть написано в соответствии с правилами для каждой модификации.
При модe 0 там может вообще ничего не быть, кроме первой строки. А может быть произвольный код, который будет выполнен при запуске программы.
При моде 1 там должен быть весь код программы, который должен реагировать на значения переменной &. Код должен быть разбит на процедуры, которые вызываются по условию. В случае #case 100 должен быть записан код, который сработает в самом начале. Случаи #case 1, #case 2 и так далее должны соответствовать коду, который будет выполнен при клике на n-м разделе меню, считая слева направо. При этом дополнительно в файле person.aba должен быть набран код, который запускается при клике в меню Help на русском (#case 1) и английском (#case 2) языках. А в разделе меню Exit должен быть выход по команде #exit. Кроме того, в первых строках файла должен быть записан протокол для записи всех разделов меню окна. Об этом я напишу чуть позже. Протокол работает также и в моде 0, если он записан, там он добавляется к основным разделам меню.
При моде 2 код программы [start.acl] может быть произвольным, но необходимо предусмотреть выход из программы по команде #exit. В этом случае просто выполняется код из этого файла, сам интерпретатор никак себя не показывает. Если необходимо что-то показывать, то это должна делать ACL программа.
Удобство нового подхода в том, что ACL программы для вариантов (1) и (2) можно сначала разрабатывать в варианте (0), а потом уже ставить в те программы, где они реально будут использоваться. Варианты (1) и (2) удобны для сторонних пользователей, которые могут вообще не знать про язык программирования ACL. Они будут считать, что программа написана на языке Java. Поэтому сейчас удобно начинать разработку новой ACL программы в варианте интерпретатора (0), из которого легко и быстро можно получить любые варианты, в том числе спец-вариант и проигрыватель.
У меня существуют образцы готовых программ для спец-варианта и проигрывателя. Специальный вариант программы можно делать так, чтобы основное окно совсем не было видно, а меню отсутствовало. Например, если программа сразу начинает с окна диалога, который приклеен к основному окну. Поэтому иконка в статусной строке есть, но по ней открывается диалог, а не основное окно. Иногда основное окно полезно убрать в левый нижний угол экрана под статусную строку так, что его совсем не будет видно. Но проблема в том, что есть окна, которые явно ориентируются на позицию основного окна, например, менеджер файлов. И в этом варианте они плохо позиционируются.
Чтобы этого избежать можно оставить окно на экране в левой верхней позиции, но оно всегда будет закрыто окном диалога. Зато все другие зависимые окна также будут в левой верхней позиции. Такой вариант программы можно сделать основным для программ без меню, но с иконкой с статусной строке. А проигрыватель удобен только для программ, которые вообще не имеют внешнего вида, а просто читают одни файлы, что-то считают и записывают другие файлы. Делать образцы таких программ не очень удобно, так как они со временем будут устаревать. Разумно сделать программу, которая будет автоматически превращать моду (0) в моду (1) или (2).
Важно, что jar файл проигрывателя в любой моде может иметь произвольное имя, и список служебных файлов может быть любым. Для среды разработки это не актуально и можно переименованием не заниматься. Работа программы в виде среды разработки имеет некую специфику. При первом запуске программа вынимает из себя файл start.acl в папку программы. Затем она каждый раз перезаписывает в нем первую строку, и считывает из нее все праметры, кроме индекса модификации. При запуске программы индекс модификации все равно считывается из файла start.acl внутри файла vkACL.jar. А все другие параметры считываются из файла start.acl в папке программы.
Инструкция по записи файла [start.acl] для специального варианта
Про первую строку я уже написал. Далее по порядку:
2-я строка должна содержать заголовок программы, показываемый в исходном окне с меню
3-я строка содержит 6 полей, разделенных знаком "|". В этих полях должно быть определено 6 чисел: x,y,w,h,tw,th, где x,y -- сдвиг центра окна из центра экрана, w,h -- ширина и высота окна в пикселах экрана, tw,th -- ширина и высота окна терминала. Сдвиг можно задавать произвольно большим, при этом окно всегда располагается в соответствующем угле в пределах экрана.
4-я строка содержит одно число N - число устанавливаемых пользователем иконок меню. Можно задавать 0, тогда меню не будет и остальные строки не нужны.
5-я строка содержит имя первого меню и его мнемонический код, то есть номер клавиши, по которой меню вызывается с клавиатуры (через Alt). Таблица номеров клавиш прилагается вместе с программой.
6-я строка содержит список имен разделов первого меню, разделенных символом "|"
7-я строка содержит список имен-меток каждого раздела, разделенных символом "|". В отличие от первых имен, эти имена должны быть уникальными для всех разделов всех меню и ни разу не повторяться. Кроме того, имена "pppp" и "llll" зарезервированы и не могут быть использованы.
8-я строка содержит числа, разделенные пробелами, парами для каждого раздела меню. Первое число пары есть мнемонический код раздела, то есть номер клавиши по которой меню вызывается с клавиатуры (но теперь без Alt). Второе число пары есть код-ускоритель, то есть опять номер клавиши, по которой данный раздел меню вызывается с клавиатуры непосредственно (через Alt). Эти номера должны быть уникальными для каждого раздела из всех разделов и не повторяться.
Замечу, что число имен в строках 6 и 7 должны совпадать, а в строке 8 число чисел должно быть в 2 раза больше.
(9, 10, 11, 12) (13, 14, 15, 16) .... Последующие строки имеют такую же структуру как 5-8 и содержат такую же информацию для каждой последующей
иконки меню. Номера клавиш F1 и F2 для ускорителей зарезервированы и не могут использоваться. Внутрь jar-файла нужно поставить программу [start.acl] и файл фоновой картинки. В меню нужно предусмотреть выход по Exit и в соответствующей процедуре можно уничтожить некоторые файлы перед выходом из программы.
Надо иметь в виду, что в основной моде тоже можно добавить меню, но это делается несколько иначе. Об этом написано тут .
Коды клавиш клавиатуры для настройки меню проигрывателя Клавиши, которые предпочтительно использовать [0] = 48 [5] = 53 [A] = 65 [F] = 70 [K] = 75 [P] = 80 [U] = 85 [Z] = 90 [F5] = 116 [1] = 49 [6] = 54 [B] = 66 [G] = 71 [L] = 76 [Q] = 81 [V] = 86 [F1] = 112 [F6] = 117 [2] = 50 [7] = 55 [C] = 67 [H] = 72 [M] = 77 [R] = 82 [W] = 87 [F2] = 113 [F7] = 118 [3] = 51 [8] = 56 [D] = 68 [I] = 73 [N] = 78 [S] = 83 [X] = 88 [F3] = 114 [F8] = 119 [4] = 52 [9] = 57 [E] = 69 [J] = 74 [O] = 79 [T] = 84 [Y] = 89 [F4] = 115 [F9] = 120 Клавиши, которые лучше не использовать, но если очень надо, то можно [BackSp] = 8 [Tab] = 9 [Enter] = 10 [Shift] = 16 [Ctrl] = 17 [Alt] = 18 [CapsLock] = 20 [Esc] = 27 [Space] = 32 [PageUp] = 33 [PageDn] = 34 [End] = 35 [Home] = 36 [LeftArr] = 37 [UpArr] = 38 [RightArr] = 39 [DownArr] = 40 [,] = 44 [-] = 45 [.] = 46 [/] = 47 [;] = 59 [=] = 61 [[] = 91 []]=93 [\] = 92 [Insert] = 155 [Delete]=127