/**
*
*/
package org.appfuse.webapp.client.ui.navigation;
import org.appfuse.webapp.client.application.utils.menu.MenuItem;
import com.github.gwtbootstrap.client.ui.constants.Constants;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.AnchorElement;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.LIElement;
import com.google.gwt.dom.client.UListElement;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceChangeEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Widget;
/**
* @author ivangsa
*
*/
public class NavigationBar extends BaseNavigationBar implements PlaceChangeEvent.Handler {
private static NavigationBarUiBinder uiBinder = GWT.create(NavigationBarUiBinder.class);
interface NavigationBarUiBinder extends UiBinder<Widget, NavigationBar> {
}
@UiField
AnchorElement brand;
@UiField
UListElement navBar;
public NavigationBar() {
initWidget(uiBinder.createAndBindUi(this));
this.setStyleName(DEBUG_ID_PREFIX);
}
public void load() {
brand.setHref(application.getContextPath());
navBar.setInnerHTML("");
for (final MenuItem menuItem : menu.getRootMenu()) {
drawMenu(navBar, menuItem);
}
activateCurrentMenuItem(application.getPlaceController().getWhere());
}
private void drawMenu(final Element panel, final MenuItem menuItem) {
if (!isMenuItemAllowed(menuItem)) {
return;
}
if (menuItem.isLeafMenuItem()) {
final LIElement li = Document.get().createLIElement();
final AnchorElement a = Document.get().createAnchorElement();
a.setTitle(menuItem.getTitle());
a.setInnerText(menuItem.getTitle());
a.setHref("#" + application.getPlaceHistoryMapper().getToken(menuItem.getPlace()));
li.appendChild(a);
panel.appendChild(li);
menuItem.setElement(li);
} else {
final LIElement dropdown = Document.get().createLIElement();
dropdown.addClassName("dropdown");
final AnchorElement toogle = Document.get().createAnchorElement();
toogle.setTitle(menuItem.getTitle());
toogle.setInnerText(menuItem.getTitle());
toogle.addClassName("dropdown-toggle");
toogle.setAttribute("data-toggle", "dropdown");// XXX
menuItem.setElement(dropdown);
final UListElement dropdownMenu = Document.get().createULElement();
dropdownMenu.addClassName("dropdown-menu");
dropdown.appendChild(toogle);
dropdown.appendChild(dropdownMenu);
panel.appendChild(dropdown);
for (final MenuItem childItem : menuItem) {
drawMenu(dropdownMenu, childItem);
}
}
}
@Override
public void onPlaceChange(final PlaceChangeEvent event) {
activateCurrentMenuItem(event.getNewPlace());
}
private void activateCurrentMenuItem(final Place currentPlace) {
for (final MenuItem menuItem : menu.asList()) {
final Element element = menuItem.getElement();
if (element != null) {
element.removeClassName(Constants.ACTIVE);
}
}
final MenuItem currentMenuItem = findCurrentMenuItem(currentPlace);
if (currentMenuItem != null) {
setActive(currentMenuItem);
}
}
/**
* Marks as 'active' menu item for current place and its parent menu places.
*
* @param menuItem
* @return
*/
private void setActive(final MenuItem menuItem) {
if (menuItem != null) {
final Element element = menuItem.getElement();
if (element != null) {
element.addClassName(Constants.ACTIVE);
}
setActive(menuItem.getParent());
}
}
}