Locked History Actions

Diff for "GWT/GWTP/NestedPresenter"

Differences between revisions 1 and 2
Deletions are marked like this. Additions are marked like this.
Line 20: Line 20:

== 作成方法 ==

前項のSomethingPresenterを改造し、SomethingPresenterを子とし、元からあるMainPagePresenterの中に組み込んでみる。

=== SomethingPresenterの改造 ===

revealInParentメソッドを
{{{
  @Override
  protected void revealInParent() {
    RevealRootContentEvent.fire(this, this);
  }
}}}
から
{{{
  @Override
  protected void revealInParent() {
    RevealContentEvent.fire(this, MainPagePresenter.TYPE_SetMainContent, this);
  }
}}}
に変更する。前者では、SomethingPresenterの表示が独立して行われるものだったが、後者では親への表示依頼を行うようにする。

=== MainPageView/MainPagePresenterの改造 ===

MainPageViewのhtmlに
{{{
  private static String html = "<h1>Web Application Starter Project</h1>\n"
      ....
      + "<div id=\"nestedContainer\"></div>";
}}}
などと、子を表示する領域を作成し、これにLayoutPanel等を割り当てておく。
次に、以下のメソッドを追加する。
{{{
  @Override
  public void setInSlot(Object slot, Widget content) {
    if (slot == MainPagePresenter.TYPE_SetMainContent) {
      layoutPanel.clear();
      if (content != null) {
        layoutPanel.add(content);
      }
    } else {
      super.setInSlot(slot, content);
    }
  }
}}}

MainPagePresenterには以下を追加するだけ。

{{{
  @ContentSlot
  public static final Type<RevealContentHandler<?>> TYPE_SetMainContent = new Type<RevealContentHandler<?>>();
}}}

ネステッドプレゼンタの作成

ネステッドプレゼンタとは、プレゼンタの中に別のプレゼンタ(これを仮に子プレゼンタと呼ぶ)を表示することである(実際には、Viewの中に別のView)。 これにより、親プレゼンタの左側に固定メニューを表示し、右側に子プレゼンタ用の領域を設け、子プレゼンタを切り替えるといった表示が可能になる。

もちろん同じ効果は、右側コンテンツ表示として、DeckLayoutPanelを使って切り替えることでも可能だが、 しかしこの場合、その中身は「Place」として認識されないので、ブラウザのバック・フォワードボタンでの制御はできないし、ブックマークもできない。 それらを行いたい場合はネステッドプレゼンタとする必要がある。

概要

概要としては以下のとおり。

  • ネステッドプレゼンタはplaceであるので、それ自身のplace名称(NameToken)を持ち、ブラウザ側でその表示が指示可能になる。

  • このとき、ネステッドプレゼンタが呼び出されるが、表示時には、親となるプレゼンタへイベントを発行する。
  • 親プレゼンタはイベントから取得した子プレゼンタ(のView)を自身の中に組み込んで、自身を表示する。

ということらしい。つまり、見かけとしては親がその中身となる子を切り替えるように見えるが、仕組みとしては、 まず子の表示が指示され、子は親に依頼して表示を行うということになる。

作成方法

前項のSomethingPresenterを改造し、SomethingPresenterを子とし、元からあるMainPagePresenterの中に組み込んでみる。

SomethingPresenterの改造

revealInParentメソッドを

  @Override
  protected void revealInParent() {
    RevealRootContentEvent.fire(this, this);
  }

から

  @Override
  protected void revealInParent() {
    RevealContentEvent.fire(this, MainPagePresenter.TYPE_SetMainContent, this);
  }

に変更する。前者では、SomethingPresenterの表示が独立して行われるものだったが、後者では親への表示依頼を行うようにする。

MainPageView/MainPagePresenterの改造

MainPageViewのhtmlに {{{

  • private static String html = "<h1>Web Application Starter Project</h1>\n"

    • ...

      + "<div id=\"nestedContainer\"></div>";

}}} などと、子を表示する領域を作成し、これにLayoutPanel等を割り当てておく。 次に、以下のメソッドを追加する。

  @Override
  public void setInSlot(Object slot, Widget content) {
    if (slot == MainPagePresenter.TYPE_SetMainContent) {
      layoutPanel.clear();
      if (content != null) {
        layoutPanel.add(content);
      }
    } else {
      super.setInSlot(slot, content);
    }
  }

MainPagePresenterには以下を追加するだけ。

  @ContentSlot
  public static final Type<RevealContentHandler<?>> TYPE_SetMainContent = new Type<RevealContentHandler<?>>();