Trol Mobile Studio

Описание

Идея создания этой софтины зародилась когда я начинал разрабатывать ява-мидлеты для сотовых телефонов. Быстро выяснилось, что программирование на яве для мобильных платформ имеет свои особенности: во-первых, из соображений оптимизации мидлет должен состоять из минимально возможного количества классов, т.к. небольшое количество больших файлов классов после упаковки в jar-архив займут значительно меньше места, чем большое количество мелких файлов; во-вторых, и это свойственно в первую очередь разработке игр, возникает проблема портирования мидлетов под разные модели телефонов - существуют аппараты с разными разрешений экрана, с разным набором API-функций, со своими особенностями использования этих функций (например, это касается воспроизведения звука). В результате, получается, что с одной стороны имеется два-три крупных исходных java-файла с которыми не очень удобно иметь дело (из-за их большого размера), а единственным способом повторного использования кода является метод copy-paste (иначе, пришлось бы плодить множество классов). С другой стороны, для каждой портированной версии получается свой набор исходников, и при внесении изменений в логику игры приходилось вручную вносить их в каждую ветку, коих обычно было около десятка. Решение обоих проблем очевидно - использование препроцессора. Но поскольку авторы языка java не сочли нужным встраивать в него препроцессор, пришлось искать и прикручивать внешний, но ничего подходящего мне на тот момент найти не удалось, поэтому было решено написать свой препроцессор. К препроцессору также было решено сделать свою среду разработки, которая могла бы компилировать мидлеты нажатием одной кнопки. Существующие IDE для разработке на яве (Eclipse, NetBeans и проч.) не устраивали на тот момент своей тормознутостью, ресурсоемкостью и сложностью модификации. Так появилась первая версия MobileStudio.
Далее, по мере столкновения с другими ява (и не только ява) платформами - BlackBerry, Java-applet's для создания демок игр для сайтов, Win32/linux-демок и проч., возникла потребность настройки процесса компиляции и сборки приложения с использованием скриптов. Тогда в качестве скриптового движка был взят RemObjects Pascal Script, а в качестве основы для IDE - текстовый редактор с открытым исходным кодом Mystix построенный на основе компонента UniHighlighter, и представляющий собой многовкладочный редактор с возможностью настройки подсветки синтаксиса и сворачивания кода для разных типов файлов. В MobileStudio добавились понятия платформы (java-midlet, BlackBerry application, java-applet, java-application и проч.), в каждую платформу можно включить произвольное количество устройств (например, модели телефонов для платформ java-midlet и BlackBerry-application). Кроме того, была добавлена пакетная сборка приложений, позволяющая одной командой собрать приложение под любое количество указанных устройств. Задачей-максимум ставилось написание такой кроссплатформенной библиотеки, API которой позволял бы компилировать один и тот же исходник под разные платформы (java-midlet, java-applet, Windows/Linux application, Smartphone application). И хотя полностью эта задача решена не была, некоторая кроссплатформенность была достигнута и в число примеров включены демки, которые компилируются как под j2me-midlet, java-applet и java-application.
В итоге получилась достаточно гибкая и настраиваемая среда разработки, которая также была адаптирована под другие задачи, например, разработку контента для мобильных интернет-приложений, разработку под микроконтроллеры семейства Intel MCS51 и даже разработку статичных web-сайтов (препроцессинг html).
Вкраце о том, что было добавлено в редактор Mystix. Комбинации клавиш Alt+PgUp/PgDown позволяют быстро переключаться между закладок редактора. Комбинации Alt+1,2..9,0 позволяют переключаться между первыми 10 окнами. Если под курсором редактора находится имя файла, то комбинацией Ctrl+Enter можно открыть этот файл в отдельном окне или перейти к этому окну, если файл уже открыт. Можно создавать произвольные проекты в меню Файл->Создать по шаблону, новые шаблоны можно создавать там же. В меню "Инструменты" и "Помощь" можно добавлять пользовательские инструменты и файлы справки. В меню "Устройства" можно быстро открыть файлы конфигурации или скриптов. Если в эти файлы были внесены изменения, надо выбрать в этом меню "Переиннициализировать все", либо нажать Ctrl+R, либо перезапустить MobileStudio.
Как всем этим можно пользоваться.
Первоначальное назначение MobileStudio - создание оптимизированных мидлетов. Тут использовался следующий подход: приложение состоит из двух классов - MIDlet и Canvas, причем, последний также является Runnable и CommandListener. Мидлет (как правило, игра), состоит из экранов, каждый из которых имеет свой номер, экраны можно переключать функцией setScreen(index)
Меню Файл->Создать выбираем "Mobile Studio Project". Будет создан проект, в каталоге src будет несколько заголовочных файлов.
defines.h - файл конфигурации
draw.h - файл отрисовки экрана, содержит макрофункцию onPaint() с единственным аргументом - номером экрана. Код отрисовки экранов помещается внутри в блоке switch.
events.h - содержит обработчики событий (в первую очередь клавиатуры), в каждом обработчике также пишем switch по всем экранам.
run.h - мидлет имеет один фоновый поток, тут можно поместить его обработчик используя опять же switch по экранам.
vars.h - тут объявляются переменные проекта.
Созданный таким образом мидлет можно скомпилировать как собственно мидлет, как приложение для BlackBerry, как апплет или ява-приложение. В директории samples/canvas есть пара простых примеров таких приложений.
Также в меню Файл->Создать можно выбрать шаблон "Midlet", и получить заготовку для обычного мидлета, использующего MIDP GUI API с возможностью препроцессинга. Файлы .java, включенные в проект, обрабатываются "как" есть, а файлы .jpp предварительно обрабатываются препроцессором.
Для компиляции мидлетов, апплетов и приложений BlackBerry надо открыть файл конфигурации xml/path/java.xml и подправить там пути. Далее надо настроить эмуляторы устройств, под которые планируется запускать мидлет. Например, выбираем устройство "Abstract MIDP 2.0 J2ME Device" (SUN-овский эмулятор из WTK) и в файле xml/devices/j2me_midp2.xml правим пути к библиотекам (или копируем эти библиотеки в devices/sun/) и строку запуска эмулятора.
Еще одно назначение IDE - программирование для микроконтроллеров Intel MCS51. Меню Файл->Создать выбираем Intel 8051 Microcontroller Project, получаем заготовку для проекта на ассемблере. Для компиляции надо подправить файл конфигурации xml/path/8051.xml и указать там верный путь к компилятору и (необязательно) файл устройства xml/devices/AT89Cx051.xml, чтобы по F9 запускать эмулятор. В качестве устройства выбирается AT89Cx051.
Можно создавать простые java-приложения, в меню Файл->Создать выбираем "J2SE Java Application", в качестве устройства выбираем "J2SE Application (jar)". Пердварительно надо настроить пути в xml/path/java.xml и в файле устройства xml/devices/j2se_application.xml (вместо изменения последнего можно просто скопировать упомянутые там библиотеки JDK в каталог devices/sun/ MobileStudio).
Наконец, можно создавать web-сайты на чистом HTML с препроцессором, для размещения их на хостинге где отсутствуют php, asp и jsp. Для этого в меню Файл->Создать выбираем "Web site (HTML)" и создаем сайт с одной страницей. Остальные страницы включаем в файл конфигурации проекта, если страницы имеют расширение .phtml, то они будут обрабатываться препроцессором. Что-то настраивать для этого типа проекта не требуется.

