package com.ocpsoft.socialpm.gwt.client.local.view.component;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.jboss.errai.ui.shared.api.annotations.DataField;
import org.jboss.errai.ui.shared.api.annotations.Templated;
import org.ocpsoft.rewrite.gwt.client.history.ContextPathListener;
import org.ocpsoft.rewrite.gwt.client.history.HistoryStateImpl;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import com.ocpsoft.socialpm.gwt.client.local.history.HistoryConstants;
import com.ocpsoft.socialpm.gwt.client.local.view.events.LoginEvent;
import com.ocpsoft.socialpm.gwt.client.local.view.events.LogoutEvent;
import com.ocpsoft.socialpm.gwt.client.local.view.presenter.AuthenticationAware;
import com.ocpsoft.socialpm.model.user.Profile;
@Dependent
@Templated
public class TopNav extends Composite implements AuthenticationAware
{
private final NavLink signupLink = new NavLink("Join the party", HistoryConstants.SIGNUP());
private final NavDropdown status = new NavDropdown();
private final NavLink signinLink = new NavLink("Sign in", HistoryConstants.LOGIN());
private final NavLink signoutLink = new NavLink("Sign out", HistoryConstants.LOGOUT());
@Inject
@DataField
private NavLink brand;
@Inject
@DataField
private ProfileLink profileLink;
@Inject
@DataField
private GravatarImage gravatar;
@Inject
@DataField
private UnorderedList right;
@Inject
@DataField
private UnorderedList list;
@PostConstruct
public final void init()
{
setFixedTop(true);
/*
* Initialize brand and signup links
*/
HistoryStateImpl.addContextPathListener(new ContextPathListener() {
@Override
public void onContextPathSet(String contextPath)
{
getBrandLink().setTargetHistoryToken(HistoryConstants.HOME());
}
});
if (getBrandLink().getTargetHistoryToken() == null && HistoryStateImpl.getContextPath() != null)
{
getBrandLink().setTargetHistoryToken(HistoryConstants.HOME());
}
add(signupLink);
/*
* Initialize Gravatar and Account Menu
*/
gravatar.setSize(30);
gravatar.setVisible(true);
gravatar.getImage().getElement()
.setAttribute("style", "padding: 2px; background-color: #eee; position: relative; top: 3px;");
addRight(new ListItem(gravatar));
status.setVisible(false);
status.add(profileLink);
status.add(new NavDropdownDivider());
status.add(signoutLink);
addRight(status);
signinLink.setVisible(true);
addRight(new ListItem(signinLink));
}
public TopNav setFixedTop(boolean enabled)
{
if (enabled)
this.addStyleName("navbar-fixed-top");
else
this.removeStyleName("navbar-fixed-stop");
return this;
}
public TopNav add(Widget w)
{
return add(w, false);
}
public TopNav add(Widget w, boolean active)
{
Widget li = w;
if (!"li".equals(w.getElement().getTagName()))
{
li = new ListItem(w);
}
if (active)
li.setStyleName("active");
list.add(li);
return this;
}
public TopNav addRight(Widget w)
{
right.add(w);
return this;
}
public boolean remove(Widget w)
{
return list.remove(w);
}
/*
* Getters & Setters
*/
public NavLink getBrandLink()
{
return brand;
}
public NavLink getSignupLink()
{
return signupLink;
}
@Override
public void handleLogin(@Observes LoginEvent event)
{
Profile profile = event.getProfile();
gravatar.setProfile(profile);
gravatar.setVisible(true);
profileLink.setProfile(profile);
profileLink.setText("View your profile");
signinLink.setVisible(false);
signupLink.setVisible(false);
status.setToggleText(profile.getUsername());
status.setVisible(true);
}
@Override
public void handleLogout(@Observes LogoutEvent event)
{
gravatar.clear();
gravatar.setVisible(false);
status.setVisible(false);
signinLink.setVisible(true);
signupLink.setVisible(true);
profileLink.clear();
}
}