Набір інтерфейсів Open Tools API для C # Builder, Різне, Програмування, статті

Зміст



Анотація: за допомогою набору інтерфейсів Open Tools API (OTA) для C # Builder розробники можуть розширити функціональні можливості середовищ розробки (IDE), використовуючи будь-яку мову. NET. У цій статті розглядаються важливі особливості нової. NET OTA і пропонуються декілька практичних прикладів і рад.


Набір інтерфейсів Open Tools API (OTA) надає розробникам зручний засіб розширення і поліпшення функціональних можливостей середовища розробки C#Builder. Оскільки OTA для C # Builder практично нічим не відрізняється від аналогічних інтерфейсів, що поставляються до продуктів Delphi і C++Builder , Розробники, близько знайомі з цими інструментами, не повинні відчувати ніяких проблем при створенні розширень для C#Builder. Дана стаття знайомить досвідчених розробників з важливими змінами і доповненнями в новому. NET OTA, а також дає загальне уявлення про процес розробки та інтерфейсах для розробників, які спеціалізуються в новому OTA. Використовуваний в цій статті приклад коду можна завантажити з CodeCentral.


OTA міститься в наборі імен Borland.Studio.ToolsAPI в збірці (assembly) Borland.Studio.ToolsAPI.dll. C # Builder має базову документацію про вміст цієї збірки, але для її прямого перегляду можна використовувати Borland Reflection.exe або браузер .NET Reflector. При створенні додаткових збірок OTA необхідно додавати посилання в збірку Borland.Studio.ToolsAPI.dll, яка розташована в каталозі BDS1.0Bin.


“Hello World”


Оскільки кожному вступного розділу потрібно базовий приклад “Hello World”, використовуємо його для C # Builder. Пропоновані в цій статті приклади написані на мові C #, але для створення розширень OTA годиться будь мову. NET. Описуваний нижче клас реалізує інтерфейс IOTAMenuWizard, який є основним типом розширень IDE. Цей інтерфейс додає новий пункт в меню “Help” і може виконати відповідний код при виборі цього пункту. Створіть нову збірку. NET, послідовно вибравши File, New, Other, C # Projects, Class Library. Додайте нову посилання в збірку Borland.Studio.ToolsAPI.dll, вибравши Projects, Add Reference і клацнувши по кнопці Browse. Також додайте відповідне посилання в збірку System.Windows.Forms.dll, щоб відкрити доступ до класу MessageBox. Потім відредагуйте код класу, щоб він мав такий вигляд:






using System;
using Borland.Studio.ToolsAPI;
using System.Windows.Forms;