Препроцессор

Препроцессор - первая утилита, ради которой собственно задумывалась MobileStudio. Направленный изначально на компиляцию j2me приложений, в последствии он оказался применим и для других целей. Язык препроцессора различает регистр символов, идентификаторы Abc и abc будут восприняты как разные.
Макроопределения и макрофункции

Директива #define name [=value] служит для создания макроопределения. Она определяет макрос с именем name и присваивает ему значение value. Если последнее не указано, будет определен «пустое макроопределение». Если макроопределение с таким именем уже существует, его значение будет изменено на указанное. Далее при обработке строк исходного файла препроцессор будет заменять встречающееся макроопределение на его значение

Директива #undefine name удаляет определение макроса с именем name.

Следующий код

  #macro  name(a, b, c)
     ...
     тело макрофункции
     ...
  #endmacro

определяет макрофункцию с именем name и тремя параметрами a, b и c. В дальнейшем, встретив это имя с таким же числом аргументов скобках, препроцессор выполнит его замену на код, указанный в теле функции. В теле функции можно ссылаться на аргументы a, b и c. Имеется перегрузка по количеству параметров. В теле функций можно вызывать другие макросы. Но использование вложенных макросов при вызове невозможно, код macro1(macro2()) работать не будет.

Директивы #defineblock begin и #defineblock end открывают и, соответственно, закрывают блок макрокода, содержимое которого не будет включаться в результирующий текст программы. В этом блоке, например, могут быть определения макроконстант, макрофункций и комментарии для них.

Работа с библиотечными файлами

Для простого включения заголовочного файла используется директива вида #include "file.h". Она вставляет все содержимое файла file.h в текст программы, начиная с текущей строки.

Директива вида #include<a\b\c> будет преобразована препроцессором в код подключения java-пакета import a.b.c

Директива вида #uselibrary "lib.jpl" включает в код программы макроопределения, макрофункции, процедуры и переменные, содержащиеся в библиотечном файле lib.jpl. При этом будут вставлены только те процедуры и переменные библиотеки, которые используются программой, т.е., на которые есть ссылка в коде.

Объявления функций и переменных библиотеки включаются в "скобки" маркерами #func #end и #var #end соответственно, как показано в примере ниже:


#var     // объявление переменной
	int var_name = var_value;
#end

#func	 // объявление функции
	String func_name(int iarg_1, String arg_2) {
		return (arg_1 + arg_2);
	}
#end
				
Директивы условной компиляции

Для включения или исключения некоторого кода в результирующий код используется блоки условной компиляции следующего вида


#ifdef DEFINE_NAME_1
	...
#endif
	
#ifnotdef DEFINE_NAME_2
	...
#elseif DEFINE_NAME_3
	...
#elseifnot DEFINE_NAME_4
	...
#else
	...
#endif
Работа с файлами изображений

Встроенные макрофункции imagewidth() и imageheight() получают в качестве своего единственного аргумента имя файла изображения (поддерживаются только формат png) и подставляют ширину и выстоу изображения соответственно.

Эти функции можно использовать как при определении макроконстанты, при этом двойные кавычки могут быть опущены, так и просто в любом месте программы.
#define SPRITE_WIDTH imagewidth("sprite.png")
#define SPRITE_HEIGHT imageheight(sprite.png)

Константы, процедуры и функции

Введены для удобства написания java кода, изначально предполагалось ввести некий метаязык, который будет транслироваться препроцессором как в Ява- так и в Си-код.

Ключевое слово cоnst для java-программ будет заменено конструкцией public [static] final. Причем, слово static будет вставлено только для главного класса файла, для его подклассов оно будет опущено (внутренние классы не могут иметь статических элементов поскольку они сами не могут быть статическими).

Аналогично слово vаr будет заменено на public [static],
funс -> public) [static] final
proс -> public [static] final void'

Списки

Список – это структура данных, представляющая собой коллекцию однотипных элементов (совокупностей макроопределений, идентификаторов и значений различных типов языка). Списки могут быть использованы, например, для работы со звуками, изображениями, элементами меню и строками локализованных ресурсов. Каждый элемент списка может состоять из нескольких элементов (их число назовем размером списка), причем, этот размер списка есть величина, неизменная для всех его элементов. Таким образом, список представляет собой некоторую прямоугольную матрицу элементов. Язык предпроцессора имеет средства, позволяющие работать со списками.

Объявление списка. Синтаксис объявления списка таков:


#list list_name
   item_1_1, item_1_2, ..., item_1_m
   item_2_1, item_2_2, ..., item_2_m
      ...
   item_n_1, item_n_2, ..., item_n_m
#endlist

здесь n – число элементов в списке, m – размер списка

Для получения числа элементов списка служит макрометод списка count().
Например, следующая конструкция будет заменена макро-предпроцессором на число элементов списка list_name:
list_name->(count)()

Аналогично макрометод size() возвращает размер списка.

Обращение к элементам списка осуществляется с помощью квадратных скобок так, как показано в следующем примере:
list_name[item][sub_item]

здесь

item – номер элемента (строки) списка (нумерация идет от нуля до count()-1),
sub_item – номер подэлемента (столбца, нумерация идет от нуля до size()-1),

Итерация в списках.

Для того чтобы последовательно выполнить некоторую операцию с каждым элементом списка служит директива #foreach. Синтаксис ее использования следующий:


#foreach listname(index, sub_item1, sub_item_2, ..., sub_item_n)
  //
  // внутри блока код, выполняемый над каждым элементом списка,
  //
  // index получит номер элемента,
  //
  // а параметры sub_itemN могут быть использованы для обращения к подэлементам списка
  //
#endforeach
	
Опции компиляции и сборки

Эти директивы позволяют добавлять и удалять файлы исходников и ресурсов к проекту непосредственно в процессе компиляции, изменять название и версию приложения а также его название и имя файла с путем. Данные директивы особенно актуальный при пакетной сборке.

Добавление и удаление ресурсных файлов

Директива

#make res +(-) ”filename.ext”

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

#make resourcespath "path"

Изменение имени файла приложения

Для указания/изменения имени файла приложения служит директива

#make outputfile ”filename”

Для определения/изменения директории, в которую будет записан файл(ы) скомпилированного приложения служит директива

#make outputdir ”path”

Директива #make appname ”name” позволяет изменить название приложения, а директива #make version version - его версию.

Прочее

Встроенная макрофункция toquote(str) подставляет значение своего аргумента в кавычках

#error "msg" выдает сообщение об ошибке во время обработки препроцессора

Стандартные макросы __DATЕ__, __TIME__, __FILE__, и __LINЕ__ заменяются на строку в двойных кавычках с текущей датой, временем, именем файла и строкой в нем соответственно.

Сценарии компиляции

Второй основой MobileStudio являются настраиваемые сценарии компиляции, позволяющие "заточить" ее под любые задачи. Эти сценарии пишутся на pascal-скрипте, и их примеры можно найти в подкаталоге [p]scripts[/p] MobileStudio. Ниже описаны специальные классы, процедуры и функции, предназначенные для сценариев.
Структуры данных

