IBM Lotus Notes 8 のサイドバーおよびツールバーでのユーザー・コンテキストの活用

IBM Lotus Notes 8 の新しいアーキテクチャーにより、任意の時点でユーザーが何をしているのかを表示できます。この記事では、この情報にアクセスする方法を説明し、ユーザーの生産性を高めるために利用可能な方法を提案します。

Brian Leonard, Lotus Notes Client Developer, IBM

Brian Leonard is a Lotus Notes client developer. In IBM Lotus Notes V8, he worked on search, email rendering, delayed image loading, spell check, and extensibility. He'd like to be taller but can never find the right extension point.



2007年 7月 24日

前の記事 「IBM Lotus Notes 8 のサイドバーとツールバーの拡張」 では、独自のコンポーネントを IBM Lotus Notes 8 のユーザー・エクスペリエンスに提供する方法について説明しました。また、「IBM Lotus Notes 8 のサイドバーおよびツールバーに Lotus Notes データを統合する」 では、Lotus Notes データをより有効に活用するために、ツールバーおよびサイドバーから、これらのデータにアクセスする方法について説明しました。

これまでに作成した Journal ツールバーと SideNote は、すぐに書き留めておきたいランダムなアイデアを迅速に保存したり、アクセスする際にたいへん役立ちます。しかし、これらのツールを使用したことがあれば、アイデアは常にランダムとは限らないことに気付くでしょう。これらのメモは、通常は作業中の何らかに関するものであったり、現在画面上で見ているものに関連しているかもしれません。これらのアイデアをそのソースとリンクできると、どうでしょうか。

前の記事 「IBM Lotus Notes 8 のサイドバーおよびツールバーに Lotus Notes データを統合する」 では、notes.jar を使用して情報をジャーナルに保存したため、他のデータ・リポジトリーをデスクトップ上に作成していません。これらの文書の個々のソースを簡単に文書自身にリンクできると、情報が散乱してしまうという問題を軽減できます。

Lotus Notes の新しい Eclipse ベースのアーキテクチャーにより、このリンクが可能になります。このプラットフォームにより、任意の時点でユーザーが何をしているかを表示する機能が大幅に高められます。この情報を活用して、より効果的なツールおよびアプリケーションを作成できます。この記事では、ユーザーの現在のコンテキストにアクセスする方法を説明し、この新しい情報を活用するために、前の 2 つの記事で作成したアプリケーションをさらに拡張します。

セットアップ

まず、Lotus Notes 8 ソフトウェアをインストールする必要があります。次に、Eclipse(以下USサイトのリンク参照)をセットアップします。Eclipse は無料でダウンロードできます。そして、Lotus Notes 環境で機能するよう Eclipse をセットアップします。以下の手順では、Lotus Notes をデフォルトのロケーション C:\Program Files\IBM\Lotus\Notes にインストールし、データ・ディレクトリーは C:\Program Files\IBM\Lotus\Notes\Data であるものとして説明を進めます。ご使用になっている環境が多少異なる場合は、それぞれ実際のロケーションを使用してください。
Eclipse(US)

Eclipse を開き、次の手順にしたがってターゲット・プラットフォームを設定します。

  1. 「ウィンドウ」->「設定」を選択します。
  2. 「プラグイン開発」を展開します。
  3. 「ターゲット・プラットフォーム」を選択します。
  4. 「ロケーション」編集コントロールで、「C:\Program Files\IBM\Lotus\notes\framework\eclipse」を入力するか、参照して選択します。
  5. 「再ロード」ボタンをクリックし、「OK」をクリックします。

