新しいクラスのリンク作成

IlvPolylineLinkImage クラス

次の例は、新しいリンクのクラスの開始を示したものです。
public class IlvPolylineLinkImage extends IlvLinkImage 
{ 
  private IlvPoint points[] = null;
 
  public IlvPolylineLinkImage(IlvGraphic from, IlvGraphic to, 
                              boolean oriented, IlvPoint[] points) 
  { 
    super(from, to, oriented);
    init(points); 
  ...
}
}
新しいリンクはポリラインで定義したリンクで、開始位置と終了位置は固定されており、ノードの開始位置と終了位置に基づいています。このリンクは、 IlvLinkImage クラスのサブクラスです。
プライベート・フィールド points は、リンクのすべての中間点を含みます。この配列にはリンク元およびリンク先の点は含まれていません。
コンストラクターは対応する IlvLinkImage のコンストラクターを呼び出し、オブジェクトを初期化します。次に init メソッドが以下のように points フィールドを埋めます。
private void init(IlvPoint[] pts) 
{ 
  if (pts == null) 
    return; 
  int i; 
  points = new IlvPoint[pts.length]; 
  for (i = 0; i < pts.length ; i++) 
    points[i] = new IlvPoint(pts[i].x, pts[i].y); 
}
オブジェクトのコピーを可能にするコピー・コンストラクトとコピー・メソッドもあります。
public IlvPolylineLinkImage(IlvPolylineLinkImage source) 
{ 
  super(source); 
  init(source.points); 
}

public IlvGraphic copy()
{
  return new IlvPolylineLinkImage(this);
}

getLinkPoints

getLinkPoints メソッドは、リンクの形状を定義する点を返します。このメソッドは、 IlvLinkImage がオブジェクトを描画し、オブジェクトの矩形領域を定義する際に使用します。IlvLinkImage クラスでは、このメソッドはリンク起点とリンク終点のみを返します。新しい折れ線オブジェクトに対しては、getLinkPoints メソッドがリンクの中間点を次のように追加します。
public IlvPoint[] getLinkPoints(IlvTransformer t)
{ 
  int nbpoints = getPointsCardinal(); 
  IlvPoint[] pts = new IlvPoint[nbpoints]; 
  if (nbpoints > 2) 
    for (int i = 1 ; i < nbpoints-1; i++) {
      pts[i] = new IlvPoint(points[i-1]); 
      if (t != null) t.apply(pts[i]);
    } 
  pts[0] = new IlvPoint(); 
  pts[nbpoints-1] = new IlvPoint();
  getConnectionPoints(pts[0], pts[nbpoints-1], t); 
  return pts; 
}
中間点の取得には、getConnectionPoints メソッドを使用します。getConnectionPoints メソッドは、リンク起点とリンク終点を計算します。これらのピンは、リンク元オブジェクトまたはリンク先オブジェクトの接続ピンによって異なります。

getPointCardinal、getPointAt

IlvPolyPointsInterface インターフェースから派生するこれらのメソッドは、次のように定義します。
public int getPointsCardinal() 
{ 
  if (points == null) 
    return 2; 
  else 
    return points.length +2;
}
 
public IlvPoint getPointAt(int index, IlvTransformer t) 
{ 
  if (index == 0 || index == getPointsCardinal()-1) 
  { 
   IlvPoint[] pts = new IlvPoint[2]; 
   pts[0] = new IlvPoint(); 
   pts[1] = new IlvPoint(); 
   getConnectionPoints(pts[0], pts[1], t); 
   return pts[(index == 0) ? 0 : 1]; 
  }  
  else 
  { 
    IlvPoint p = new IlvPoint(points[index-1]); 
    if (t != null) 
      t.apply(p); 
    return p; 
  }
}

allowsPointInsertion、allowsPointRemoval

allowPointAddition メソッドと allowPointRemoval メソッドは、true を返すようにオーバーライドされます。これによってリンクに関連した編集インタラクター (つまり IlvLinkImageEditInteractor) は点を追加および削除できるようになります。
public boolean allowsPointInsertion() 
{ 
  return true; 
}
 
public boolean allowsPointRemoval()
{   return points != null && points.length >= 1; 
}
これらのメソッドは true を返すため、insertPoint メソッドと removePoint メソッドはインタラクターから呼び出されます。次のように定義されます。
public void insertPoint(int index, float x, float y, 
                        IlvTransformer t) 
{
  if (points == null && index == 1) {
    points = new IlvPoint[1]; 
    points[0] = new IlvPoint(x,y);
  } 
  else if (index == 0) 
    throw new IllegalArgumentException("bad index");
  else if (index >= getPointsCardinal()) 
    throw new IllegalArgumentException("bad index"); 
  else index --; 
  if (index >= 0 && index <= points.length){ 
    IlvPoint[] oldp = points;
    points = new IlvPoint[oldp.length+1]; 
    System.arraycopy(oldp, index, points, index + 1, 
                     oldp.length - index);
    points[index] = new IlvPoint(x,y); 
    if (index > 0) 
      System.arraycopy(oldp, 0, points, 0, index);
  } 
  else throw new IllegalArgumentException("bad index");
}
 
public void removePoint(int index, IlvTransformer t) 
{ 
  if (index ==0) return;
  if (index == getPointsCardinal()-1) 
    return; 
  index --;
  if (points != null && index >= 0 && index < points.length) 
  {
    IlvPoint[] oldp = points;
    points = new IlvPoint[oldp.length-1];
    if (index > 0) 
      System.arraycopy(oldp, 0, points, 0, index); 
      int j = oldp.length - index - 1;
      if (j > 0) 
      System.arraycopy(oldp, index + 1, points, index, j); 
  } 
  else throw new IllegalArgumentException("bad index"); 
}

applyTransform

例えば、オブジェクトが移動または拡大されたときにバウンディング・ボックスを変更すると、メソッド applyTransform が呼び出されます。変換が中間点に適用されます。
public void applyTransform(IlvTransformer t) 
{ 
  if (getPointsCardinal() > 2 && points != null) 
    for (int i = 0 ; i < points.length; i++) {
     if (t != null) t.apply(points[i]); 
    }
}

入出力

中間点の保存と読み込みを実行できるようにするには、入出力メソッドが必要です。
write メソッドは次のように定義されます。
public void write(IlvOutputStream stream) throws IOException 
{ 
  super.write(stream); 
  stream.write("points", points);
}
該当する IlvInputStream コンストラクターは次のとおりです。
public IlvPolylineLinkImage(IlvInputStream stream) throws
                                              IlvReadFileException 
{ 
  super(stream); 
  IlvPoint[] points = stream.readPointArray("points");
  init(points); 
}