// информация об ошибке)
TSErrorRec = record
  filename: string;     // имя обрабатываемого файла
  line: Integer;        // номер строки в нем
  pos: Integer;         // позиция ошибки в строке
  msg: string;          // описание ошибки
end;
  
// описание ресурсного файла
TSResourceRec = record
  filename: string;     // имя файла
  included: Boolean;    // флаг того что этот флаг должен быть включен
end;

// запись в манифесте
TSManifestRec = record
  name: string;         // имя ключа
  value: string;        // значение
  target: Integer;      // тип манифеста: TSManifestJad или TSManifestMf
end;

// макроопределение
TSDefine = record
  name: string;     // имя ключа
  value: string;     // значение
end;
Классы
Класс TSProject служит для получения доступа к свойствам проекта, выбранной платформы и устройства. Скрипту компилятора доступен объект Project этого класса.

TSProject = class
  // ПЕРЕМЕННЫЕ
  name: string;                   // имя главного файла
  caption: string;                // название проекта
  outFile: string;                // имя файла результата компиляции 
                                  // с расширением и без пути
  outFilePath: string;            // путь для результирующего файла
    
  // пути к каталогам
  pathRoot: string;               // каталог проекта
  pathSources: string;            // каталог исходных файлов
  pathResources: string;          // каталог ресурсов
  pathBackup: string;             // каталог резервных копий
  pathBuild: string;              // каталог, куда сохранятся результаты компиляции
  pathPreprocessed: string;       // каталог, куда сохранятся файлы, 
                                  // обработанные препроцессором
  pathCompiled: string;           // каталог, куда сохранятся скомпилированные файлы
  pathPreverifed: string;         // каталог, куда сохранятся преверифицированные файлы
  pathObfuscated: string;         // каталог, куда сохранятся обфусцированные файлы
    
  // настройки компилятора
  compilerDebugInfo: Boolean;     // включать отладочную информацию
  compilerCompress: Boolean;      // сжимать результирующий файл
  compilerCbfuscation: Boolean;   // обфусцировать результирующий файл
  compilerOptimizationSize: string;// строка-название типа оптимизации при компиляции
    
  // манифесты java
  manifestIcon: string;           // путь к файлу иконки
  manifestVendor: string;         // имя производителя
  manifestVersion: string;        // версия мидлета
  manifestBuild: Integer;         // номер билда
  manifestDescription: string;    // описание
  manifestBuildAutoinc: Boolean;  // автоинкремент номера билда

  // платформа
  platformName: string;           // id платформы, для которой компилируется проект
  platformCaption: string;        // название платформы
  platformLang: string;           // язык программирования для платформы
    
  // устройство
  deviceName: string;             // id устройства, для которого компилируется проект
  deviceCaption: string;          // название устройства
  deviceScreenWidth: Integer;     // ширина экрана устройства
  deviceScreenHeight: Integer;    // высота экрана устройства
    
  // МЕТОДЫ
    
  function GetSourcesCount(): Integer;
  function GetSourceName(index : Integer): string;
  // получение числа исходных файлов и их полные имена
		
  function GetResourcesCount(): Integer;
  function GetResourceName(index : Integer): string;
  // получение числа ресурсных файлов и их полные имена
    
  function GetManifestRecCount(): Integer;
  function GetManifestRecord(index : Integer): TSManifestRec;
  // получение числа записей манифеста и их полные имена
    
  function GetDefinesCount(): Integer;
  function GetDefines(index : Integer): TSDefine;
  // получение числа и значений макроопределений для препроцессора
  // макроопределения могут быть переданы в командной строке, 
  //определены в конфигурации устройства и платформы
    
  function GetDefinesStr(): string;
  // возвращает список всех макроопределений в виде строки 
  // name1=value1;name2=value2;...
    
  function GetDefine(сonst name : string): string;
  function IsDefined(сonst name : string): Boolean;
  // получение значений макроопределений по имени и проверка того, 
  // что макрозначение было определено
    
  function GetLibrariesCount(): Integer;
  function GetLibrariesName(index : Integer): string;
  // получение путей к библиотечным файлам
  // пути к библиотекам указываются в файлах конфигурации устройств
  end;
Класс TSExecuter служит для выполнения консольных программ и получения результата и вывода stdout, stderr. Скрипту компилятора доступен объект Executer этого класса.

