« テキストエディタで指定位置へジャンプ | トップページ | テキストエディタのコンテキストメニューID »

2004.09.09

MarkerUtilitiesクラス

リソースへのマーキング」で,マーカーの作成方法を紹介した。これに関して,例えば,

  IMarker marker = ...;
  marker.setAttribute(IMarker.CHAR_START, new Integer(20));
  marker.setAttribute(IMarker.CHAR_END, new Integer(25));

としてしまうと,setAttributeメソッドの呼び出しのたびにリソースの変更を監視しているリスナーに通知が行われてしまう(上記では2回連続して呼び出されてしまう)ので,あまりよろしくない。その代わりに,

  Map map = new HashMap();
  map.put(IMarker.CHAR_START, new Integer(20));
  map.put(IMarker.CHAR_END, new Integer(25));
  marker.setAttributes(map);

というようにして,属性の設定時には通知が一回で済むようにしましょう,ということを「リソースへのマーキング」で取り上げた。

しかし,マーカーの作成は,マーカー自身の作成と属性の設定が同時に行われることがほとんどである。マーカーを作成した時点で,リソースの変更を監視しているリスナーに通知が行われてしまうために,

  IResource resource = ...;
  IMarker marker = resource.createMarker(IMarker.TASK);
  Map map = ...;
  marker.setAttributes(map);

としてしまうと,リスナーへの通知が2度行われてしまう。たかがリスナーへの通知が2回行われるだけだと簡単に思うなかれ,処理の内容的に問題がなくても速度的な問題が発生してしまう可能性は十分にある。

では,それを避けるためにはどうすればいいかというと,Eclipseでは便利なMarkerUtilitiesクラスを提供してくれている。MarkerUtilitiesクラスのcreateMarkerメソッドを使用することで,マーカーの作成および属性のセットを一まとめにすることができ,リスナーへの通知も1回のみになる

  IResource resource = ...;
  Map map = new HashMap();
  MarkerUtilities.setCharStart(map, 20);
  MarkerUtilities.setCharEnd(map, 25);
  MarkerUtiltites.createMarker(resource, map, IMarker.TEXT);

属性を格納するコレクションは自分で確保するのだが,コレクションへの属性値の追加は「標準マーカーの属性」で紹介したものについては便利メソッドが提供されている(上記コード中のsetCharStartメソッドなど)。リソースオブジェクト,属性が格納されたコレクション,そしてマーカーの種別を表すID文字列をMarkerUtilitiesクラスのcreateMarkerメソッドに渡すことでマーカーが作成され,その結果のリソースの変更通知は1回で抑えられる。

ここで注意すべき点は,MarkerUtilitiesクラスのcreateMarkerメソッドは,作成したIMarkerオブジェクトを返却してくれないということだ。例えば「テキストエディタで指定位置へジャンプ」をしようとした際,マーカーをMarkerUtilitiesクラスを使って作成してもIMarkerオブジェクトを得ることができないために,gotoMarkerメソッドが使えない。その場合は複数回のリスナーへの通知を抑えることはあきらめるか,MarkerUtilities#createMarker()の内容を自分で記述するしかない。ちょっと残念である。

|

« テキストエディタで指定位置へジャンプ | トップページ | テキストエディタのコンテキストメニューID »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: MarkerUtilitiesクラス:

« テキストエディタで指定位置へジャンプ | トップページ | テキストエディタのコンテキストメニューID »