namespace ToolsAPI.Introduction
{
public class HelloWorldWizard : IOTAMenuWizard
{
public static void IDERegister()
{
IOTAWizardService wizServ = (IOTAWizardService)
BorlandIDE.GetService(typeof(IOTAWizardService));
wizServ.AddWizard(new HelloWorldWizard());
}
public string IDString { get { return “EB.HelloWizard”; } }
public void Execute() { MessageBox.Show(“Hello World!”); }
public string Name { get { return “Hello World Wizard”; } }
public void Destroyed() { /* nothing */ }
public string MenuText { get { return “Hello World Wizard”; } }
public bool Checked { get { return false; } }
public bool Enabled { get { return true; } }
}


Цей приклад ілюструє два основних типи інтерфейсів, які можна знайти в OTA. Крім них, IDE реалізує велику кількість інших інтерфейсів (включаючи всі інтерфейси, в іменах яких фігурують “Service” або “Manager”). Одним з таких інтерфейсів є IOTAWizardService, який дозволяє додавати і видаляти експертів (термін OTA для “рідних” розширень) в середовищі IDE. Інший важливий тип інтерфейсів – це той, який розробник повинен реалізувати, щоб забезпечити взаємодію IDE з його кодом. Наприклад, для додавання нового пункту меню за допомогою інтерфейсу IOTAMenuWizard слід вказати IDE текст цього пункту, чи буде цей пункт доступний, унікальний ідентифікатор використовуваного експерта і т.п.


Після компіляції збірку необхідно завантажити в IDE, для цього слід додати рядок нового входу в папку системного реєстру:


HKCUSoftwareBorlandBDS1.0Known IDE Assemblies


Ім’я входу (Name) має містити повний шлях і ім’я файлу компільованою збірки dll. Рядок даних входу (Data) може бути довільною, але для завантаження збірки в IDE вона повинна містити значення:


C:OTAIntroOTAIntro.dll = OTAIntro


Після того, як зазначений вхід буде додано до реєстру, IDE автоматично завантажить збірку під час запуску. Крім того, IDE спробує визначити місцезнаходження функції “public static void” з ім’ям IDERegister. Якщо IDE знайде такий метод, то він буде виконаний і вкаже місце, де слід ініціалізувати і реєструвати розширення. Після завантаження збірки в меню “Help” з’явиться новий пункт.


Сервісні інтерфейси IDE


Функція IDERegister відображає універсальний, зручний для розробників шаблон:






IOTAWizardService wizServ = (IOTAWizardService)
BorlandIDE.GetService(typeof(IOTAWizardService));

Більшість сервісних інтерфейсів IDE можна отримати за допомогою методу GetService для класу BorlandIDE. При наявності запитуваної інтерфейсу він викличе його в будь-якому випадку. Зауважимо, що використання GetService для цієї мети необхідно, оскільки оператор “as”, що забезпечує приведення BorlandIDE до типу спеціального інтерфейсу в попередніх версіях IDE, більше не підтримується. У наступній таблиці наведені деякі інтерфейси, що викликаються за допомогою BorlandIDE.GetService.
















































































Інтерфейс Новий для. NET? Призначення
IOTAAboutBoxService Та Виводить інформацію про продукт в інформаційному вікні “About” в IDE (розглядається далі).
IOTAActionService Немає Відкриває, закриває, зберігає і завантажує файли та проекти.
IOTAAddInService Немає Завантажує в IDE нові додаткові збірки.
IOTAAddReferenceDialog Та Відображає діалогове вікно “Add Reference” для поточного проекту.
IOTAAssemblySearchPathService Та Перераховує, додає і видаляє пункти із шляхів пошуку збірок.
IOTAAssemblyUnloadedService Та Визначає час вивантаження зборок з IDE.
IOTABitmapService Та Завантажує растрове зображення з ресурсу Windows в виконуваний файл.
IOTAComponentInstallService Та Перераховує, додає і видаляє компоненти з панелі інструментів.
IOTADotNetObjectInspectorService Та Дозволяє довільно вибирати об’єкти. NET і відображати їх властивості в інспекторі об’єктів IDE Object Inspector.
IOTAGalleryCategoryManager Та Перераховує, додає і видаляє категорії галереї. Категоріями галереї є вузли дерева в діалогових вікнах File, New і Other (Repository).
IOTAIdleNotifier Та Отримує повідомлення про те, що IDE знаходиться в стані очікування.
IOTAMainMenuService Та Послідовно перебирає, додає, видаляє і виконує основні пункти меню.
IOTAMessageService Немає Додає або видаляє повідомлення та групи повідомлень з вікна повідомлень “Message View”.
IOTAModuleServices Немає Отримує посилання на поточну групу проектів, проект, групу файлів (модуль). Відкриває, закриває і створює нові модулі.
IOTAPersistenceManager Забезпечує оперативний доступ до документа XML, який містить для користувача настройки і настройки за замовчуванням для середовища розробки (ApplicationSettings.xml).
IOTAService Немає Надає загальну інформацію про інсталяційному каталозі IDE, інтерфейсі параметрів середовища та місцезнаходження налаштувань IDE в реєстрі і на диску. Крім того, повідомляє про події компіляції, відкриття та закриття файлів, установці / видаленні пакетів.
IOTASplashScreenService Виводить інформацію про продукт на екран-заставку IDE.
IOTAWizardService Немає Додає або видаляє експертів з IDE. Експертами можуть бути “рідні” розширення, експерти меню, елементи репозитарія і т.п.

Від нотіфікаторов до подій. NET


Попередні версії Borland IDE використовували інтерфейси нотифікації для підтримки зворотних викликів під час подій, що відбуваються в IDE. Новий OTA використовує для цієї мети події. NET. Це означає, що замість реєстрації нотіфікатора, здатного приймати всі 7 подій в старому інтерфейсі IOTAIDENotifier, тепер можна реєструвати прийом одиничного події, наприклад, зворотний виклик FileNotification. Наприклад, наступний фрагмент коду показує, як будуть прийматися зворотні виклики FileNotification при відкритті і закритті файлів і інших операцій з файлами:






public static void IDERegister()
{
IOTAService ideService = (IOTAService)
BorlandIDE.GetService(typeof(IOTAService));
ideService.FileNotification +=
new FileNotificationHandler(FileEvent);
}
private static void FileEvent(object sender, FileNotificationEventArgs args)
{
LogMessage(String.Format(“{0} notification for: {1}”,
args.NotifyCode, args.FileName));
}

“Додавання пункту в головне меню”


На відміну від IOTAMenuWizard, який завжди поміщає новий пункт меню в меню “Help”, інтерфейс IOTAMainMenuService допускає розширення, що дозволяють поміщати нові пункти меню в будь-якому місці головного меню і налаштовувати растрові зображення пунктів меню, гарячу клавішу (shortcut) і т.п. Приклад коду показує, як можна це зробити.






protected static void AddMainMenuItem(
{
((Bitmap)form.MenuItemBitmap.Image).MakeTransparent();

IOTAMainMenuService menuServ = OTAUtils.MainMenuService;
menuItem = menuServ.AddMenuItem(OTAUtils.IDEViewDebugItemName,
OTAMenuItemLocation.otamlBefore, MenuItemName, “OTA Intro Form”,
(Bitmap)form.MenuItemBitmap.Image).GetHbitmap());


menuItem.Executed += new EventHandler(MenuItemExecuted);


int shortcut = Convert.ToInt32(Keys.Z) / OTAUtils.Shift /
OTAUtils.Control / OTAUtils.Alt;
menuItem.Shortcut = shortcut;
OTAUtils.StartUpdatingMenuShortcut(menuItem, shortcut);
}


Оскільки для установки растрового зображення пункту меню інтерфейсам OTA потрібно значення Windows HBITMAP, ми повинні привести Image до типу Bitmap і передати результат GetHbitmap (). Метод Bitmap.MakeTransparent бере кутовий піксель растрового зображення і інтерпретує його колір як прозорий для всього зображення. У прикладі коду зображення пункту меню завантажується з компонента PictureBox на формі, але його можна завантажити з ресурсу за допомогою IOTABitmapService. Першим параметром в AddMenuItem є ім’я пункту меню, яке використовується для посилання на цей пункт. Новий пункт меню розміщується відповідно цим посиланням. Імена всіх існуючих пунктів меню IDE можна отримати, використовуючи метод IOTAMainMenuService.GetFirstMenuItem, або за допомогою інших методів послідовного перебору пунктів меню, таких як IOTAMenuItem.ChildMenuItem.


Кожен інтерфейс IOTAMenuItem може мати гарячу клавішу, однак не ясно, яке значення має бути передано для її установки. На перший погляд здається логічним, що тип цього значення має належати списком. NET Shortcut, але він не підтримує більшість гарячих клавіш, які підтримуються пунктами меню IDE. Замість цього, гарячу клавішу можна інтерпретувати як слово, в якому молодший байт є значенням віртуального коду клавіші в Windows, а старший байт кодує положення трьох клавіш перемикання регістра в трьох старших розрядах. Щоб згенерувати відповідне значення гарячої клавіші, можна використовувати оператор “or” в коді клавіші System.Windows.Forms.Keys разом з будь-яким модифікатором Shift, Control і Alt, визначених у OTAUtils. Оскільки. NET OTA поки ще не переглянула функціональні можливості прив’язки клавіш в попередніх версіях IDE, гаряча клавіша нового пункту меню може випадково загубитися під час завантаження або розвантаження пакетів або при повторній ініціалізації в IDE головного меню. Обійти цю проблему можна за допомогою двох службових методів StartUpdatingMenuShortcut і StopUpdatingMenuShortcut, що містяться в OTAUtils.cs. Цей прийом автоматично повертає гарячу клавішу пункту меню при завантаженні і вивантаженні пакетів. Після виконання наведеного вище коду вийде наступний результат.


Якщо один з обробників подій меню (menu event handlers) згенерує НЕ перехоплений виняток, то користувач може дізнатися про нього тільки за повідомленням “Exception has been thrown by the target of an invocation “(Виключення було згенеровано об’єктом виклику). Це відбувається тому, що внутрішній код IDE, звертаючись до об’єкта. NET, подає сигнали вибираємо пункт меню, а засіб виклику подій. NET, перехоплює. NET-виключення і повторно генерує їх із зазначеним вище сполученням. З цієї причини було б розумно згорнути обробники подій меню в блок try / catch, послати користувачеві повідомлення про реальному виключення і потім відповідним чином обробити це виняток.


Групи проектів, проекти, модулі, редактори та подання


При описі файлів IDE розробники нерідко плутаються в термінології OTA. Термін верхнього рівня – група проектів (. Bdsgroup), що представляє собою колекцію файлів проектів, таких як. Bdsproj. До складу проектів може входити будь-яку кількість модулів. Модуль складається з файлу або групи файлів і розглядається як одне ціле. Наприклад, модуль ASP.NET може містити два файли: html-шаблон з розширенням . Aspx і файл. Cs для реалізації додаткової обробки code-behind. У модуль можуть входити кілька інтерфейсів IOTAEditors, кожен з яких зазвичай відповідає одному фізичному файлу на диску. Серед них можуть бути як редактори IOTASourceEditors для вихідних текстових файлів, так і редактори інших типів. У свою чергу, редактори вихідного коду можуть включати один або кілька подань IOTAEditViews. Незважаючи на те, що C # Builder 1.0 не дозволяє створювати кілька подань для одного і того ж редактора вихідного коду, OTA надає інтерфейси, що дозволяють перебирати подання редактора, з тим розрахунком, що в наступній версії C # Builder ця функція з’явиться знову. Наведений в цій статті код показує, яким чином можна використовувати інтерфейс IOTAModuleServices для отримання поточної групи проектів, проекту, модуля, редактора і редактора вихідного коду. Слідуючи описаним вище інструкцій, встановіть збірку OTAIntro.dll, потім виберіть View і пункт меню OTA Intro Form. Клацніть по кнопці Refresh, щоб зібрати всі дані поточного модуля (див. наступну ілюстрацію).


Компоненти


У середовищі розробки C # Builder палітра компонентів замінена на багатоцільову інструментальну палітру Tool Palette. OTA дозволяє визначати категорії і компоненти, що містяться в Tool Palette, і додає їх у конструктори форм. Вкладка Components на формі прикладу коду не тільки відображає список категорій і компонентів в обраній категорії, але і дозволяє створювати компоненти з розширень OTA. На наступній ілюстрації відображений список компонентів із щойно створеним компонентом Button.


C # Builder IDE використовує конструктор. NET Designer, вбудований в. NET 1.1 SDK, що забезпечує документованість усіх його функціональних можливостей для інтерфейсу IdesignerHost і доступність пов’язаних з ним інтерфейсів. Інтерфейс IdesignerHost можна отримати, викликавши метод IOTADotNetModule.DesignerHost. IDesignerHost дозволяє створювати транзакції елементарних / відміняються модифікацій і реалізувати більшість інтерфейсів в System.ComponentModel.Design, включаючи IComponentChangeService, ITypeResolutionService, ISelectionService, INameCreationService, IUIService, IMenuCommandService і т.д. Приклад коду використовує інтерфейс IdesignerHost для отримання списку обраних компонентів і створення компонента за допомогою IToolboxUser.ToolPicked.






public static void CreateToolboxItemOnDesigner(ToolboxItem item,
IDesignerHost designer)
{
ISelectionService selection = (ISelectionService)
designer.GetService(typeof(ISelectionService));
IComponent selComp = (IComponent)selection.PrimarySelection;
IDesigner des = null;
if (selComp is IToolboxUser)
des = designer.GetDesigner(selComp);
else
des = designer.GetDesigner(designer.RootComponent);
if (des is IToolboxUser)
{
((IToolboxUser)des).ToolPicked(item);
}
}

Налаштування інформаційного вікна “About”


Нова інтегрована середа розробки (IDE) передбачає підключення розширень сторонніх фірм і нових компіляторів, наприклад, прийдешньої версії Delphi 8. IDE пропонує розробникам розширень нові настроюються можливості, такі як розміщення описів продуктів на екрані-заставці і в інформаційному вікні “About”. Наступний приклад коду додає у вікно середовища розробки “About” логотип і пов’язаний з ним текст. Як і при додаванні пункту меню, об’єкт Bitmap в цьому зображенні інтерпретується як прозорий і передається у вигляді значення Windows HBITMAP. Зауважимо, що значення, що повертається з AddPluginInfo, повинно бути збережено, щоб його можна було використовувати для видалення інформації про розширення за допомогою RemovePluginInfo в разі вивантаження цього розширення.






private void AddAbout_Click(object sender, System.EventArgs e)
{
if (AboutPluginIndex > -1)
throw new ApplicationException(“You cant add the plugin twice”);
IOTAAboutBoxService aboutServ = OTAUtils.AboutBoxService;
((Bitmap)AboutImage.Image).MakeTransparent();
AboutPluginIndex = aboutServ.AddPluginInfo(AboutTitle.Text,
AboutDescription.Text, ((Bitmap)AboutImage.Image).GetHbitmap(),
AboutUnregistered.Checked, AboutLicenseStatus.Text,
AboutSkuName.Text);
}

Після виконання цього коду інформаційне вікно “About” матиме приблизно такий вигляд.


Зауважимо, що аналогічну настройку екрана-заставки можна реалізувати за допомогою інтерфейсу IOTASplashScreenService.


Приклад коду також ілюструє виконання будь-яких пунктів меню IDE за допомогою методу OTAUtils.ExecuteMainMenuItemByName. Кнопка “Show About Box” (Показати інформаційне вікно “About”) на вкладці “About Box” дозволяє розмістити і виконати пункт меню “HelpAboutItem”. Таким же чином можна виконати будь-який пункт меню IDE, після того як буде знайдено його ім’я за допомогою відповідних інтерфейсів IOTAMainMenuService і IOTAMenuItem.


Вікно повідомлень “Message View”


Форма прикладу коду також містить вкладку “Message View”. Код, що запускається за допомогою цієї вкладки, дозволяє очистити діалогове вікно “Message View”, додати повідомлення та групи повідомлень, додати батьківський / дочірній тип вкладених повідомлень, клацання по яких відкриває відповідні файли і т.п. Функціональні можливості вкладки “Message View” показані на наступній ілюстрації.


Основні утиліти OTA


Приклад коду також включає велику кількість статичних утиліт класу OTAUtils, що містяться у файлі OTAUtils.cs, які значно полегшують розробку проектів OTA. За допомогою цих утиліт можна легко і безпечно знаходити сервісні інтерфейси IDE, викликати інтерфейс поточного проекту, виконувати будь-які пункти меню IDE і т.п. Широко використовуйте їх у своїх проектах, створюйте нові методи та надсилайте їх мені, щоб я міг додати їх у цей пакет.


Нові функції


Крім інтерфейсів, які були описані вище, досвідчені розробники також знайдуть в. NET OTA такі нові інтерфейси:



Іншою перевагою. NET OTA (по крайней мере, до версії C # Builder 2!) Є те, що в результаті декількох успішних редакцій IDE, які дозволили значно розширити функціональні можливості інтерфейсів, були виключені складні ієрархії успадкування інтерфейсів. Наприклад, вже немає більше інтерфейсу IOTAServices, спадкоємця IOTAServices60, який, у свою чергу, був успадкований від інтерфейсу IOTAServices50. Тепер існує єдиний інтерфейс IOTAService, який реалізує всі колишні методи IOTAServices і доповнення. NET.


Налагодження розширень


Налагодження розширень OTA виконується не так легко, як це можна здатися, оскільки C # Builder 1.0 не підтримує налагодження збірки. NET, якщо ця збірка була завантажена за допомогою власної виконуваної середовища Windows, такий як C # Builder IDE (така спроба призведе до виключення “Unable to scan programs header” (Сканування заголовка програми неможливо)). Обійти це утруднення і виконати налагодження можна різними способами, наприклад, шляхом підключення до вже працює примірнику C # Builder, послідовно вибравши пункти меню Run і Attach to Process (подробиці див Readme.txt), або за допомогою журнального файлу (Log file) або повідомлень, що посилаються допомогою IOTAMessageService і т.п. Щоб налагодити код ініціалізації для свого розширення, додайте виклик MessageBox.Show в першому рядку процедури IDERegister і прикріпіть до нового процесу IDE, коли IDE чекатиме підтвердження діалогу “MessageBox”.


Можливості OTA, які в даний час ще не реалізовані


Нижче наведено список корисних можливостей, а також деяких можливостей старого OTA, які поки ще не підтримуються. NET OTA.



Приклад коду, що використовується в цій статті, можна знайти в CodeCentral під ідентифікатором ID #20287.


Ерік Беррі (Erik Berry) – Незалежний консультант і розробник програмного забезпечення з Сент-Луїса, штат Міссурі, що працює в корпорації Oasis Digital Solutions. Ерік Беррі є керівником проекту з розробки пакету інструментальних засобів GExperts для Delphi і C + + Builder, брав участь в проектуванні та впровадженні Open Tools API для C # Builder 1.0. Він також веде web-сторінку Open Tools API FAQ.

Додаткова інформація



Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*