iDotメモ2(idot.DotDisplayクラス)

idot.DotDisplayクラス

DotDisplayクラスはprefuseグラフィックライブラリのprefuse.Displayクラスを継承している。
prefuse.Displayクラスはprefuse.Visualizationクラスのコンテンツを表示する役割がある。
DotDisplayクラスのコンストラクタはiDotクラスのコンストラクタからコールされる。
DotDisplayクラスのコンストラクタを見てみる。

/**
* Creates a new DotDisplay initialized with the given graph
*
* @param graph
* the graph to load to the display
*/

public DotDisplay(Graph graph) {//①
  this(graph, new Visualization());
}

/**
* Creates a new DotDisplay initialized the given graph and visualization
*
* @param graph
* the graph to load to the display
* @param visualization
* the visualization that will be used provide the visual
* counterparts for the objects in the graph
*/

public DotDisplay(Graph graph, Visualization visualization) {//②
  super();
  setHighQuality(true);//③
  setVisualization(visualization);//④

  // initialize renderers ⑤
  MultilineTextItemRenderer nodeRenderer = new MultilineTextItemRenderer(
                         MultilineTextItemRenderer.CENTER);
  TransitionRenderer edgeRenderer = new TransitionRenderer();
  DefaultRendererFactory rf = new DefaultRendererFactory(nodeRenderer,edgeRenderer);
  rf.add(“INGROUP(‘edgeLabels’)”, new LabelRenderer() {//⑥
    public void render(Graphics2D g, VisualItem item) {

      // make sure edge labels are at correct positions before rendering them
      if (item.canGet(“lp2”, double[].class)) {
        double[] xy = (double[]) item.get(“lp2”);
        if (xy != null) {
          item.setX(xy[0]);
          item.setY(xy[1]);
          super.render(g, item);
        }
      }
    }
  });

  // hide invisible nodes and edges
  rf.add(“style=’invis'”, new NullRenderer());
  m_vis.setRendererFactory(rf);

  // initialize display ⑦
  setBackground(Color.WHITE);
  addControlListeners();//⑧
  addLayouts();//⑨
  setGraph(graph);//⑩
}

iDotクラスのコンストラクタからDotDisplayのコンストラクタ①がコールされる。
コンストラクタ①はコンストラクタ②をコールする。
③レンダリングの品質に関する設定で、falseにすると表示が粗くなる。
④purefuse.Visualizationオブジェクトを設定している。
Visualizationはprefuseグラフィックライブラリの中でも重要なクラスのようだ。
⑤からはレンダラーファクトリ作成処理である。idot.util.MultilineTextItemRendererはノードのレンダラーで、複数行に渡るテキストと枠線を描くクラス。idot.util.TransitionRendererは、ノードとノードをつなぐ線(=edge)を描くクラス。
⑥さらにedgeラベル用のレンダラーをDefaultRendererFactoryに追加している。
DefaultRendererFactory#add(String predicate, Renderer r)のpredicateは、
rのレンダリング対象とするVisualItemを決めるための条件である。
ここでは、’edgeLabels’グループに属するVisualItemという条件。
⑦DefaultRendererFactoryを④で設定したVisualizationに設定する。
⑧コントロールリスナーを追加する
⑨レイアウトを追加する
⑩Graphオブジェクトを設定する。

次に⑧のコントロールリスナー登録メソッド(addControlListeners())を見てみる。
このメソッドでは、VisualizationへのActionListの登録とDotDisplayへのControlの登録をしている。

/**
* Adds the needed control listeners and action lists to the display.
*/

private void addControlListeners() {
  // update takes care of colors and font sizes
  ActionList update = new ActionList(m_vis);
  ColorAction color = new ColorAction(GRAPH_GROUP, VisualItem.STROKECOLOR) {//①
    @Override
    public int getColor(VisualItem item) {
      // honor the value of the color attribute
      if (item.canGetInt(“color”)) {
        return item.getInt(“color”);
      }
    return super.getColor(item);
    }
  };
  // base color is black
  color.setDefaultColor(ColorLib.rgb(0, 0, 0));
  update.add(color);

  // text is always black
  color = new ColorAction(GRAPH_GROUP, VisualItem.TEXTCOLOR);//②
  color.setDefaultColor(ColorLib.gray(0));
  update.add(color);

  // arrow heads are filled with color from the attribute, and nodes with white
  color = new ColorAction(GRAPH_GROUP, VisualItem.FILLCOLOR) {//③
    @Override
    public int getColor(VisualItem item) {
      // honor the value of the color attribute
      if (item instanceof EdgeItem && item.canGetInt(“color”)) {
        return item.getInt(“color”);
      } else if (item instanceof NodeItem
            && item.getString(“shape”).equalsIgnoreCase(“point”)) {
        return item.getStrokeColor();
      }
      return super.getColor(item);
    }
  };

  color.add(“ingroup(‘” + GRAPH_EDGES + “‘)”, ColorLib.gray(0));
  color.setDefaultColor(ColorLib.gray(255));
  update.add(color);

  // hilighted nodes and edges are drawn with doubled lines
  // StrokeAction stroke = new StrokeAction(GRAPH_GROUP);
  // stroke.add(“_highlight”, StrokeLib.getStroke(2));
  // update.add(stroke);

  update.add(new FontAction() {//④
    public Font getFont(VisualItem item) {
      String fontname = currFont.getFamily();
      int fontsize = currFont.getSize();
      if (item.canGetString(“fontname”)) {
        fontname = item.getString(“fontname”);
      }
      if (item.canGetInt(“fontsize”)) {
        fontsize = item.getInt(“fontsize”);
      }
      return FontLib.getFont(fontname, fontsize);
      // return currFont;
    }//
  });

  ShapeDecoder sd = new ShapeDecoder(“shape”);//⑤
  update.add(sd);
  StrokeAction sa = new StrokeAction(GRAPH_GROUP, new BasicStroke());//⑥
  sa.add(“style=’bold'”, new BasicStroke(2));
  // this is alternative to using a NullRenderer, although this is not completely invisible
  // sa.add(“style=’invis'”, new BasicStroke(0));

  update.add(sa);
  update.add(new RepaintAction());
  m_vis.putAction(“update”, update);//⑦
  addControlListener(new ZoomControl());//⑧
  addControlListener(new PanControl());
  addControlListener(new InvertedWheelZoomControl());
  addControlListener(new FocusControl(0));
  Controller c = new Controller();
  controller = c;
  addControlListener(c);
}

①線の色の設定。
itemのcolorフィールドに設定があればその設定値を、なければ黒。
②テキストの色(=黒)の設定。
③矢印のヘッドとノードの内部の色の設定。
itemのcolorフィールドに設定があればその設定値を、なければ矢印のヘッドは黒、ノードの内部は白。
④フォントの設定。
⑤ノードの形の設定。VisualItemのデータフィールド”shape”の値で形が決定することを設定している。
⑥線の太さの設定
⑦これまでの設定を”update”という名前を付けてVisualizationに登録する。
⑧からはコントロールの登録
ZoomControl:ビューア画面上のマウス右ボタンドラッグで拡大縮小
PanControl:背景のマウス左ボタンドラッグで全体が移動
InvertedWheelZoomControl:マウスホイールの回転で拡大縮小
FocusControl:ノードやエッジ(矢印)へのカーソルのフォーカスイベントで起動するコントローラ
Controller:専用コントローラ。DotDisplayのインナークラスで定義
Controllerクラスでは、イベント発生時の処理をしている。主な機能は次のとおり。

  • nodeのダブルクリックで子ノードを表示する
  • nodeまたはedgeのドラッグ

iDotメモ1へ  iDotメモ3へ

Leave a Reply

CAPTCHA