次に、追加のインストール済み JRE を作成します。

  1. 「ウィンドウ」->「設定」を選択します。
  2. 「Java」を展開します。
  3. 「インストール済みの JRE」を選択します。
  4. 「追加」をクリックします。
  5. JRE 名として「Notes JRE」と入力します。
  6. JRE ホーム・ディレクトリーとして、「C:\Program Files\IBM\Lotus\notes\framework\rcp\eclipse\plugins\com.ibm.rcp.j2se.win32.<version number>」を入力するか、参照して選択します。 For Lotus Notes Beta 3, this value is: com.ibm.rcp.j2se.win32.x86_1.5.0.SR4-200705170110Lotus Notes Beta 3 では、この値は「com.ibm.rcp.j2se.win32.x86_1.5.0.SR4-200705170110」となります。 (メモ: これにより、ポップアップ・ボックスの下部に JAR ファイルが表示されます。)

次に、以下の手順にしたがって、新しいランタイム構成を作成します。

  1. 「実行」->「実行」を選択し、「Eclipse アプリケーション」を選択します。
  2. 右クリックして「新規」を選択します。
  3. 名前 (たとえば、Notes) を入力します。
  4. 「実行するプログラム」で、「プロダクトの実行」を選択し、「com.ibm.notes.branding.notes」を選択します。
  5. 「ランタイム JRE」で「Notes JRE」を選択します。
  6. 「引数」タブで、「プログラム引数」テキスト・ボックスに次の引数を入力します。
    -personality com.ibm.rcp.platform.personality
    -product com.ibm.notes.branding.notes
    -debug
    -console

次の引数を「VM 引数」テキスト・ボックスに入力します。
-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;

以下の手順にしたがって、ランタイム構成を完了させます。

  1. 「変数」をクリックします。
  2. 「変数の編集」をクリックします。
  3. 「新規」をクリックします。
  4. 名前に「notes.install」を入力します。
  5. 値として、Lotus Notes をインストールしたパスを入力し、「OK」をクリックします。このパスにはスペースを含めないでください。たとえば、C:\Program Files\Lotus\Notes にインストールした場合、notes.install の値は「C:\PROGRA~1\IBM\Lotus\Notes」になります。
  6. 手順 1 から 3 を繰り返します。
  7. 名前に「notes.data」を入力します。
  8. 値としてデータ・ディレクトリーのロケーションを入力し、「OK」をクリックします。たとえば、デフォルトの「C:\PROGRA~1\IBM\Lotus\Notes\Data」を使用します。
  9. 手順 1 から 3 を繰り返します。
  10. 名前に「rcp.base」を入力します。
    For example, in Lotus Notes Beta 3, this value is com.ibm.rcp.base_6.1.1.200705170110.
  11. インストールされている com.ibm.rcp.base プラグインのフォルダー名のバージョンを値として入力し、「OK」をクリックします。これを行うには、<notes install location>\framework\rcp\eclipse\plugins というロケーションに移動します。com.ibm.rcp.base_6.1.1.<date> のようなフォルダーがあります。 たとえば、Lotus Notes Beta 3 では、この値は「com.ibm.rcp.base_6.1.1.200705170110」となります。
  12. 「OK」をクリックし、「変数の選択」ダイアログ・ボックスで「キャンセル」をクリックします (変数の選択で「OK」をクリックすると、挿入ポイントに変数が追加されます)。

Eclipse から Lotus Notes セキュリティーを有効にするには、次の 2 つの行をアンコメントする必要があります。<notes install location>\framework\shared\eclipse\plugins\com.ibm.notes.branding_3.0.0.<version number>\notes_plugin_customization.ini で、先頭の # 文字を削除することにより、次の 2 つの行をアンコメントしてください。

com.ibm.rcp.security.auth/loginEnabled=true
com.ibm.rcp.security.auth/loginConfigName=NOTES

「実行/デバッグ」を選択し、Lotus Notes を起動します。

最後に、この記事で取り上げるコードをダウンロードし、新しいフォルダーに unzip します。これを Eclipse にインポートするには、既存のプロジェクトをインポートする必要があります。

  1. 「ファイル」->「インポート」を選択します。
  2. 「一般」->「既存のプロジェクトをワークスペースへ」を選択し、「次へ」をクリックします。
  3. コードを unzip したフォルダーを参照して選択し、「OK」をクリックします。
  4. 「終了」をクリックし、インポート・プロセスを完了します。

