ネステッドプレゼンタの作成
ネステッドプレゼンタとは、プレゼンタの中に別のプレゼンタ(これを仮に子プレゼンタと呼ぶ)を表示することである(実際には、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等を割り当てておく (悩まないためには、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<?>>();