package com.gwt.mvp.client.presenter;
import com.gwt.mvp.client.Display;
import com.gwt.mvp.client.EventBus;
import com.gwt.mvp.client.Presenter;
/**
* <code>CompositeContainerPresenter</code> implement composite behavior.
* <p />
* A <code>CompositeDisplay</code> declare one or many label. On each label, we can set specific <code>Display</code> instance.
*
* @param <D>
* @author jguibert
*/
public class CompositePresenter<D extends CompositeDisplay> extends ContainerPresenter<D, CompositePresenter<D>.LabeledPresenter> {
/**
* Build a new instance of <code>CompositePresenter</code>.
*
* @param display display instance
* @param eventBus event bus instance
*/
public CompositePresenter(final D display, final EventBus eventBus) {
super(display, eventBus);
}
/**
* Adds presenter with the specified label.
*
* @param label label associated with this presenter
* @param presenter The presenter to Add
* @return <code>true</code> if added
*/
public boolean addPresenter(final String label, final Presenter presenter) {
return addPresenter(new LabeledPresenter(label, presenter));
}
/**
* Adds presenter with the specified label.
*
* @param label label enum associated with this presenter
* @param presenter The presenter to Add
* @return <code>true</code> if added
*/
public boolean addPresenter(final Enum<?> label, final Presenter presenter) {
return addPresenter(label.toString(), presenter);
}
/**
* Adds presenters with the specified label
*
* @param label the label
* @param presenters list of presenter to add
* @return <code>true</code> if added
*/
public boolean addPresenter(final String label, final Presenter... presenters) {
if (!isBound()) {
for (Presenter presenter : presenters) {
addPresenter(new LabeledPresenter(label, presenter));
}
return true;
}
return false;
}
/**
* Adds presenters with the specified label
*
* @param label the label enum
* @param presenters list of presenter to add
* @return <code>true</code> if added
*/
public boolean addPresenter(final Enum<?> label, final Presenter... presenters) {
return addPresenter(label.toString(), presenters);
}
@Override
protected void onChildPresenterRevealed(final Presenter presenter) {
// reveal ourselves
revealDisplay();
// Reveal ourselves so that the child will be revealed.
firePresenterRevealedEvent(false);
}
/**
* Reveal all children.
*
* @see BasePresenter#onRevealDisplay()
*/
@Override
protected void onRevealDisplay() {
for (LabeledPresenter presenter : getChildren()) {
presenter.revealDisplay();
display.addDisplay(presenter.getLabel(), presenter.getDisplay());
}
display.show();
}
/**
* <code>LabeledPresenter</code> is an inner class in order to manage a decoration on a <code>Presenter</code> instance.
*
* @author Jerome Guibert
*/
public class LabeledPresenter implements Presenter {
/** label value. */
private final String label;
/** associated presenter. */
private final Presenter presenter;
/**
* Build a new instance of <code>LabeledPresenter</code>.
*
* @param label
* @param presenter
*/
public LabeledPresenter(final String label, final Presenter presenter) {
super();
this.label = label;
this.presenter = presenter;
}
@Override
public String toString() {
return "LabeledPresenter [label=" + label + ", presenter=" + presenter + "]";
}
public String getLabel() {
return label;
}
public Presenter getPresenter() {
return presenter;
}
public void bind() {
presenter.bind();
}
public void disposeDisplay() {
presenter.disposeDisplay();
}
public Display getDisplay() {
return presenter.getDisplay();
}
public boolean isBound() {
return presenter.isBound();
}
public void revealDisplay() {
presenter.revealDisplay();
}
public void unbind() {
presenter.unbind();
}
@Override
public boolean isRevealed() {
return presenter.isRevealed();
}
@Override
public int hashCode() {
return presenter.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Presenter))
return false;
Presenter other = (Presenter)obj;
boolean result = presenter.equals(other);
if (!result) {
try {
return presenter.equals(((LabeledPresenter)other).getPresenter());
} catch (ClassCastException e) {
// nothing to do
}
}
return result;
}
}
@Override
public String toString() {
return getClass().getName() + " [ children= " + children + "]";
}
}