Eclipse での選択内容

Eclipse プラットフォームはいくつかのレイヤーで構成されていて、これらの各レイヤーで行われていることを listen する能力がプラグインに与えられます。リスナーを追加することにより、ユーザーの現在のコンテキストに変化が起きたときに、その通知を受けることができます。

com.ibm.lotuslabs.context.service プラグインは、Eclipse が提供するレイヤーに、もう 1 つのレイヤーを追加するために作成されました。特に、DocumentContextService を使用すると、ユーザーが Lotus Notes クライアント内で文書を変更したときに、サブスクライブ (購読) によって、他のプラグインがその通知を受けることができます。

任意の時点で、コンテキストは、現在の IWorkbenchPart 内での現在の選択内容として表すことができます。Eclipse プラットフォームは現在のパートに対し、ISelectionProvider を定義し、そのサイト part.getSite().setSelectionProvider() を通じて ISelectionProvider を設定することにより、現在のパートの選択内容をパブリッシュ (発行) するよう指定します。

特に、選択内容が変更されているパースペクティブおよびパート含む IWorkbenchWindow は、変更が発生したこと通知する ISelectionService を得ることができます。このサービスにより、2 つの異なるタイプの選択リスナーを追加できます。addSelectionListener() メソッドを使用すると、選択内容が変更されるたびに、すぐに通知されます。一方、addPostSelectionListener() メソッドを使用すると、ユーザーがそのアイテムで停止できるように、キーボード・ナビゲーションで少しの間停止します。DocumentContextService は addPostSelectionListener を使用して、不要な通知を最小限にします。

また、DocumentContextService では、同様の方法で 2 つのタイプのリスナーを使用できます。コンシューマーが addSelectionListener() メソッドを使用すると、選択内容が変更されるたびに通知されます。addListener() メソッドを使用すると、コンシューマーは新規文書が選択された場合のみ検出できます。このサービスは、新しい選択内容が現在とは異なる URI を持つときに、新規文書が選択されたものと定義します。

コンシューマーにとって簡単にするために、このサービスは、新規ウィンドウが開かれたときに通知される IWindowListener として、最初に自分自身を登録します。そして、その新規ウィンドウに対し、選択サービスへの選択リスナーを追加します。このメカニズムを介して、ユーザーが選択内容を変更するたびに、DocumentContextService クラスの selectionChanged() メソッドが呼び出されます。このメソッドは、それが新規文書かどうかを判断し、必要に応じて現在の DocumentSelection をコンシューマーに通知します。

DocumentSelection はこのサービス用のクラスで、文書のコレクションを表すために使用されます。各文書は、IDocumentContext オブジェクトを通じて自分自身の情報を提供します。このプラグインでは、Eclipse プラットフォームによって提供された選択内容をどのように変換するのかを示すロジックが注目されます。

特定のオブジェクト用にオーバーライドされない限り、この変換は内部 DocumentContext クラスのコンストラクター内で行われます。関連する情報を抽出する鍵となるのは、IAdaptable という Eclipse の概念です。

この柔軟なフレームワークでは、任意のオブジェクトを別の型に変換できます。変換は直接または間接的に実行できます。直接変換するには、その Object の型にするか、IAdaptable をインプリメントします。間接的に変換するには、プラットフォームを通じて、org.eclipse.core.runtime.adapters 拡張ポイントを使用します。これにより、ある Object から別の Object に変換するために、リスト 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() メソッドを使用して、選択された Object のタイトル、URI、アイコン、およびプロパティーを取得します。まず、DocumentContext は、Lotus Notes がブックマークする内容を知るために用いる IURIProvider を使おうと試みます。IURIProvider は、これらのすべてのアイテムを提供します。タイトルまたはアイコンを発見できない場合、DocumentContext は、これらの詳細を保持している可能性がある IWorkbenchAdapter インターフェースを使用します。URI がない場合、DocumentContext は Object を直接 URI クラスに適応させることを試みます。最後に、DocumentContext は IPropertySource インターフェースを使用して、他のさまざまなプロパティーを把握しようと試みます。これらの試みが失敗すると、DocumentContext はリターンして、現在の IViewPart からの情報を使用します。

