CodeBlog: створення розширення для блогів в Visual Studio 2010 Частина 1, Різне, Програмування, статті

CodeBlog це просте розширення VisualStudio, Яке публікує фрагменти коду в Twitter і WordPress блогах, прямо з IDE. Ми побіжно розглянемо конструкцію CodeBlog, для того, щоб вивчити деякі загальні правила розширень Visual Studio.


CodeBlog є невеликим розширенням, яке дозволить вам копіювати в буфер шматки коду з редактора Microsoft Visual Studio і посилати їх в Twitter або свій блог. При цьому для зручності задіяний пункт контекстного (правий клік) меню. Жарт в чистому вигляді. Справжня мета – приклад створення інтегрованого пакета (integration packageVisual Studio, Який ми можемо використовувати для ілюстрації користувача настройки середовища, якось, додавання пункту меню, перехоплення подій (хукінг) в редакторі і створення, і управління вікном інструментів. Я побудував CodeBlog використовуючи Visual Studio 2010 Release Candidate і Visual Studio 2010 SDK RC.
Як тільки розширення встановлюється, CodeBlog додає пункт “Blog and Tweet” в контекстне меню редактора коду. Коли ви вибираєте пункт меню, CodeBlog знаходить виділений текст і робить наступне:
Відсилає текст в Twitter, Використовуючи Twitter API;
Відсилає текст в WordPress блог, Як чернетка, використовуючи MetaWeblog API;
Додає візуальний ефект (званий обрамлення (adornment)) в редактор, виділяючи тим самим запис із зазначенням відповідного URL в блозі;
Додає дату, URL і текст запису в блозі в список, який може бути переглянутий пізніше у вікні інструментів;
Виводить чернетку запису в браузер для редагування.
Розширення встановлює записи блогу і Twitter“А у вікно інструментів, яке запам’ятовує список фрагментів коду, розміщених вами, відповідно, в блозі і Twitter“Е, і створює пункт в меню View / Other Windows, який відкриває це вікно інструментів.


Створення пакета.


Фактично, ми використовуємо дві моделі розширень Visual Studio при створенні CodeBlog. CodeBlog – розширення, частково використовує як VSPackage, Так і MEF (Managed Extensibility Framework). VSPackage частина CodeBlog отримує доступ до UI елементам в оточенні Visual Studio, Таким як пункти меню і вікно інструментів. MEF компонентна частина буде використовуватися для додавання обрамлення тексту в редакторі.
SDK інсталює шаблон проекту Visual Studio Package, Який ви можете використовувати для того, щоб почати розробку VSPackage. За допомогою цього шаблону, візард створення проекту дозволить вам опціонально включити команду меню, вікно інструментів і користувальницький редактор, як частина нового проекту. Для CodeBlog ми виберемо опції “Команда меню” і “вікно інструментів”, вказавши ім’я команди (“Blog and Tweet”) для команди меню, і ім’я вікна для вікна інструментів (“Blog and Tweet Entries”) і ID команди для команди меню і для пункту меню, який буде викликатися у вікні інструментів.
Згенерований за допомогою шаблону проект включає файл вихідного коду каркаса пакета, і кілька інших файлів, які варто коротко згадати, в процесі розгляду структури VSPackage. Основний файл – клас CodeBlogPackage, успадкований від класу MPF (Managed Package Framework) Package, Який реалізує інтерфейс IVsPackage і відповідає за обробку реєстрації в середовищі. Так як ми запитуємо команду меню і вікно інструментів, клас пакета також включає ініціалізації код для установки команд меню і методу відображення вікна команд.
Клас вікна інструментів успадковується від MPF ToolWindowPane і включає в себе для користувача елемент управління WPF. Коли ми встановлюємо розмітку вікна Blog and Tweet Entries, ми робимо основну частину роботи з налаштування для користувача елемент управління. Згенерований проект також включає XAML файл і Class файл для користувача елементу управління.
Команди пакета визначено у файлі таблиць команд (VSCT). VSCT файл задає розташування команд в оболонці меню, використовуючи при цьому вказані нами ID. Він надає загальні бітмапи для кожного пункту меню, які ви можете замінити власними бітмапи, хоча я не робив цієї операції в CodeBlog. Візард розміщує пункт меню виклику вікна інструментів під View / Other Windows, і відповідну команду меню у вікні Інструментів. Перш за все, нам треба перенести команду меню з вікна Інструментів контекстне меню редактора, для того, щоб ми мали можливість його викликати за допомогою правої кнопки миші.


Підключення пункту меню


Одиночна команда меню CodeBlog міститься в групі меню. В VSCTфайлі опис цієї групи згенеровано наступним чином:


<Group guid=”guidCodeBlogCmdSet” id=”MyMenuGroup” priority=”0x0600″>
<Parent guid=”guidSHLMainMenu” id=”IDM_VS_MENU_TOOLS”/>


</Group>


Все, що нам необхідно зробити, для того, щоб перенести пункт меню “Blog and Tweet” в контекстне меню, це задати контекстний редактор вікна коду в якості батьківської для групи меню, використовуючи ідентифікатор IDM_VS_CTX_CODEWIN:
<Parent guid=”guidSHLMainMenu” id=”IDM_VS_CTXT_CODEWIN”/>


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

Коли пункт меню натиснутий, ми повинні подивитися, виділений якийсь текст, і провести певну дію, якщо це так. Для того, щоб знайти виділення, спочатку нам потрібно знайти активне подання (View).
Як VSPackage, CodeBlog шукає активну подання до IDE, використовуючи служби Visual Studio. Ми отримуємо активну уявлення використовуючи службу VSTextManager.

IVsTextManager txtMgr =
(IvsTextManager)GetService(typeof(SVsTextManager));
int mustHaveFocus = 1;
txtMgr.GetActiveView(mustHaveFocus, null, out vTextView);

Як тільки ми отримали активне подання, ми можемо використовувати його для отримання IWPFTextView, який нам необхідний для вилучення виділеного фрагмента, і наступного додавання обрамлення. Техніка включає кілька інших викликів, які описані в інструкції MSDNR. (Це керівництво так само включає вихідний код, багато фрагментів якого CodeBlog використовує для управління обрамленням тексту).
Ми отримуємо виділений текст приблизно так:
string selectedText = view.Selection.SelectedSpans[0].GetText();


І потім ми отримуємо текст, який нам необхідний для Tweet “єра і поста в блозі.
Команда меню Blog and Tweet може бути використана тільки тоді, коли є виділений текст в текстовому редакторі, таким чином, має сенс відключити пункт меню і робити його активним тільки при виконанні даної умови. CodeBlog робить це, в більшості випадків, перехоплюючи подія пункту меню BeforeQueryStatus і роблячи його (пункт меню) активним, тільки якщо текст виділений. Однак, цей метод не працює якщо користувач викликає контекстне меню до того, як CodeBlog буде завантажений. В цьому випадку пункт меню буде активним навіть без виділення (хоча покажчик ігноруватиме клік).
Така поведінка насправді задумано в Visual Studio, Яка довантажує пакет, що містить пункти меню під час запуску, але не завантажує пакет класу (який ресурсоемок) до тих пір, поки він реально не знадобиться. Visual Studio надає механізм декларації видимості і активного стану для пакетів в VSCT, посредствам приречення станів (тобто, UICONTEXT_Debugging). CodeBlog не може використовувати цей механізм тому, як активна область виділеного тексту не включена в список встановлених умов, тому ми маємо справу з винятком.

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


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

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

Ваш отзыв

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

*

*