カスタマイザの仕様

Reportクラスのコンストラクタには、 帳票の内容を動的に書き換えるためにカスタマイザというオブジェクトを渡すことができます。

カスタマイザオブジェクトを作成するには、 以下のように定義されたIReportCustomizerインターフェースを実装します。

  ' .NET (VisualBasic)
  Public Interface IReportCustomizer
  
    Function ContentRegion( _
      ByVal content As Content, _
      ByVal evaluator As Evaluator, _
      ByVal region As Region) As CRegion
  
    Sub PageAdded( _
      ByVal report As Report, _
      ByVal pages As ReportPages, _
      ByVal page As ReportPage)
  
    Sub RenderContent( _
      ByVal content As Content, _
      ByVal evaluator As Evaluator, _
      ByVal region As Region, _
      ByVal elementDesigns As ElementDesigns)
  
  End Interface
  // Java
  public interface IReportCustomizer {

    Region contentRegion(
      Content content,
      Evaluator evaluator,
      Region region);

    void pageAdded(
      Report report,
      ReportPages pages,
      ReportPage page);

    void renderContent(
      Content content,
      Evaluator evaluator,
      Region region,
      ElementDesigns elementDesigns);

  }

それぞれのメソッドについて説明します。

ContentRegionメソッド

ContentRegionメソッドは、コンテントの表示領域を決定する際に呼ばれます。 このメソッドの戻り値がコンテントの表示領域となります。 NULLを返した場合は、このコンテントは表示されません。

デフォルトの表示領域は引数regionに渡されるので、 特に変更をしない場合は、これをそのまま戻り値とします。 変更する場合は、regionを直接書き換えるのではなく、 以下のコンストラクタでコピーを作成してから変更します。

  // C#
  Region _region = new Region(region);

  // _regionに何らかの修正を加える
  ...

  return _region;
  ' VisualBasic
  Dim _region As New Region(region)

  ' _regionに何らかの修正を加える
  ...

  Return _region
  // Java
  Region _region = new Region(region);

  //_regionに何らかの修正を加える
  ...

  return _region;

機能サンプルの「サイズ変更」に、このメソッドを利用した例があります。

PageAddedメソッド

PageAddedメソッドは、新しいページが作られるたびに呼ばれます。

引数で渡されるpagesは今までに作成されたページのリストで、 pageはたった今作成されたページです(pagesの最後の要素はpageとなっています)。

機能サンプルの「ページ挿入」に、このメソッドを利用した例があります。

RenderContentメソッド

RenderContentメソッドは、コンテントに要素を描画する直前に発生します。

コンテントに含まれる要素の定義は、ElementDesignというオブジェクトでラップされ、 引数のElementDesignsオブジェクトに格納されて渡されます。 ElementDesignsには以下のメソッドが用意されています。

メソッド 説明
Find(id) 指定された識別子を持ったElementDesignを返します
見つからなければNULLを返します
SelectByType(type) 指定されたtypeを持ったElementDesignのリストを返します

個々の要素を表すElementDesignオブジェクトには、以下のメソッドが用意されています。

メソッド 説明
IsNull(key) 指定されたkeyに対応するプロパティ値が
NULLまたは指定されていなければTrueを返します
Get(key) 指定されたkeyに対応するプロパティ値を返します
Put(key, value) 指定されたkeyに対応するプロパティ値をvalueに設定します
Child(key) 指定されたkeyに対応するプロパティ値の
オブジェクトをラップしたElementDesignを返します

ElementDesignに修正を加える例を以下に示します。

  // C#
  ElementDesign elementDesign = elementDesigns.Find("example_id");
  elementDesign.Put("exp", ".hoge");
  elementDesign.Child("layout").Put("x1", 100);
  ' VisualBasic
  Dim elementDesign As ElementDesign = elementDesigns.Find("example_id")
  elementDesign.Put("exp", ".hoge")
  elementDesign.Child("layout").Put("x1", 100)
  // Java
  ElementDesign elementDesign = elementDesigns.find("example_id");
  elementDesign.put("exp", ".hoge");
  elementDesign.child("layout").put("x1", 100);

以下のように書くことで動的に要素を追加できます。

  // C#
  ElementDesign elementDesign = new ElementDesign("rect");
  elementDesigns.Add(elementDesign);
  ' VisualBasic
  Dim elementDesign As New ElementDesign("rect")
  elementDesigns.Add(elementDesign)
  // Java
  ElementDesign elementDesign = new ElementDesign("rect");
  elementDesigns.add(elementDesign);

RenderContentメソッド内で行われた修正は、 コンテントの描画が行われるたびにリセットされます。

機能サンプルの「動的要素」に、このメソッドを利用した例があります。

DefaultCustomizer

カスタマイザを実装するには、 これら3つのメソッドを全て実装する必要がありますが、 常に全てのメソッドに用があるわけではないはずです。 そこで、通常はDefaultCustomizerというデフォルトの実装クラスを継承した上で、 必要なメソッドのみをオーバーライドするのが便利です。

  // C#
  private class Customizer : DefaultCustomizer
  {
      // 必要なメソッドのみオーバーライドする
      ...
  }
  ' VisualBasic
  Private Class Customizer
      Inherits DefaultCustomizer
      ' 必要なメソッドのみオーバーライドする
      ...
  End Class
  // Java
  private class Customizer extends DefaultCustomizer{
      // 必要なメソッドのみオーバーライドする
      ...
  }