com.ibm.lotuslabs.context.ui.test プラグインは、DocumentContextService がレポートしているものを現在の文書として表示するサイドバー・パネルを提供します。図 1 を参照してください。

図 1. コンテキスト・サイドバー
コンテキスト・サイドバー

Todo ツールバー

com.ibm.lotuslabs.todo.ui プラグインは、前の記事で取り上げた SideNote の概念および Journal ツールバーを拡張して得られたもう 1 つのツールバーを提供します。Todo ツールバーを使用すると、Todo アプリケーションの起動、新規タスク・フォームの表示、およびタスクの迅速な作成を行うことができます (図 2 参照)。違いは、このツールバーは DocumentContextService を使用して、現在の文書を参照するタスクを作成している点です。

図 2. クイック・タスクの作成
クイック・タスクの作成

現在の文書に関する、または現在の文書からタスクを作成するという概念は、アプリケーション間の結合を強めるため、生産性を高めることになります。作成された新規タスクには、ユーザーが入力したテキストと、元になる文書へのリンクが含まれています。図 3 を参照してください。

図 3. リンク付きの新規タスク
リンク付きの新規タスク

このツールバーの提供に関するすべての内容は、リンクを追加する機能を除き、前の記事 「IBM Lotus Notes 8 のサイドバーおよびツールバーに Lotus Notes データを統合する」 で説明した Journal ツールバーと同じです。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);

これでダイアログが表示されるときに、この選択 Object を使用してリンク項目を生成できます。ユーザーが「Quick」を選択すると、選択内容からタイトルと URI が抽出されます。SideNote オブジェクトは、チェック・マーク用のテキストを設定し、ユーザーが閉じるときにオプションがチェックされているかどうかを調べる機能を持っています。

ユーザーがオプションを選択したかどうかにかかわらず、このコードは com.ibm.lotuslabs.notes.pim プラグインを使用してタスクを作成します。つまり、TodoTask.createTask() メソッドを呼び出します。これは入力として新規タスクのテキストおよびタイトルを受け取ります。また、テキストの上に含めるリンクの配列も受け取ることができます。

createTask() メソッドは、「IBM Lotus Notes 8 のサイドバーおよびツールバーに Lotus Notes データを統合する」で説明した NotesJob フレームワークを使用します。ジャーナル・エントリーを作成するときと同様に、正しいアイテムを使用して新規文書を作成する必要があります。具体的には、タイトルおよび本文を設定し、タスク・フォームが検索する他のフィールド (重要性、期限など) を入力します。

本文を作成するとき、渡されたリンクを追加できます。この方法を示すコードをリスト 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 をリンクとして使用できます。このメソッドは、特に notes:// URL をチェックします。これが見つかると、メソッドはカスタム Lotus Notes リンクを作成し、それ以外の場合は、リンク自身を単にテキストに追加します。


Journal It

SideNote は、テキストを書き留める単一の場所を提供するサイドバー内のアプリケーションです。しかし、実際にはテキストの保存を目的としていません。Journal It は同じ場所を使用しますが、異なる手法を用います。Journal It により、ユーザーは、単一のメモではなく、各文書ごとにメモを保存できます。図 4 を参照してください。

図 4. Journal It アプリケーション
Journal It アプリケーション

