package com.gwt.mvp.client.presenter.tab;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.gwt.mvp.client.EventBus;
import com.gwt.mvp.client.Presenter;
import com.gwt.mvp.client.event.SelectionPresenterEvent;
import com.gwt.mvp.client.event.TabItemClosedEvent;
import com.gwt.mvp.client.event.TabItemClosedHander;
import com.gwt.mvp.client.presenter.ContainerPresenter;
import com.gwt.mvp.client.presenter.tab.TabItemPresenter.TabItemDisplay;
public class TabPresenter<D extends TabDisplay> extends ContainerPresenter<D, TabItemPresenter> {
private boolean fireSelectionEvent;
/**
* Build a new instance of <code>TabPresenter</code>.
*
* @param display
* @param eventBus
* @param presenters
*/
public TabPresenter(final D display, final EventBus eventBus, final TabItemPresenter... presenters) {
super(display, eventBus, presenters);
fireSelectionEvent = true;
}
/**
* Adds the presenter.
* If container is revealed, the presenter will be revealed to.
*
* @param presenter
* The presenter to add.
* @return If added, returns <code>true</code>.
*/
@Override
public boolean addPresenter(final TabItemPresenter presenter) {
if (!contains(presenter)) {
children.add(presenter);
/** bind if necessary */
if (isBound()) {
presenter.bind();
if (isRevealed()) {
addChild(presenter);
}
}
}
return true;
}
/**
* Adds the presenter.
* If container is revealed, the presenter will be revealed to.
*
* @param tabItemDisplay tab item display to use.
* @param presenter
* The presenter to add.
* @return If added, returns <code>true</code>.
*/
public boolean addPresenter(final TabItemDisplay tabItemDisplay, final Presenter presenter) {
return addPresenter(new TabItemPresenter(tabItemDisplay, eventBus, presenter));
}
/**
* Removes the presenter.
*
* @param presenter The presenter to remove.
* @return If removed, returns <code>true</code>.
*/
public boolean removePresenter(Presenter presenter) {
if (contains(presenter)) {
children.remove(presenter);
// if reveal, dispose
if (isRevealed()) {
display.remove(presenter.getDisplay());
presenter.disposeDisplay();
}
// if bound, unbound
if (isBound()) {
presenter.unbind();
}
return true;
}
return false;
}
/**
* @return true if this presenter fire a Selection event.
*/
public boolean isFireSelectionEvent() {
return fireSelectionEvent;
}
/**
* Control selection event raising.
* It could be useful to disable selection event firing, if none of this event his used.
*
* @param fireSelectionEvent the fire selection event flag
*/
public void setFireSelectionEvent(boolean fireSelectionEvent) {
this.fireSelectionEvent = fireSelectionEvent;
}
/**
* Reveal all child and add them on display.
*/
@Override
protected void onRevealDisplay() {
for (TabItemPresenter presenter : getChildren()) {
addChild(presenter);
}
// set a default selected tab
if (display.getDisplayCount() > -1) {
display.selectDisplay(0);
}
// set selection handler
if (fireSelectionEvent) {
if (display.getSelectionHandlers() != null) {
display.getSelectionHandlers().addSelectionHandler(new SelectionHandler<Integer>() {
@Override
public void onSelection(SelectionEvent<Integer> selectionEvent) {
for (TabItemPresenter tabItemPresenter : getChildren()) {
if (selectionEvent.getSelectedItem().equals(display.getDisplayIndex(tabItemPresenter.getDisplay()))) {
eventBus.fireEvent(new SelectionPresenterEvent(tabItemPresenter.getPresenter()));
}
}
}
});
}
}
}
private void addChild(final TabItemPresenter presenter) {
presenter.revealDisplay();
display.add(presenter.getDisplay(), presenter.getChildDisplay());
}
/**
* On child presenter revealed, reveal ourself and select tab display.
*/
@Override
protected void onChildPresenterRevealed(final Presenter presenter) {
revealDisplay();
// set current
int tabIndex = display.getDisplayIndex(presenter.getDisplay());
if (tabIndex > -1 && (tabIndex != display.getSelectedDisplayIndex())) {
display.selectDisplay(tabIndex);
}
firePresenterRevealedEvent(false);
}
/** Handle <code>TabItemClosedEvent</code> event */
@Override
protected void onBind() {
super.onBind();
// add TabItemClosedHander handler.
registerHandler(eventBus.addHandler(TabItemClosedEvent.TYPE, new TabItemClosedHander() {
@Override
public void onTabItemClosed(TabItemPresenter presenter) {
removePresenter(presenter);
}
}));
}
@Override
protected void onUnbind() {
removeChildren();
super.onUnbind();
}
protected final void removeChildren() {
for (TabItemPresenter presenter : children) {
children.remove(presenter); // if bound, unbound
if (presenter.isRevealed()) {
display.remove(presenter.getDisplay());
}
presenter.unbind();
}
children.clear();
}
}