********************************** Архитектура клиентского приложения ********************************** Общий обзор =========== .. image:: images/top-class-view.png .. note:: Оригинальный файл с диаграммами классов(проект Enterprise Architect) лежит в репозитарии /m3_designer/doc/m3-ide.eap M3Designer.UrlMap ================= Контейнер для серверных адресов, необходим для работы(если какой-то из адресов не задан - будут выкидываться ошибки). Поэтому нужно сконфигурировать адреса таким образом(в отдельном js файле или в самой html страниче - главное до запросов на сервер):: M3Designer.UrlMap.addUrls({ 'save-file-content':'/designer/file-content/save', 'get-file-content':'/designer/file-content', 'get-template-global':'/designer/project-global-template', 'manipulation':'/designer/project-manipulation', 'data':'/designer/data', 'save':'/designer/save', 'preview':'/designer/preview', 'upload-code':'/designer/upload-code', 'code-assist':'/designer/codeassist', 'create-autogen-function' : 'create-autogen-function', 'create-function': '/create-function', 'create-new-class': '/create-new-class', 'project-files': '/project-files' }); M3Desginer.ide ============== .. image:: images/M3Designer.ide.png Код в этом пространстве имен рисует дерево структуры проекта, панель с вкладками, обрабатывает данные с сервера, и производит все манипуляции с проектом. Основные классы: **ProjectExplorer** - наследник экстового дерева. Отображает структуру проекта. **Controller** - контроллер приложения. Фактически, точка входа. В качестве параметров конструктора принимает интерфейсные объекты (дерево проекта, табпанель), на события которых начинает реагировать. **ComnmandDispatcher** - диспетчер комманд. Вся логика работы над проектом описывается с помощью классов комманд. Более подробно можно посмотреть в комментариях в файлах /ide/controller.js и /ide/commands.js. Именно там нужно смотреть, если требуется добавить в IDE часть дизайнера новый функционал. Обратное взаимодействие с интерфейсом осуществляется через обращения к экземпляру контроллера. **CommandsConfig** - настройка соответствия типов вершин в структуре проекта и возможных действий над ними. **Requests** - запросы к серверу плюс часть логики работы. Это устаревший код, и должен быть исправлен(логика должна быть перенесена в комманды) .. note:: Логика работы со структурой проекта основывается на типах вершин. Когда с сервера передаются данные, у каждой вершины указывается атрибут type, например "type":"file" UI Designer =========== Общая диаграмма классов .. image:: images/ui-designer.png Общая концепция строения это MVC. Модель представляет собой дерево с вершинами. Контроллер - объект реагирующий на пользовательские события и обновляющий модель. Представления - два класса, что синхронизированы с моделью. Под синхронизацией понимается обработка событий обновления модели(добавление, удаление, измнение узлов дерева) **Важно:** Контроллер не обновляет экранное представление. Экранное представление обновляется само по себе при изменениях модели. Структура поведения подсистемы: .. image:: images/control-flow.png Описание основных классов, подробнее - смотреть комментарии в коде: **AppController** - контроллер обрабатывающий действия пользователя **FormModel и ComponentModel** - древовидная модель и ее узлы **ModelTypeLibrary** - содержит "бизнесс" логику по работе с моделями **BaseView** - базовый класс представления, синхронизирующийся с моделью **ComponentView** - структура формы - отображает модель в TreePanel на экране **DesignView** - визуальный просмотр модели на экране. Принцип перерисовки заключается в очистке содержимого экстовой панели и пересоздание JavaScript компонентов **ModelUIPresentationBuilder** - отвечает за формирование конфигов ExtJS из объектов модели, для работы DesignView **PropertyEditorManager** - управляет редактированием моделей. Фактически это тоже контроллер, что создает окна и гриды для редактирования, и потом обновляет модель **QuickPropertyWindow** - окошко быстрого редактирования **PropertyWindow** - окошко обычного редактирования **InlinePropertyGrid** - грид редактирования модели, встраиваемый в аккардеон панель **ModelTransfer** - класс для сериализации и десериализации модели в транспортный JSON **ServerStorage** - взаимодействие с сервером .. note:: Более подробно о свойствах модели можно прочитать в соответсвующем разделе справки :ref:`components` Code editor =========== Наиболее очевидный блок системы **ExtendedCodeEditor** - Экстовая панель с CodeMirror редактором **CodeAssistPlugin** - Плагин в терминах ExtJS. Присоединяется к панели ExtendedCodeEditor, слущает нажатие клавиш с клавиатуры, передает на сервер текущий файл в текущем состоянии(целиком) и положение курсора. Если сервер возвращает предложения о дополнении кода, создает меню с дополнениями **CompletionMenu** - меню дополнений **PyCodeWindow** - Legacy код. Окошко с эдитором питоновского кода, используется для предпросмотра кода генерируемого UI-Designer'ом.