TSExecuter = class
  // ПЕРЕМЕННЫЕ
  output: TStringList;     // тут возвращает список строк stdout
  errors: TStringList;     // тут возвращает список строк stderr
  resultCode: Integer;     // тут будет сохранен код возврата после выполнения
   
  // МЕТОДЫ
  function ExecuteTA(сonst path, commandLine : string; timeOut : Integer): Boolean;
  // выполняет утилиту
  // path - путь к программе, commandLine - аргументы командной строки,
  // timeOut - таймаут в миллисекундах
  // возвращает true в случае успеха
	 
  function Execute(сonst commandLine : string): Boolean;
  function ExecuteDir(сonst dir, fileName, commandLine : string): Boolean;
  // выполнение без таймаута
end;
Класс препроцессора TSPreprocessor служит для препроцессорной обработки файлов и коллекций строк. Скрипту компилятора доступен объект Preprocessor этого класса.

TSPreprocessor = class
  // ПЕРЕМЕННЫЕ
  outputDirectory: string;   // каталог, куда будет сохранено собранное приложение
  outputFile: string;        // каталог, куда будет сохранено собранное приложение
  applicationName: string;   // название приложения
  applicationVersion: string;// версия приложения
  resourcesPath: string;     // путь к каталогу с файлами ресурсов
   
  // МЕТОДЫ
  procedure Define(сonst name, value : string);
  // определяет макроконстанту
	 
  procedure DefineList(сonst defines : string);;
  // определяет список макроопределений по строке вида 'DEFINE1;DEFINE2=val2;DEFINE3'
	 
  procedure Reset();
  // очищает все переменные объекта перед очередной операцией препроцессинга
	 
  function PreprocessFile(сonst sourceFileName, outputFileName : string): Boolean;
  // препроцессинг файла с сохранением результата. Возвращает true,
  // если не возникло ошибок
	 
  function PreprocessStrings(сonst source: TStringList; vаr 
             output : TStringList): Boolean;
  // препроцессит коллекцию строк сохраняя результат в виде коллекции. 
  // Возвращает true, если не возникло ошибок
	 
  function GetErrorsCount(): Integer;
  function GetErrors(index : Integer): TSErrorRec;
  // получение списка ошибок препроцессинга
	 
  function GetResourcesCount(): Integer;
  function GetErrors(index : Integer): TSResourceRec;
  // список файлов ресурсов, которые надо включить/исключить командами #make res+|- file
	 
  procedure UpdateProjectResources(prj : TSProject);
  // обновляет описание проекта после выполнения всех директив проепроцессора #make
   
  procedure SetIncludePaths(list : TStringList);
  procedure SetIncludePaths(list : TStringList);
  // задать списки директорий, в которых будут искаться заголовочные файлы 
  // и файлы библиотек
   
  function IsDefined(сonst name : string): Boolean;
  // возвращает true, если макрос с таким именем определен
  function GetDefine(сonst name : string): srting;
  // возвращает значение макроопределения
end;
Класс TSFileReader предназначен для чтения текстовых и двоичных файлов.

TSFileReader = class
  // ПЕРЕМЕННЫЕ
  status: Boolean;       // true, если не возникло ошибок
   
  // МЕТОДЫ
  constructor Create(сonst fileName : string);
  // открывает файл
   
  procedure Close();
  // закрыть файл
  function Readln(): string;
  // читает строку до тех пор, пока не встретится символ конца строки
   
  function ReadByte(): Integer;
  function ReadWord(): Integer;
  function ReadDword(): Integer;
  // читают беззнаковые целые: 1, 2, 4 байта
   
  function ReadShortInt(): Integer;
  function ReadLongInt(): Integer;
  // читает знаковые целые: 2 и 4 байта
	 
  function ReadString(sizeBytes : Integer): string;
  // читает pascal-строку вида [длина, данные]. 
  //sizeBytes указывает, сколько первых байт выделено на хранение длины
	 
  function Size(): Integer;
  // возвращает размер файла
	 
  function Pos(): Integer;
  // возвращает текущую позицию в файле
	 
  procedure Seek(pos : Integer);
  // перевод текущей позиции
end;
Класс TSFileWriter предназначен для записи текстовых и двоичных файлов.

TSFileWriter = class
  // ПЕРЕМЕННЫЕ
  status: Boolean;       // true, если не возникло ошибок
   
  // МЕТОДЫ
  constructor Create(сonst fileName : string);
  // создает файл
   
  procedure Close();
  // закрыть файл
  procedure Writeln(сonst str : string);
  // записывает строку и признак перехода к новой строке
   
  procedure Printf(сonst str : string; args: array of cоnst);
  // записывает строку (без end of line) с использованием FmtStr()
   
  procedure WriteByte(val : Integer);
  procedure WriteWord(val : Integer);
  procedure WriteDword(val : Integer);
  // записывают беззнаковые целые: 1, 2, 4 байта
   
  procedure WriteShortInt(val : ShortInt);
  procedure WriteLongInt(val : Integer);
  // записывает знаковые целые: 2 и 4 байта
   
  procedure WriteString(сonst str : string; sizeBytes: Integer);
  // записывает pascal-строку.
  // sizeBytes указывает, сколько байт выделено на хранение длины.
  // Байты длины сохраняются перед строкой
   
  function Size(): Integer;
  // возвращает размер файла
	 
  function Pos(): Integer;
  // возвращает текущую позицию в файле
	 
  procedure Seek(pos : Integer);
  // перевод текущей позиции
