グラフ間リンクの作成とアクセス

グラフ間リンクを作成できるようにするには、入れ子グラファー (IlvGrapher) の階層が必要になります。階層にマネージャー ( IlvManager) を含めることはできません。そうしないと、ライブラリーではグラフ間リンクの作成ができないためです。

グラフ間リンクの作成

リンク元とリンク先のグラファーが異なるグラフ間リンクの場合、どちらのグラファーにリンクを格納するかということが問題になります。グラファー A に格納されたノードとグラファー B に格納されたノードは、次の図に示したように、A と B の最初の共通の上位に格納される必要があります。
commongrapher.gif
グラファー階層におけるグラフ間リンク
この図では、オブジェクト A とオブジェクト B を接続する赤いグラフ間リンクは、A と B の最初の共通の上位であるグラファー C に格納される必要があります。
IlvGrapher クラスは、 最初の共通グラファーを決定できるスタティック・ユーティリティー・メソッドを提供します。
static IlvGrapher getLowestCommonGrapher(IlvGraphic obja, IlvGraphic objb)  
グラフ間リンクを作成する際のコードは、 変数のリンク元とリンク先が同じグラファーに作成・追加されたと推定する場合、 次のようになります。

IlvGraphic origin, destination;
IlvLinkImage link;

...

link = new IlvLinkImage(origin, destination, false);

IlvGrapher common = IlvGrapher.getLowestCommonGrapher(origin, destination);

common.addLink(link, false);
IlvGrapher.addInterGraphLink スタティック・ユーティリティーでは、 共通の親グラファーに直接リンクを追加できます。
static void addInterGraphLink(IlvLinkImage link, boolean redraw)  
前の例で示されているコードは、以下のようになります。
IlvGraphic origin, destination;
IlvLinkImage link;

...

link = new IlvLinkImage(origin, destination, false);

IlvGrapher.addInterGraphLink(link, false);

グラフ間リンクへのアクセス

IlvGrapher クラスは、グラファーに格納されたグラフ間リンクへの効率的なアクセスを可能にするメソッドも提供します。
IlvGraphicEnumeration getInterGraphLinks()  
int getInterGraphLinksCount()  
グラフ間リンクはグラファー内の他のリンクと同じように格納されているため、そのリンクはクラス IlvManagergetObjects メソッドが返すこのグラファーの全オブジェクト一覧の一部でもあります。
IlvGraphicEnumeration getObjects()  
しかし、getInterGraphLinks メソッドの呼び出しはグラファーのすべてのオブジェクトを走査する方法よりはるかに効率的です。
グラフ間リンクをグラファー内の他のオブジェクトと区別するには、IlvGrapher クラスの次のメソッドを使用できます。
boolean isInterGraphLink(IlvGraphic obj)  
指定したグラフィック・オブジェクトが、他のグラファーに格納されたリンク元またはリンク先と一緒にグラファー内に格納されるリンクである場合、このメソッドは true を返します。すなわちこれは、グラフィック・オブジェクトがグラフ間リンクである場合です。
IlvGrapher クラスにより、グラファーに出入りするグラフ間リンクにアクセスすることもできます。そのようなリンクへは、次のメソッドでアクセスできます。
IlvGraphicEnumeration getExternalInterGraphLinks()  
int getExternalInterGraphLinksCount()  
getInterGraphLinks メソッドと getExternalInterGraphLinks メソッドの違いは、次のとおりです。
  • 最初のメソッド getInterGraphLinks は、別のグラファー内にリンク元またはリンク先と共にグラファー内に格納されているグラフ間リンクを返します。
  • 2 つ目のメソッド getExternalInterGraphLinks は、別のグラファー内に格納されているが、このグラファー内にリンク元またはリンク先と共にグラファー内に格納されているグラフ間リンクを返します。
グラファーにサブグラファーがない場合は、getExternalInterGraphLinks() によって取得された外部グラフ間リンクは、グラファーのすべてのリンク元またはリンク先です。
グラファーにサブグラファーがある場合、グラファーから出るグラフ間リンクには、次のいずれかが含まれます。
  • このグラファーの終了ノード
  • このグラファーのサブグラファーの終了ノード
グラファーで getExternalInterGraphLinks() を呼び出すと、グラファーの終了ノードを持つリンクのみが取得され、グラファーのサブグラファーの終了ノードを持つリンクは取得されません。
この場合、グラファーの入れ子階層のリンク元またはリンク先は、サブグラファーの外部リンク間グラフをすべて再帰的に検証することによって取得できます。このタスクを容易にするために、便利メソッドが用意されています。つまり、getTreeExternalInterGraphLinks メソッドと getTreeExternalInterGraphLinksCount メソッドです。
グラファーを移動するときに、グラフとその入れ子サブグラファーを画面の新しい場所に表示することができます。グラファーの変位により、次のリンクの形状が変わります。
  • グラファーに直接接続しているすべてのリンク。すなわち、グラファーをリンク元またはリンク先としているリンク。
  • grapher.getTreeExternalInterGraphLinks(). によって取得されたすべてのリンク。
次の図は、互いにリンクしている入れ子グラファーを示しています。
externalintergraphlink.gif
外部グラフ間リンク
グラファー A には、B と D の 2 つのグラファーが含まれています。グラファー B には別のグラファー C が含まれています。オブジェクト C からオブジェクト D へのグラフ間リンクは A に格納されます。
このリンクは、A のグラフ間リンク (A で呼び出された getInterGraphLinks で返されたもの) であり、また C と D の外部グラフ間リンク (C または D で呼び出された getExternalInterGraphLinks で返されたもの) でもあります。
グラフ間リンクのリンク元も、リンク先もグラファー B 内では終わらないため、このリンクは、B での getExternalInterGraphLinks の呼び出しでは返されません。ただし、B の内部ではそのソース・ノードが入れ子になっているため、B での getTreeExternalInterGraphLinks の呼び出しでリンクが返されます。