 | Уровень сложности: средний Брайан Леонард, разработчик Lotus Notes Client, IBM
22.01.2008 Новая архитектура IBM Lotus Notes V8 позволяет увидеть, что делает пользователь в тот или иной момент. В данной статье описывается, как получить доступ к этой информации, и предлагаются способы ее использования для повышения эффективности работы пользователя.
В предыдущей статье, "Расширение боковой и инструментальной панелей IBM Lotus Notes V8" (EN), рассказывалось о том, как добавлять собственные компоненты в пользовательский интерфейс IBM Lotus Notes V8. А в статье "Интеграция данных IBM Lotus Notes в боковую и инструментальную панели Lotus Notes V8 " (EN) были рассмотрены способы получения доступа к данным Lotus Notes с помощью боковой или инструментальной панели для повышения удобства их использования.
Созданные ранее панель инструментов Journal и SideNote очень полезны для быстрого сохранения различных мыслей, которые хочется записать, и последующего доступа к этим записям. Однако при использовании этих средств можно заметить, что часто мысли не так уж и беспорядочны. Эти записи обычно связаны с тем, над чем в данный момент ведется работа, или даже с тем, на что падает взгляд, когда вы смотрите на экран. А что если связать эти мысли с их источниками?
В предыдущей статье, "Интеграция данных IBM Lotus Notes в боковую и инструментальную панели Lotus Notes V8" (EN), для сохранения информации в журнал использовался файл notes.jar, чтобы не было необходимости создавать на компьютере ещё один репозиторий данных. Возможность легко связать эти отдельные источники документов с самими документами позволила бы ещё в большей степени приблизиться к решению проблемы разрозненности информации.
Новая архитектура Lotus Notes, основанная на Eclipse, позволяет осуществить такое связывание. Платформа обеспечивает усовершенствованные методы контроля за выполняемыми пользователем действиями в каждый конкретный момент. Эту информацию можно выгодно использовать для создания более эффективных инструментов и приложений. В данной статье описаны способы осуществления доступа к текущему контексту работы пользователя, а также рассмотрено применение этой информации для расширения функциональности приложений, созданных в предыдущих двух статьях.
Установка
Сначала необходимо установить Lotus Notes V8. Установите Eclipse, который можно скачать бесплатно. Затем потребуется настройка Eclipse для работы со средой Lotus Notes. Приведенные ниже этапы настройки подразумевают, что Notes установлен в заданный по умолчанию каталог C:\Program Files\IBM\Lotus\Notes, а данные хранятся в каталоге C:\Program Files\IBM\Lotus\Notes\Data. Если установки немного другие, необходимо везде использовать свои пути к каталогам.
Откройте Eclipse и задайте целевую платформу следующим образом:
- Выберите Window - Preferences.
- Разверните вкладку Plug-in Development.
- Выберите Target Platform.
- В поле ввода Location введите или укажите путь C:\Program Files\IBM\Lotus\notes\framework\eclipse.
- Нажмите кнопку Reload, а затем OK.
Далее создается дополнительно установленная среда выполнения Java (JRE):
- Выберите Window - Preferences.
- Разверните пункт Java.
- Выберите Installed JREs.
- Нажмите Add.
- В качестве имени JRE, введите "Notes JRE".
- В качестве JRE Home Directory укажите каталог C:\Program Files\IBM\Lotus\notes\framework\rcp\eclipse\plugins\com.ibm.rcp.j2se.win32.<номер версии>
Для Lotus Notes Beta 3 он будет таким: com.ibm.rcp.j2se.win32.x86_1.5.0.SR4-200705170110
(ПРИМЕЧАНИЕ: После выполнения данной операции имена JAR-файлов отобразятся в нижней части диалогового окна
Затем, с помощью следующих действий создается новая конфигурация выполнения:
- Выберите Run - Run, а затем Eclipse Application.
- Щелкните правой кнопкой мыши и в появившемся меню нажмите New.
- Введите имя (например, Notes).
- В блоке Program to Run выберите Run a product и укажите значение com.ibm.notes.branding.notes.
- В строке Runtime JRE выберите Notes JRE.
- Во вкладке Arguments введите следующие строчки в текстовое поле Program arguments:
-personality com.ibm.rcp.platform.personality
-product com.ibm.notes.branding.notes
-debug
-console
Введите следующие аргументы в текстовое поле VM arguments:
-Drcp.home=${notes.install}\framework
-Drcp.data=${notes.data}\workspace
-Drcp.install.config=user
-Dosgi.install.area=${notes.install}\framework\eclipse
-Dcom.ibm.pvc.osgiagent.core.logfileloc=${notes.install}\framework\rcp
-Dcom.ibm.pvc.webcontainer.port=0
-Declipse.pluginCustomization=${notes.install}\framework\rcp\plugin_customization.ini
-Declipse.registry.nulltoken=true
-Djava.protocol.handler.pkgs=com.ibm.net.ssl.www.protocol
-Djava.util.logging.config.class=com.ibm.rcp.core.internal.logger.boot.LoggerConfig
-Dosgi.hook.configurators.exclude=org.eclipse.core.runtime.internal.adaptor.EclipseLogHook
-Dosgi.framework.extensions=com.ibm.rcp.core.logger.frameworkhook
-Xbootclasspath/a:${notes.install}\framework\rcp\eclipse\plugins\${rcp.base}\rcpbootcp.jar;
Затем, выполните описанные ниже шаги для завершения конфигурирования рабочей среды:
- Щелкните на пункте Variables.
- Выберите Edit Variables.
- Нажмите пункт New.
- В качестве имени введите "notes.install".
- В качестве значения укажите путь к каталогу, где установлен Lotus Notes, и нажмите OK. Этот путь не должен содержать внутри себя пробелы. Например, если Lotus Notes установлен в каталог C:\Program Files\Lotus\Notes, значение переменной notes.install должно быть таким: C:\PROGRA~1\IBM\Lotus\Notes.
- Повторите шаги 1-3.
- В качестве имени введите "notes.data"
- В качестве значения укажите местонахождение каталога для данных и нажмите OK. Например, используйте заданный по умолчанию каталог:
C:\PROGRA~1\IBM\Lotus\Notes\Data.
- Повторите шаги 1-3.
- Введите имя "rcp.base".
- Установите в качестве значения название папки для установленного плагина com.ibm.rcp.base и нажмите OK. Для этого перейдите в каталог <место установки notes>\framework\rcp\eclipse\plugins. Там есть папка примерно с таким именем: com.ibm.rcp.base_6.1.1.<дата>.
Например, в Lotus Notes Beta 3, она будет называться так: com.ibm.rcp.base_6.1.1.200705170110.
- Нажмите OK, а затем Cancel для диалогового окна Select Variable (нажатие кнопки ОК при выборе переменной добавляет переменную в точку вставки).
Для активации защиты Notes из оболочки Eclipse нужно раскомментировать две строчки. В файле <место установки notes>\framework\shared\eclipse\plugins\com.ibm.notes.branding_3.0.0.<номер версии>\notes_plugin_customization.ini, раскомментируйте следующие две строчки, удаляя символ # в начале строки:
com.ibm.rcp.security.auth/loginEnabled=true
com.ibm.rcp.security.auth/loginConfigName=NOTES
.
Теперь выберите Run/Debug для запуска Lotus Notes.
И наконец, скачайте код, предоставляемый вместе с этой статьей, и разархивируйте его в новую папку. Чтобы внедрить его в Eclipse, необходимо импортировать существующие проекты.
- Выберите File - Import.
- Выберите General - Existing Projects into Workplace и нажмите Next.
- Перейдите в папку с разархивированным кодом и нажмите OK.
- Нажмите Finish для завершения процесса импорта.
Выбор Eclipse
Платформа Eclipse состоит из нескольких уровней и дает возможность плагинам прослушивать, что происходит на каждом из этих уровней. Добавляя модули мониторинга (listeners), можно получать уведомления об изменениях в текущем контексте пользователя.
Плагин com.ibm.lotuslabs.context.service был создан для добавления еще одного уровня к уже имеющимся в Eclipse. В частности, DocumentContextService обеспечивает подключение и оповещение других плагинов о том, что пользователь изменяет документы с помощью клиента Lotus Notes.
В любой момент времени контекст определяется как текущий выбор в пределах текущего компонента IWorkbenchPart. Платформа Eclipse устанавливает, что текущий компонент должен публиковать свой выбор посредством определения ISelectionProvider, задав его через part.getSite().setSelectionProvider().
Окно IWorkbenchWindow, содержащее, помимо прочего, перспективы и компоненты, в которых меняется выбор, может использовать ISelectionService, сообщающий, когда происходят изменения. Этот сервис позволяет добавить два типа детекторов выбора (selection listeners). Если используется метод addSelectionListener(), оповещение об изменениях выбора происходит незамедлительно. Между тем, метод addPostSelectionListener() ненадолго приостанавливается, отслеживая ввод с клавиатуры, чтобы удостовериться в том, что пользователь действительно выбрал данный элемент и работает с ним. Сервис DocumentContextService использует метод addPostSelectionListener для сокращения числа избыточных оповещений.
DocumentContextService также предусматривает два типа модулей мониторинга сходного действия. Если потребитель использует метод addSelectionListener(), он получает уведомление всякий раз при изменении выбора. Если используется метод addListener(), это означает, что потребитель хочет знать только момент выбора нового документа. Сервис определяет, что выбран новый документ, если новый выбор имеет URI, отличный от текущего.
Для упрощения процедуры для потребителя, данный сервис сначала регистрируется в качестве IWindowListener, чтобы получать оповещения, когда открывается новое окно. В данном окне к сервису выбора будет добавлен детектор выбора. Посредством такого механизма метод selectionChanged() в классе DocumentContextService вызывается каждый раз, когда выбор пользователя меняется. Этот метод определяет, был ли выбран новый документ, и оповещает своих потребителей в соответствии с текущим DocumentSelection.
DocumentSelection - это класс для сервиса, используемый для представления совокупности документов. Каждый документ предоставляет о себе информацию через объект IDocumentContext. Интересная логика в данном плагине используется для преобразования выбора, передаваемого платформой Eclipse.
Если это преобразование не переопределяется для конкретного объекта, то оно происходит в конструкторе встроенного класса DocumentContext. Ключом к извлечению необходимой информации в Eclipse служит концепция IAdaptable.
Эта гибкая среда позволяет преобразовать любой объект в другой тип. Преобразование может быть прямым или косвенным. Прямое преобразование происходит либо путем помещения объекта в нужный тип, либо реализацией метода IAdaptable. Косвенно это делается через платформу с использованием точки расширения org.eclipse.core.runtime.adapters. Таким образом, чтобы преобразовать объект из одного типа в другой, можно использовать программу, представленную в листинге 1.
Листинг 1. Извлечение адаптера из выбранного объекта
public static Object getAdapterObject(Object o, Class clazz) {
Object item = null;
if(clazz.isInstance(o))
item = o;
else if(o instanceof IAdaptable) {
item = ((IAdaptable)o).getAdapter(clazz);
}
if(item==null) {
IAdapterManager man = Platform.getAdapterManager();
if(man!=null)
item = man.getAdapter(o, clazz);
}
return item;
}
|
DocumentContext использует метод getAdapterObject() для определения названия, URI, значка и свойств выбранного объекта Object. Сначала он пытается использовать IURIProvider, который Lotus Notes применяет, чтобы определить, для чего нужно создать закладку. Он возвращает все эти элементы. Если он не может найти название или значок, он использует интерфейс IWorkbenchAdapter, в котором могут быть эти детали. Если URI отсутствует, он пытается приспособить Object непосредственно к классу URI. Наконец, он пытается определить другие различные свойства с помощью интерфейса IPropertySource. Если все эти процедуры не срабатывают, DocumentContext возвращается к использованию информации из текущего IViewPart.
Плагин com.ibm.lotuslabs.context.ui.test создаёт боковое поле, показывающее, что именно DocumentContextService передает в качестве текущего документа. См. рисунок 1.
Рисунок 1. Контекстное боковое поле
Панель инструментов Todo
Плагин com.ibm.lotuslabs.todo.ui создаёт инструментальную панель, которая является одним из расширений концепции SideNote и панели Journal, описываемых в предыдущих статьях. Инструментальная панель Todo позволяет запускать приложение Todo, показывать новую форму с описанием задачи или быстро создавать задачу, как показано на рисунке 2. Отличие состоит в том, что эта панель инструментов использует DocumentContextService для создания задачи, ссылающейся на текущий документ.
Рисунок 2. Быстрое создание задачи
Данный принцип создания задачи по текущему документу или на его основе должен повысить производительность, так как он улучшает взаимодействие между приложениями. Новая созданная задача включает в себя текст, который вы напечатали, а также ссылку на исходный документ. См. рисунок 3.
Рисунок 3. Новая задача со ссылкой
Функциональность представленной панели инструментов практически совпадает с функциональностью панели Journal из предыдущей статьи, Интеграция данных IBM Lotus Notes в боковую и инструментальную панели Lotus Notes V8, за исключением возможности добавления данной ссылки. Как экземплярная переменная, класс TodoContribution содержит в себе текущее значение DocumentSelection. При создании панели инструментов к сервису добавляется модуль мониторинга, как показано в листинге 2.
Листинг 2. Добавление модуля мониторинга DocumentContextService
final IDocumentContextListener listener = new IDocumentContextListener() {
public void selectionChanged(IWorkbenchPart part, DocumentSelection selection) {
current = selection;
}
};
final DocumentContextService service = DocumentContextService.getDefault();
service.addListener(listener);
|
Теперь, при отображении диалогового окна, для создания ссылки можно использовать этот объект выбора. Когда пользователь выбирает Quick, он извлекает название и URI выбранного фрагмента. Объект SideNote имеет возможность задать текст для контрольной метки и увидеть, был ли параметр выбран, когда пользователь закрыл документ.
Независимо от того, выбирает ли пользователь параметр или нет, для создания задачи в коде используется плагин com.ibm.lotuslabs.notes.pim. В частности, он вызывает метод TodoTask.createTask(). В качестве входных параметров он берет текст и название новой задачи. Кроме того, над текстом может быть добавлен массив ссылок.
Метод createTask() использует класс NotesJob, описанный в статье Интеграция данных IBM Lotus Notes в боковую и инструментальную панели Lotus Notes V8. Так же как и при создании записи журнала, необходимо создать новый документ с нужными элементами. В частности, следует задать название и тело документа и заполнить другие поля, необходимые форме Task, такие как важность, срок выполнения и другие.
После того, как создана основная часть, можно добавить переданные ссылки. В листинге 3 показывается, как это сделать.
Листинг 3. Создание тела задачи
RichTextItem body = doc.createRichTextItem("Body");
// if links
if(links!=null) {
for(int i=0;i<links.length;i++) {
addLink(session,body,links[i]);
}
body.addNewLine();
}
body.appendText(val);
|
Метод addLink() позволяет любую строку (String) использовать как ссылку. Он отдельно проверяет наличие записей:// URL. Если они найдены, создается специальная ссылка Lotus Notes; если нет - ссылка просто добавляется в текст.
Приложение Journal It
SideNote - это приложение на боковой панели, которое предоставляет место для ввода текста. Вообще говоря, оно не предполагает сохранение этого текста. Journal It использует то же место, но по-другому. Он сохраняет записи отдельно для каждого документа. См. рисунок 4.
Рисунок 4. Приложение Journal It
При составлении заметок Journal It связывает запись с текущим документом. Пользователь может сделать заметку на боковой панели о некотором сообщении электронной почты. С этого момента эта заметка будет появляться каждый раз при выводе данного сообщения на экран.
Плагин com.ibm.lotuslabs.journal.ui.context добавляет компонент JournalCurrentViewPart на боковую панель Lotus Notes. Этот компонент ViewPart подключается к DocumentContextService, чтобы получать оповещения, когда пользователь переключает документы. URI документа преобразуется в идентификатор (ID). Этот идентификатор используется для поиска документа в представлении базы данных журнала. Если его не существует, Journal It использует название из сервиса. Если пользователь делает какие-то изменения, данные сохраняются с использованием этого идентификатора.
Текущее отображение записи журнала использует JournalNote Composite в плагине com.ibm.lotuslabs.notes.pim. Сложность создания подобного компонента пользовательского интерфейса, поддерживаемого данными Lotus Notes, состоит в том, что приходится решать проблемы с потоками. То есть, подключиться к базе данных журнала из UI-потока невозможно.
JournalNotes обрабатывает потоки при помощи статического метода createValueMap(), который берет Document Object и заполняет карту (Map) всем необходимым для инициализации пользовательского интерфейса. Эта карта создается в NotesJob, так что самая трудная работа выполняется в том другом потоке. Потом карта может быть передана UI-потоку для создания элемента управления.
Однако до создания карты документ должен оказаться в представлении. Представление JournalIt создается методом createSidebarView() в классе JournalSidebarUtil при первом обращении к нему. Это представление показывает все документы в базе данных, имеющие поле JournalIt ID. Более того, в процессе создания этого представления остальные представления в базе данных изменяются так, чтобы не отображать эти документы. Это действие сохраняет представление By Category неизменным для пользователя. При поиске применяется метод view.getDocumentByKey(), использующий упомянутое значение идентификатора (ID).
Когда сервис документа оповещает о новом документе, приложение выясняет, изменял ли пользователь что-либо. Если что-то менялось, то либо создается новая запись в журнале, либо у предыдущей преобразовывается тема и текст.
Ограничения
IBM Lotus Notes V8 имеет несколько ограничений; основное заключается в следующем: заголовок документа может быть выбран только в представлении PIM. В противном случае, DocumentContextService сообщит, что заголовок документа совпадает с заголовком представления.
Еще одна проблема состоит в том, что сервис на сегодняшний день не передает URL-адреса Web-сайтов, которые просматриваются встроенным браузером. Одно из преимуществ использования интерфейсов платформы Eclipse заключается в том, что здесь могут взаимодействовать все типы компонентов. Встроенному браузеру просто нужно передать информацию о выборе с помощью элемента IViewPart. После этого приложения типа Journal It осуществляют поиск в документах Lotus Notes, Web-страницах и других источниках, сообщающих о своём выборе.
Заключение
В последних трех статьях рассматривались способы вставки компонентов в пользовательский интерфейс Lotus Notes, получения доступа и изменения данных Lotus Notes и эффективного использования информации о пользовательском контексте. Объединив все эти возможности, можно создавать отличные приложения.
Особенно могущественен принцип адаптации приложений к тому, что в данный момент делает пользователь. Сервисы и примеры, приведенные в данной статье, подскажут, с чего начать.
Загрузка | Описание | Имя | Размер | Метод загрузки |
|---|
| Sample code | context.zip | 55 KB | HTTP |
|---|
Ресурсы Научиться
Получить продукты и технологии
Обсудить
Об авторе  | |  |
Брайан Леонард (Brian Leonard) - разработчик клиента Lotus Notes Client. При создании IBM Lotus Notes V8 он работал над функциями поиска, доставки электронной почты, отложенной загрузки изображений, проверки орфографии, а также занимался расширяемостью. Ему бы хотелось быть повыше ростом, но никогда не удавалось найти нужную точку расширения. |
Выскажите мнение об этой странице
|  |