end;
Класс TSBase представляет базовые утилиты для взаимодействия со средой (IDE или консольный компилятор). Скрипту компилятора доступен объект Base этого класса.

TBase = class
  // МЕТОДЫ
  procedure Error(сonst msg, fileName : string; line, pos : Integer);
  // посылает сообщение об ошибке в IDE или консольному компилятору
	 
  procedure Warning(сonst msg, fileName : string; line, pos : Integer);
  // посылает сообщение о предупреждении в IDE или консольному компилятору
	 
  procedure Msg(сonst msg : string);
  // посылает информационное сообщение
	 
  procedure SetProgress(progress : Integer);
  // посылает сообщение о прогрессе компиляции в процентах. Обновляет индикатор IDE
	 
  procedure SetCurrentFile(сonst fileName : string);
  // определяет имя файла, который обрабатывается в данный момент. Выводится в окне IDE
	 
  function GetPath(сonst name : string): string;
  // получает путь по идентификатору переменной. 
  // Переменные объявляются в файлах /xml/paths/*.xml
end;
Процедуры и функции

Обработка строк


  function WordCount(сonst str, delims : string): Integer;
  // возвращает количество слов в строке str для разделителей delims
	
  function ExtractWord(сonst str : string; n: Integer; delims): Integer;
  // возвращает слово под номером n в строке str для разделителей delims  
  // (нумерация от 1)
	
  function WordPosition(сonst str : string; n: Integer; delims): Integer;
  // возвращает позицию вхождения слова номер n в строке str для разделителей delims 
  // (нумерация от 1)
	
  function ExtractFileName(сonst path : string): string;
  // возвращает имя файла с расширением и без пути
	
  function ExtractFileNameOnly(сonst path : string): string;
  // возвращает только имя файла без расширением и без пути
	
  function ExtractFileExt(сonst path : string): string;
  // возвращает расширение файла (без точки)
	
  function ExtractFileDir(сonst path : string): string;
  // возвращает путь к файлу (без последнего слэша)
	
  procedure VerifySlash(vаr path : string);
  // проверяет, что имя директории содержит в конце слеш, 
  // все слэши соответствуют текущей системе (windows/linux)
	
  function LowerCase(сonst path : string): string;
  // переводит строку в нижний регистр
	
  function UpperCase(сonst path : string): string;
  // переводит строку в верхний регистр
	
  function VerifyInt(сonst path : string): Boolean;
  // возвращает true, если аргумент является правильным 
  // строковым представлением целого

Работа с файлами и каталогами


  function VerifyDir(сonst path : string): Boolean;
  // проверяет существование указанного каталога и создает его, если надо
  // возвращает TRUE, если каталог существовал и FALSE, если он был создан
	
  function DeleteFile(сonst fileMask : string): Boolean;
  // удаляет файл/файлы по маске
  // возвращает TRUE, если был удален хоть один файл
	
  function CopyFile(сonst srcPath, destPath : string): Boolean;
  // копирует файл
  // возвращает TRUE в случае успешного выполнения операции
	
  function RenameFile(сonst srcPath, destPath : string): Boolean;
  // переименовывает файл
  // возвращает TRUE в случае успешного выполнения операции
	
  function GetFileSize(сonst path : string): Integer;
  // возвращает размер файла или -1, если файл не существует
	
  function SetCurrentDir(сonst path : string): Boolean;
  // задает текущую директорию
  // возвращает TRUE в случае успешного выполнения операции
	
  function GetCurrentDir(): string;
  // возвращает текущую директорию

Состав и настройка