Journal It 内でメモを作成すると、エントリーが現在の文書にリンクされます。ユーザーはサイドバーで電子メールに関するメモを作成できます。この時点から、その電子メールが表示されるたびに対応するメモが表示されます。

com.ibm.lotuslabs.journal.ui.context プラグインは、JournalCurrentViewPart パートを Lotus Notes サイドバーに提供します。この ViewPart は DocumentContextService をサブスクライブし、ユーザーによる文書の切り替えを検出します。文書の URI は ID にマッピングされます。この ID を使用して、ジャーナル・データベースのビュー内で文書を検索します。文書が存在しない場合、Journal It はサービスからのタイトルを使用します。ユーザーが実際に変更を行った場合は、その ID を使用してデータが保存されます。

ジャーナル・エントリーの実際の表示は、com.ibm.lotuslabs.notes.pim プラグインの JournalNote Composite を使用します。Lotus Notes データが背後にあるこのような UI コンポーネントを保持する試みにより、スレッド問題を処理します。つまり、UI スレッドからはジャーナル・データベースに接続できない問題です。

JournalNotes は、createValueMap() と呼ばれる静的メソッドを使用してスレッド問題を処理します。このメソッドは、Document Object を受け取り、UI の初期化に必要なものを Map に含めます。この Map は NotesJob で作成されるため、すべてのハード・ワークはこの別スレッドで行われます。その後、Map を UI スレッドに渡し、コントロールを作成することができます。

ただし、この Map を作成する前に、ビュー内で文書を見つける必要があります。JournalIt ビューは、JournalSidebarUtil クラスの createSidebarView() メソッドによって初めて必要になるときに、作成されます。このビューは、データベース内で JournalIt ID フィールドを持つすべての文書を表示します。さらに、このビューが作成されるときに、これらの文書が表示されないように、データベース内の他のビューが更新されます。このアクションにより、By Category ビューがユーザー用に同じ状態に保たれます。検索では、指定された ID 値を用いて view.getDocumentByKey() メソッドが使用されます。

文書サービスが新規文書に関して通知するときに、アプリケーションはユーザーによる変更が行われたかどうかをチェックします。何らかの変更が行われている場合は、新規ジャーナル・エントリーが作成されるか、前のエントリーの件名およびテキストが変更されます。


制限

IBM Lotus Notes 8 にはいくつかの制限があります。最も大きな制限としては、非 PIM ビューで文書が選択されている場合、その文書のタイトルが正しくありません。特に、DocumentContextService は、ビューのタイトルを文書のタイトルとしてレポートします。

他の問題として、現在、サービスは組み込みブラウザーが表示している Web サイトの URL をレポートしません。Eclipse インターフェースを使用することの主な利点の 1 つとして、すべてのタイプのコンポーネントが参加できる点が挙げられます。組み込みブラウザーは、IViewPart を通じてその選択内容を報告することだけが必要です。これが行われた後、Journal It などのアプリケーションは、Lotus Notes 文書、Web ページ、および選択内容をレポートするその他のすべてを処理します。


まとめ

3 つの記事にわたり、Lotus Notes ユーザー・インターフェースにコンポーネントを挿入する方法、Lotus Notes データにアクセスし変更する方法、およびユーザーのコンテキストを利用する方法について説明してきました。これらの機能をすべて組み合わせることで、エキサイティングなアプリケーションを作成できます。

特に、任意の時点でユーザーが何をしているかに合わせてアプリケーションを調整するという概念は、強力なものになるでしょう。この記事で取り上げたサービスおよびサンプルは、このような開発を始めるために役立ちます。


ダウンロード

内容ファイル名サイズ
Sample codecontext.zip55 KB

参考文献

学ぶために

製品や技術を入手するために

  • Eclipse をダウンロードできます。
    Eclipse(US)

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=337943
ArticleTitle=IBM Lotus Notes 8 のサイドバーおよびツールバーでのユーザー・コンテキストの活用
publish-date=07242007