gt: 			StyleUtils.addStyle((Widget) w, Navbar.STYLE_NAV_BUTTON);
context: /**
   * This file is part of pwt.
   *
   * pwt is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
   * General Public License as published by the Free Software Foundation, either version 3 of the
   * License, or (at your option) any later version.
   *
   * pwt is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
   * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
   * General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public License along with pwt. If not,
   * see <http://www.gnu.org/licenses/>.
   */
  package fr.putnami.pwt.core.widget.client;
  
  import com.google.gwt.dom.client.AnchorElement;
  import com.google.gwt.dom.client.DivElement;
  import com.google.gwt.dom.client.Document;
  import com.google.gwt.dom.client.Element;
  import com.google.gwt.uibinder.client.UiChild;
  import com.google.gwt.user.client.ui.IsWidget;
  import com.google.gwt.user.client.ui.Widget;
  
  import fr.putnami.pwt.core.editor.client.factory.CloneableWidget;
  import fr.putnami.pwt.core.mvp.client.MvpController;
  import fr.putnami.pwt.core.mvp.client.event.StartActivityEvent;
  import fr.putnami.pwt.core.theme.client.CssStyle;
  import fr.putnami.pwt.core.theme.client.IconFont;
  import fr.putnami.pwt.core.widget.client.base.AbstractPanel;
  import fr.putnami.pwt.core.widget.client.base.SimpleStyle;
  import fr.putnami.pwt.core.widget.client.helper.CollapseHelper;
  import fr.putnami.pwt.core.widget.client.util.AnchorUtils;
  import fr.putnami.pwt.core.widget.client.util.StyleUtils;
  import fr.putnami.pwt.core.widget.client.util.WidgetUtils;
  
  public class Navbar extends AbstractPanel implements CloneableWidget {
  
  	private static final CssStyle STYLE_NAVBAR = new SimpleStyle("navbar");
  	private static final CssStyle STYLE_BRAND = new SimpleStyle("navbar-brand");
  	private static final CssStyle STYLE_NAV = new SimpleStyle("nav navbar-nav");
  	private static final CssStyle STYLE_HEADER = new SimpleStyle("navbar-header");
  	private static final CssStyle STYLE_TOGGLE = new SimpleStyle("navbar-toggle");
  	private static final CssStyle STYLE_NAV_BUTTON = new SimpleStyle("navbar-btn");
  	private static final CssStyle STYLE_NAVBAR_LEFT = new SimpleStyle("navbar-left");
  	private static final CssStyle STYLE_NAVBAR_RIGHT = new SimpleStyle("navbar-right");
  	private static final CssStyle STYLE_COLLAPSE = new SimpleStyle("navbar-collapse");
  	private static final CssStyle STYLE_TEXT_MUTED = new SimpleStyle("text-muted");
  
  	public enum ContainerType implements CssStyle {
  			RESPONSIVE("container"),
  			FLUID("container-fluid");
  
  		private final String style;
  
  		ContainerType(String style) {
  			this.style = style;
  		}
  
  		@Override
  		public String get() {
  			return this.style;
  		}
  	}
  
  	public enum Type implements CssStyle {
  
  			DEFAULT("navbar-default"),
  			INVERSE("navbar-inverse");
  
  		private final String style;
  
  		Type(String style) {
  			this.style = style;
  		}
  
  		@Override
  		public String get() {
  			return this.style;
  		}
  	}
  
  	public enum Position implements CssStyle {
  			DEFAULT(null),
  			FIXED_TOP("navbar-fixed-top"),
  			FIXED_BOTTOM("navbar-fixed-bottom"),
  			STATIC_TOP("navbar-static-top");
  
  		private final String style;
  
  		Position(String style) {
  			this.style = style;
  		}
  
  		@Override
  		public String get() {
  			return this.style;
  		}
  	}
  
  	private class NavbarButton extends Widget implements CloneableWidget {
  
  		NavbarButton() {
  			this.setElement(Document.get().createAnchorElement());
  			StyleUtils.addStyle(this, Navbar.STYLE_TOGGLE);
  			StyleUtils.addStyle(this, Navbar.STYLE_TEXT_MUTED);
  			AnchorElement.as(this.getElement()).setHref(AnchorUtils.DUMMY_HREF);
  			this.getElement().appendChild(this.createIcon());
  		}
  
  		@Override
  		public IsWidget cloneWidget() {
  			return new NavbarButton();
  		}
  
  		public void setCollapseContainer(Container collapseContainer) {
  			Navbar.this.collapseHelper = CollapseHelper.apply(this, collapseContainer.getElement(), true);
  		}
  
  		private Element createIcon() {
  			Icon icon = new Icon();
  			icon.setType(IconFont.ICON_MENU);
  			return icon.getElement();
  		}
  	}
  
  	private final Container headerContainer = new Container();
  	private final Container collapseContainer = new Container();
  	private final Container contentContainer = new Container();
  
  	private ContainerType containerType = ContainerType.FLUID;
  	private Type type = Type.DEFAULT;
  	private Position position = Position.DEFAULT;
  	private CollapseHelper collapseHelper;
  
  	private StartActivityEvent.Handler collapseHandler = new StartActivityEvent.Handler() {
  
  		@Override
  		public void onStartActivity(StartActivityEvent event) {
  			if (Navbar.this.collapseHelper != null) {
  				Navbar.this.collapseHelper.collapse();
  			}
  		}
  	};
  
  	public Navbar() {
  		super(DivElement.TAG);
  		this.endConstruct();
  	}
  
  	protected Navbar(Navbar source) {
  		super(source);
  		this.type = source.type;
  		this.position = source.position;
  		this.containerType = source.containerType;
  		for (Widget collapseWidget : source.collapseContainer) {
  			this.collapseContainer.append(WidgetUtils.cloneWidget(collapseWidget));
  		}
  		this.endConstruct();
  	}
  
  	private void endConstruct() {
  		this.append(this.contentContainer);
  		this.contentContainer.append(this.headerContainer);
  		this.contentContainer.append(this.collapseContainer);
  
  		NavbarButton button = new NavbarButton();
  		button.setCollapseContainer(this.collapseContainer);
  		this.headerContainer.append(button);
  
  		StyleUtils.addStyle(this, Navbar.STYLE_NAVBAR);
  		StyleUtils.addStyle(this.headerContainer, Navbar.STYLE_HEADER);
  		StyleUtils.addStyle(this.collapseContainer, Navbar.STYLE_COLLAPSE);
  
  		this.setContainerType(this.containerType);
  		this.setType(this.type);
  		this.setPosition(this.position);
  
  		MvpController.get().addStartActivityHandler(this.collapseHandler);
  	}
  
  	@Override
  	public IsWidget cloneWidget() {
  		return new Navbar(this);
  	}
  
  	@UiChild(tagname = "Brand")
  	public void addBrand(Widget w) {
  		StyleUtils.addStyle(Widget.asWidgetOrNull(w), Navbar.STYLE_BRAND);
  		this.headerContainer.add(w);
  	}
  
  	@UiChild(tagname = "left")
  	public void addLeft(IsWidget w) {
  		StyleUtils.addStyle(Widget.asWidgetOrNull(w), Navbar.STYLE_NAVBAR_LEFT);
  		this.add(w);
  	}
  
  	@UiChild(tagname = "right")
  	public void addRight(IsWidget w) {
  		StyleUtils.addStyle(Widget.asWidgetOrNull(w), Navbar.STYLE_NAVBAR_RIGHT);
  		this.add(w);
  	}
  
  	@Override
  	public void add(IsWidget w) {
  		if (w instanceof Nav) {
  			this.updateNavStyle((Nav) w);
  		}
  		if (w instanceof Button || w instanceof ButtonGroup) {
  