В архив TRMS включены следующий директории и файлы:
Каталог Файл Описание
bin Исполняемые файлы MobileStudio и их ресурсы
ColorEditor.exe утилита выбора цвета и представления его формате Си/Pascal/Hex, с возможным автокопированием результата в буффер обмена
MobileStudio.exe файл запуска графической IDE
mscc.exe консольный компилятор (mobilestudio console compiler)
mstcc.exe утилита для создания проектов по шаблонам (mobilestudio template creater)
UniDesigner.exe графический дизайнер файлов подсветки синтаксиса из пакета UniHighlighter
UniManager.exe менеджер файлов подсветки из пакета UniHighlighter
rds.jar сервер ведения отчетов о работе отлаживаемых приложений. Слушает tcp-сокет и выводит во вкладках получаемые строки
rds.bat командный файл для запуска сервера отчетов отладки
msc.err ресурсы строковых сообщений препроцессора
help.ini файл настроек справочной системы IDE. Настраивает меню "Помощь"
tools.ini файл настроек инструментов IDE. Настраивает меню "Инструменты"
bin/images файлы рисунков для конструкторов по шаблонам, интсрументов и справки
bin/languages файлы локализации редактора Mystix
devices тут хранятся библиотеки устройств
include содержит заголовочные файлы, подключаемые директивой #include
lib содержит библиотечные файлы для препроцессора, подключаемые директивой #uselibrary
samples несколько примеров проектов
sсripts содержит pascal-скрипты компиляторов под различные платформы
blackberry_win32.pas компилятор приложений BlackBerry
j2me_win32.pas компилятор мидлетов j2me
j2se_win32.pas компилятор приложений и апплетов j2se
mc8051.pas компиялтор под микроконтроллеры серии MSC51
web_html_win32.pas компилятор для препроцессинга html-сайтов
tools содержит инструменты сторонних разработчиков
calc.* простой и удобный калькулятор программиста
pngout.exe утилита для уменьшения размеров png-файлов
tools/asem51 компилятор ассемблера для микроконтроллеров серии MSC51
tools/emul8051 эмулятор для микроконтроллеров серии MSC51
tools/jsim еще один эмулятор MSC51
xml содержит файлы конфигурации
xml/devices содержит файлы описания устройств
xml/highlighters описания подсветок редактора для разных типов файлов в формате UniHighlighter
xml/paths определения путей к используемым программам, библиотекам и заголовочным файлам
xml/platforms описания платформ для сборки. Платформа определяется набором макроконстант и скриптом компиляции
xml/system файлы описания синтаксиса и определения значений по умолчанию для всех остальных файлов конфигурации
xml/templates описания шаблонов для создания файлов и проектов
Файлы конфигурации. Настройки среды хранятся в каталоге xml и их содержимое чувствительно к регистру. В каталоге xml/system/ можно посмотреть описание всех типов файлов с комментариями и значения атрибутов по умолчанию.
Устройства
Файлы xml/devices/*.xml служат для описания устройств под которые можно скомпилировать проект. Устройство можно выбрать в соответствующем комбобоксе IDE справа в меню или указать его идентификатор консольному компилятору. Также идентификатор устройства указывается в списке для пакетной сборки. Корневым тегом в файле является тег Device, внутри него могут быть вложены теги defines, libs и run для определения макросов, путей к библиотекам и сценарий запуска скомпилированного приложения для этого устройства (например, запуск эмулятора).
Корневой элемент описания устройства - тег Device.
Атрибуты:
name - идентификатор устройства
caption - название устройства
platform - идентификатор платформы, к которой принадлежит устройство
screen_width - ширина экрана в пикселах
screen_height - высота экрана в пикселах

Вложеные теги:
defines
Содержит объявления макроопределений для устройства. Макроопределения перечислены в блоке в виде NAME=VALUE
libs
Содержит список файлов библиотек, которые будут использоваться при компиляции для этого устройства.
Если имя библиотеки начинается с '//', то путь отсчитывается относительно директории TRMS
run
Содержит сценарий запуска
Атрибуты:
system - определяет идентификатор операционной системы (win32/linux)
Внутри тега содержатся команды запуска приложения (или его эмулятора).
В командах можно использовать следующие параметры:
%FULLNAME% - полное имя файла скомпилированного приложения с путем
%FILEPATH% - полный путь к файлу (без завершающего слэша)
%FILENAME% - имя файла с расширением
%FILENAMEONLY% - имя файла без расширения

Пути и переменные
Файлы xml/paths/*.xml определяют пути к различным программам, утилитам и библиотекам которые используют скрипты компиляции. Для работы среды необходимо настроить эти переменные.

Корневой тег - Path, может содержать вложенные теги path, includes и libraries для определения путей к разным утилитам, заголовочным файлам и библиотекам соответственно. Внутри тега path каждый путь определяется тегом set.

Вложенные теги:
path
Определяет пути для компиляторов
Атрибуты:
system - определяет операционную систему (win32, linux)
Вложенный тег set определяет переменную
< set name= "name" value= "c:\java\jdk 1.6" >

includes и libraries
Определяет пути к файлам заголовков и библиотечным файлам
Атрибуты:
system - определяет операционную систему (win32, linux)

Если путь начинается с '//', то он будет отсчитываться относительно директории TRMS

Платформа
Файлы xml/platforms/*.xml определяют группу устройств, код для которых компилируется одним компилятором (например, j2me, j2se, blackberry, intel msc51 и т.д.)

Корневой тег - Platform содержит вложенные теги defines и compiler. Первый служит для определения макросов, которые будут переданы препроцессору на этой платформы, второй - для определения скрипта компиляции.

Тег Platform.
Атрибуты:
name - идентификатор платформы
caption - название платформы
lang - определяет язык программирования
Вложенные теги:
defines
Содержит объявления макроопределений для платформы. Макроопределения перечислены в стлоках тега в виде NAME=VALUE
compiler
Атрибуты:
system - определяет операционную систему (win32, linux)
script - имя файла скрипта компиляции для этой платформы и системы. Скрипт будет искаться в каталоге scripts

Шаблон проекта
MobileStudio позволяет описывать шаблоны по которым можно создавать набор заготовок файлов и каталогов для проекта (меню Файл->Создать) Для этих же целей есть консольная утилита mstcc.exe. В файлах xml/templates/*.xml описываются конфигурации шаблонов. Корневой тег Template может содержать теги file и dir для создания файлов и директорий.
Для категории "Projects" IDE будет создавть рабочее пространство первый файл шаблона для проектов должен быть главным файлом, по его имени определяется имя рабочего пространства. Также рабочее пространство будет создаваться для категории "Workspaces"

Тег Platform.
Атрибуты:
name - идентификатор проекта
description - описание шаблона
category - категория, к которой принадлежит проект
defaultdir - имя каталога, в который будет помещен созданный проект
Вложенные теги:
file
Добавляет файл к шаблону. Строки внутри этого тега будут сохранены в созданный файл,
а единственный атрибут name определяет имя создаваемого файла.
В имени файла и его строках можно использовать следующие параметры:
%FULLPROJECTFILE% - полное имя файла проекта (с путем)
%PROJECTFILE% - имя файла проекта (с расширением и без пути)
%FILENAME% - имя файла проекта (без расширения). Первая буква заглавная
%PACKAGENAME% - названи пакета (задумывалось для мидлетов). совпадает с %FILENAME%, только первая буква строчная
%PROJECTCAPTION% - название проекта
%PATH% - путь к проекту (со слэшем на конце)
%DATE% - текущая дата
%TIME% - текущее время
dir
Добавляет каталог к шаблону, атрибут name определяет имя создаваемого каталога.

Файл конфигурации проекта
При создании любого проекта MobileStudio создает файл конфигурации, который помещается в корневой директории пректа. Этот файл описывает свойства проекта проекта, список его исходных файлов и файлов ресурсов а также может содержать описание пакетов - групп устройств для которых проект может быть собран одной командой меню (Проект->Пакетная сборка) или опцией -P консольного компилятора mbcc.exe.

Корневой тег проекта - Project служит контейнером для остальных тегов: paths, compiler, manifest, sources, resources, defines, package.


Атрибуты корневого тега Project:
name - имя проекта
outfile - имя выходного файла (по умолчанию, может быть изменено в коде)
caption - название проекта для IDE
device - идентификатор устройства по умолчанию


Атрибуты тега описания путей paths:
sources - путь к исходным файлам
resources - путь к файлам ресурсов
backup - путь к каталогу, в который IDE будет помещать резервные копии файлов
build - путь к каталогу, в который будет помещено собранное приложение
preprocessed - путь к каталогу, в который будут помещаться файлы, полученные после препроцессинга
compiled - путь к какталогу, в который будут помещаться файлы, полученные после компиляции
preverifed - путь к каталогу, в который будут помещаться файлы классов после преверификации (для j2me)
obfuscated - путь к каталогу, в который будут помещаться файлы, обработанные оптимизатором
Пути могут начинаться с '\', тогда они будут отсчитываться от корневой директории проекта


Атрибуты тега настроек компилятора compiler:
debuginfo - определяет, будет ли включаться отладочная информация в созданное приложение
compress - определяет, будет ли сжиматься .jar файл java-приложений
obfuscate - определяет, будет ли оптимизироваться/обфусцироваться файл приложения
optimization - определяет тип оптимизации приложения: size|speed


Атрибуты тега манифеста приложения manifest:
icon - определяет файл иконки приложения
vendor - определяет производителя приложения
version - версия приложения вида major.minor или major.minor.build
build - номер сборки приложения
description - описание приложения
buildautoinc - если установлен, то значение билда будет инкрементироваться при каждой сборке
Внутри тега manifest можно размещать теги записей key:
name - название параметра
value - значение параметра
target - для j2me приложений определяет, в каких манифестах будет определен этот ключ (jad|manifest)


Тег sources содержит строки - имена исходных файлов проекта


Тег resources содержит строки - имена ресурсных файлов проекта


Тег defines содержит строки - объявления макроконстант препроцессора вида name[=value]


Тег package определяет конфигурацию пакетной сборки приложения для группы устройств. Единственный атрибут name определяет название пакета. Тег служит контейнером для тегов release, каждый из которых описывает сборку приложение под одно устройство.
Атрибуты тега release:
name - название релиза
device - имя устройства, под который будет собран релиз
description - описание релиза
Внутри тега можно помещать определение макросов препроцессора вида name[=value]

Рейтинг: 
0
Голосов еще нет