選択されたグラフィック・オブジェクトのインタラクターのカスタマイズ

選択インタラクター (IlvSelectInteractor) もビュー・インタラクターです。 このインタラクターより、オブジェクトの選択、移動、および形状変更が可能となります。 オブジェクトの形状変更の仕方はオブジェクトのタイプによって異なります。 例えば、IlvRectangle の場合はサイズしか変更できませんが、IlvPolygon の場合はこれにポイントを追加することができます。 有効なインタラクションのオブジェクトのタイプへの依存は、オブジェクトの選択に関連付けられたオブジェクト・インタラクターに現れます。
オブジェクトが選択されると、適切な選択オブジェクト (IlvSelection のサブクラス) を作成するためにメソッド makeSelection が呼び出されます。 この選択オブジェクトは選択されたオブジェクトの上に描画されます。
IlvSelectionIlvGraphic のサブクラスであるので、オブジェクト・インタラクターを持つことができます。 選択インタラクターが選択オブジェクトの上にマウスを移動するとき、選択オブジェクトのオブジェクト・インタラクターについて照会します。
オブジェクト・インタラクターが選択オブジェクトで明示的に設定されていない場合は、getDefaultInteractor を呼び出してデフォルト・インタラクターのクラス名を取得してから、選択オブジェクトのオブジェクト・インタラクターをデフォルト・インタラクターのインスタンスに設定します。
その後、選択インタラクターがすべてのイベントを選択のオブジェクト・インタラクターに送ります。 このオブジェクト・インタラクターは、マウスが選択オブジェクトの上にある限り、マウス・イベントを受け取ります。
選択オブジェクトのオブジェクト・インタラクターは、元の選択されたオブジェクトを形状変更することによって、受け取ったイベントに影響を及ぼすことができます。 ほとんどの場合、選択オブジェクトのオブジェクト・インタラクターは、選択オブジェクト自体ではなく元の選択されたオブジェクトを変更します。
選択されたオブジェクトにカスタマイズされた選択およびカスタマイズされた形状変更インタラクションを使用して新しいグラフィック・オブジェクト・クラスを作成するには、次のようにします。
  1. 新規グラフィック・オブジェクト・クラスの作成」に説明されているように、IlvGraphic の新しい派生クラスを作成します。
  2. 独自の選択オブジェクトの作成」に説明されているように、IlvSelection の新しい派生クラスを作成します。
  3. オブジェクトを選択するのではなく、選択されたオブジェクトに影響を及ぼす新しいオブジェクト・インタラクターを作成します。
  4. 派生グラフィック・クラスで、makeSelection をオーバーライドして新しい選択クラスのインスタンスを返します。
  5. 新しい選択クラスで、getDefaultInteractor をオーバーライドして新しいオブジェクト・インタラクターのクラス名を返します。 あるいは、割り振り時に選択オブジェクトで setObjectInteractor を呼び出すこともできます。 前者は、IlvSelection の新規サブクラスのすべてのインスタンスに対して同じインタラクターを持ちたい場合により便利であり、一方、後者は、選択したオブジェクトの特定のインスタンスに特定のオブジェクト・インタラクターを割り当てたい場合に使用することができます。
次のコード例は、特殊な選択オブジェクト MyMarkerSelection を持つ新しいグラフィック・サブクラス MyMarker を作成するものです。 マーカーが選択されると、オブジェクト・インタラクター MyMarkerEdition がアクティブになります。 マーカー選択をクリックするごとにマーカーのタイプが (したがって形状も) 変わります。
public class MyMarker extends IlvMarker
{
   ...
 
  public IlvSelection makeSelection()
  {
    return new MyMarkerSelection(this);
  }
}

public class MyMarkerSelection extends IlvUnresizeableDrawSelection
{
  ...

  public String getDefaultInteractor()
  {
    return MyMarkerEdition.class.getName();
  }
}

public class MyMarkerEdition extends IlvReshapeSelection
{
  public MyMarkerEdition()
  {
    super();
  }

  protected boolean handleButtonDown(IlvDrawSelection sel, MouseEvent event,
                                     IlvObjectInteractorContext context)
  {
    // each click with the left mouse button into the selection object
    // changes the type of the selected object

    if ((event.getModifiers() & InputEvent.BUTTON2_MASK) != 0 ||
        (event.getModifiers() & InputEvent.BUTTON3_MASK) != 0)
      return true;

    MyMarkerSelection msel = (MyMarkerSelection)sel;
    MyMarker marker = (MyMarker)msel.getObject();

    // even though the object interactor is on the selection, it
    // modifies the selected object, not the selection
    final int tp = (marker.getType() >= 512 ? 1 : marker.getType() * 2);
    IlvGraphicBag bag = marker.getGraphicBag();
    if (bag == null)
      marker.setType(tp);
    else
      bag.applyToObject(marker, new IlvApplyObject() {
          public void apply(IlvGraphic g, Object arg) {
            ((MyMarker)g).setType(tp);
          }
        }, null, true);
    return true;
  }
}