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); }