Смарт-теги приложений Office работают примерно так: по мере ввода пользователя (в открытом документе) сам текст ввода "разбирается" на маркеры, которые затем сравниваются со всеми терминами/выражениями, которые распознаются в любых приложениях Office. Если текст распознается смарт-тегом, то пользователю выдается список действий (отображаемый при помощи того пользовательского интерфейса, который уже был описан ранее при первом представлении концепции смарт-тега). То есть у нас есть две части процесса: распознавание и действие.
При помощи VSTO вы можете создать ваши собственные смарт-теги, которые определяют распознаваемый ими текст, а также и список возможных действий, который будет представлен пользователю после распознавания.
Как Word, так и Excel реализуют классы, которые наследуют от базового класса
Miсrоsoft.Office.TooIs.SmartTagBase.
Для Word это класс Microsoft. Off ice. Tools. Word. SmartTag, а для Excel это класс Microsoft. Office. Tools . Excel. SmartTag. Оба этих класса реализуют два важных свойства, определенные в классе SmartTagBase: Terms и Expressions. Если вашему смарт-тегу необходимо выявлять совпадение простых текстовых маркеров, то вы можете добавить их в коллекцию Terms. Если требуется более сложное сопоставление, то свойство Expressions примет регулярное выражение для такого сопоставления.
Для того чтобы определить, как настроить объект вашего смарт-тега, необходимо немного узнать о том, как приложения Office разбирают текст на маркеры. Например, если пользователь вводит Р029302 в Word, то синтаксический анализатор автоматически создаст из этого текста два маркера: первый маркер будет РО, а второй — 29302. Добавление строки "РО" в коллекцию Terms приведет к тому, что этот текст будет распознаваться нашим смарт-тегом (поскольку один из маркеров совпадает с нашим условием). Мы могли бы также написать более сложное и надежное регулярное выражение, которому соответствуют "буквы РО, перед которыми имеется один или несколько пробелов, и за которыми следует любое количество цифр, а затем один или более пробелов" следующим образом: \sPO [0-9] *\s.
После того как вы решили, что хотите делать в вашем смарт-теге поиск текстовых совпадений, вам необходимо определить список действий, которые будут доступны пользователю при нажатии смарт-тега. Если вы хотите сделать поиск заказа на покупку при помощи только что показанного регулярного выражения, а затем дать пользователю возможность просмотра подробностей этого заказа на покупку (возможно, внутри панели действий или в области формы Outlook), то вы можете определить это действие при помощи класса Action (который имеется как в Word, так и в Excel). Класс Action предоставляет событие, которое мы можем перехватить для выполнения указанного действия:
// Создать объект действия
DisplayPO = new Action("Display PO details");
// Добавить действие в смарт-тег
POSmartTag.Actions = new Action[] { DisplayPO };
В листинге 21.1 все это сведено в один блок, который можно скопировать и вставить в класс документа Word (например, This Document) для создания нестандартного смарт-тега, а на рис. 21.18 показан смарт-тег в действии.
using System;
using System.Collections.Generic; using System.Data; using System.Linq; using System.Text;
using System.Text.RegularExpressions; using System.Windows.Forms; using System.Xml.Linq;
using Microsoft.VisualStudio.Tools.Applications.Runtime; using Tools = Microsoft.Office.Tools.Word; using Office = Microsoft.Office.Core; using Word = Microsoft.Office.Interop.Word;
namespace WordDocumentl 4
public partial class ThisDocument {
private void AddPOSmartTag()
{
// Создать объект смарт-тега Tools.SmartTag poSmartTag =
new Tools.SmartTag("www.contoso.com#POSmartTag",
"PO Smart Tag");
//Мы хотим проверять совпадение регулярного выражения: poSmartTag.Expressions.Add(new Regex(@"\sPO[0-9]*\s")) ;
// Определить действие для смарт-тега
Tools.Action displayDetails = new Tools.Action("Display PO details..."); // Добавить действие в смарт-тег
poSmartTag.Actions = new Tools.Action[] { displayDetails };
// Добавить смарт-тег в документ this.VstoSmartTags.Add(poSmartTag);
// Подключить обработчики событий для действия смарт-тега displayDetails.Click += new Tools.ActionClickEventHandler(
displayDetails_Click);
}
void displayDetails_Click(object sender, Tools.ActionEventArgs e)
{
// Здесь должен быть код доступа в систему закупок
I i
// для предоставления информации в текущем документе
}
private void ThisDocument_Startup(object sender, System.EventArgs e)
{
AddPOSmartTag() ;
}
private void ThisDocument_Shutdown(object sender, System.EventArgs e) {
}
#region VSTO Designer generated code
%
III <summary>
III Required method for Designer support - do not modify III the contents of this method with the code editor.
Ill </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisDocument_Startup); this.Shutdown += new System.EventHandler(ThisDocument Shutdown);
#endregion
}
}