package com.constellio.app.ui.pages.base;
import static com.constellio.app.ui.i18n.i18n.$;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.services.factories.ConstellioFactories;
import com.constellio.app.ui.application.ConstellioUI;
import com.constellio.app.ui.application.CoreViews;
import com.constellio.app.ui.entities.UserVO;
import com.constellio.app.ui.pages.viewGroups.MenuViewGroup;
import com.constellio.app.ui.pages.viewGroups.MenuViewGroup.DisabledMenuViewGroup;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.server.FontAwesome;
import com.vaadin.server.Page;
import com.vaadin.server.StreamResource;
import com.vaadin.server.StreamResource.StreamSource;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.Command;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.UI;
import com.vaadin.ui.themes.ValoTheme;
/**
* A responsive menu component providing user information and the controls for
* primary navigation between the views.
*/
@SuppressWarnings({ "serial" })
public class ConstellioMenuImpl extends CustomComponent implements ConstellioMenu {
public static final String ID = "dashboard-menu";
private static final String STYLE_VISIBLE = "valo-menu-visible";
public static final String STYLE_USER_SETTINGS = "user-settings";
private ConstellioMenuPresenter presenter;
private MenuItem userSettingsItem;
private CssLayout menuContent;
private MenuBar userMenu;
private Button valoMenuToggleButton;
private CssLayout menuItemsLayout;
private List<ConstellioMenuButton> mainMenuButtons = new ArrayList<>();
public ConstellioMenuImpl() {
this.presenter = new ConstellioMenuPresenter(this);
addStyleName(ValoTheme.MENU_ROOT);
setId(ID);
setSizeUndefined();
setCompositionRoot(buildContent());
// UI.getCurrent().addClickListener(new com.vaadin.event.MouseEvents.ClickListener() {
// @Override
// public void click(com.vaadin.event.MouseEvents.ClickEvent event) {
// hideMenu();
// }
// });
}
protected void hideMenu() {
Component compositionRoot = getCompositionRoot();
if (compositionRoot.getStyleName().contains(STYLE_VISIBLE)) {
compositionRoot.removeStyleName(STYLE_VISIBLE);
}
}
protected void toggleMenuVisibility() {
Component compositionRoot = getCompositionRoot();
if (compositionRoot.getStyleName().contains(STYLE_VISIBLE)) {
compositionRoot.removeStyleName(STYLE_VISIBLE);
} else {
compositionRoot.addStyleName(STYLE_VISIBLE);
}
}
private Component buildContent() {
menuContent = new CssLayout();
menuContent.addStyleName("sidebar");
menuContent.addStyleName(ValoTheme.MENU_PART);
menuContent.addStyleName("no-vertical-drag-hints");
menuContent.addStyleName("no-horizontal-drag-hints");
menuContent.setWidth(null);
menuContent.setHeight("100%");
menuContent.addComponent(buildUserMenu());
menuContent.addComponent(buildToggleButton());
menuContent.addComponent(buildMainMenu());
return menuContent;
}
protected Component buildUserMenu() {
userMenu = new MenuBar();
userMenu.addStyleName("user-menu");
buildUserMenuItems(userMenu);
return userMenu;
}
protected Component buildToggleButton() {
valoMenuToggleButton = new Button("Menu", new ClickListener() {
@Override
public void buttonClick(final ClickEvent event) {
toggleMenuVisibility();
}
});
valoMenuToggleButton.setIcon(FontAwesome.LIST);
valoMenuToggleButton.addStyleName("valo-menu-toggle");
valoMenuToggleButton.addStyleName(ValoTheme.BUTTON_BORDERLESS);
valoMenuToggleButton.addStyleName(ValoTheme.BUTTON_SMALL);
return valoMenuToggleButton;
}
private Component buildMainMenu() {
menuItemsLayout = new CssLayout();
menuItemsLayout.addStyleName("valo-menuitems");
menuItemsLayout.setHeight(100.0f, Unit.PERCENTAGE);
mainMenuButtons = buildMainMenuButtons();
for (ConstellioMenuButton mainMenuButton : mainMenuButtons) {
Button menuButton = mainMenuButton.getButton();
menuButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
toggleMenuVisibility();
}
});
Class<? extends MenuViewGroup> menuViewGroupClass = mainMenuButton.getMenuViewGroup();
Component mainMenuItemComponent = menuButton;
mainMenuItemComponent.setPrimaryStyleName(ValoTheme.MENU_ITEM);
if (DisabledMenuViewGroup.class.isAssignableFrom(menuViewGroupClass)) {
menuButton.addStyleName("disabled");
}
// FIXME Use the badge mechanism properly
// Label badgeLabel = new Label();
// buildBadgeWrapper(menuButton, badgeLabel);
// badgeLabel.setId("myBadgeId");
// mainMenuItemComponent = buildBadgeWrapper(menuButton, badgeLabel);
menuItemsLayout.addComponent(mainMenuItemComponent);
}
UI.getCurrent().getNavigator().addViewChangeListener(new ViewChangeListener() {
@Override
public boolean beforeViewChange(ViewChangeEvent event) {
View newView = event.getNewView();
final String selectedStyleName = "selected";
boolean newSelection = false;
Button lastSelectedButton = null;
for (ConstellioMenuButton mainMenuButton : mainMenuButtons) {
Button menuButton = mainMenuButton.getButton();
Class<? extends MenuViewGroup> menuViewGroupClass = mainMenuButton.getMenuViewGroup();
if (menuButton.getStyleName().contains(selectedStyleName)) {
lastSelectedButton = menuButton;
}
if (menuViewGroupClass.isAssignableFrom(newView.getClass())) {
menuButton.addStyleName(selectedStyleName);
newSelection = true;
} else {
menuButton.removeStyleName(selectedStyleName);
}
}
if (!newSelection && lastSelectedButton != null) {
lastSelectedButton.addStyleName(selectedStyleName);
}
return true;
}
@Override
public void afterViewChange(ViewChangeEvent event) {
}
});
return menuItemsLayout;
}
protected void buildUserMenuItems(MenuBar userMenu) {
SessionContext sessionContext = ConstellioUI.getCurrentSessionContext();
UserVO currentUser = sessionContext.getCurrentUser();
String firstName = currentUser.getFirstName();
String lastName = currentUser.getLastName();
// if (currentUser.getEmail() != null && currentUser.getEmail().startsWith("elizabeth.madera")) {
// userSettingsItem = userMenu.addItem("", new ThemeResource("images/profiles/egg2.jpg"), null);
//
// } else
if (!presenter.hasCurrentUserPhoto()) {
userSettingsItem = userMenu.addItem("", new ThemeResource("images/profiles/default.jpg"), null);
} else {
StreamSource source = new StreamSource() {
@Override
public InputStream getStream() {
return presenter.newUserPhotoInputStream();
}
};
StreamResource resource = new StreamResource(source, currentUser.getUsername() + ".png");
userSettingsItem = userMenu.addItem("", resource, null);
}
userSettingsItem.setText(firstName + " " + lastName);
userSettingsItem.setStyleName(STYLE_USER_SETTINGS);
userSettingsItem.addItem($("ConstellioMenu.editProfile"), new Command() {
@Override
public void menuSelected(final MenuItem selectedItem) {
String params = Page.getCurrent().getUriFragment();
if (params != null) {
params = params.replace("!", "");
}
presenter.editProfileButtonClicked(params);
}
}).setStyleName("modify-profil-item");
// userSettingsItem.addItem($("ConstellioMenu.preferences"), new Command() {
// @Override
// public void menuSelected(final MenuItem selectedItem) {
// presenter.preferencesButtonClicked();
// }
// });
final String collection = sessionContext.getCurrentCollection();
for (String language : presenter.getCollectionLanguages(collection)) {
userSettingsItem.addSeparator();
userSettingsItem.addItem(language, new Command() {
@Override
public void menuSelected(final MenuItem selectedItem) {
presenter.languageSelected(selectedItem.getText(), collection);
}
}).setStyleName("language-item-" + language);
}
userSettingsItem.addSeparator();
userSettingsItem.addItem($("ConstellioMenu.signOut"), new Command() {
@Override
public void menuSelected(final MenuItem selectedItem) {
presenter.signOutButtonClicked();
}
}).setStyleName("disconnect-item");
}
public MenuItem getUserSettingsItem() {
return userSettingsItem;
}
protected List<ConstellioMenuButton> buildMainMenuButtons() {
List<ConstellioMenuButton> mainMenuButtons = new ArrayList<>();
return mainMenuButtons;
}
private Component buildBadgeWrapper(final Component menuItemButton, final Component badgeLabel) {
CssLayout dashboardWrapper = new CssLayout(menuItemButton);
dashboardWrapper.addStyleName("badgewrapper");
dashboardWrapper.addStyleName(ValoTheme.MENU_ITEM);
dashboardWrapper.setWidth(100.0f, Unit.PERCENTAGE);
badgeLabel.addStyleName(ValoTheme.MENU_BADGE);
badgeLabel.setWidthUndefined();
badgeLabel.setVisible(false);
dashboardWrapper.addComponent(badgeLabel);
return dashboardWrapper;
}
@Override
public CoreViews navigateTo() {
return new CoreViews(UI.getCurrent().getNavigator());
}
@Override
public SessionContext getSessionContext() {
return ConstellioUI.getCurrentSessionContext();
}
@Override
public ConstellioFactories getConstellioFactories() {
return ConstellioFactories.getInstance();
}
@Override
public void updateUIContent() {
ConstellioUI.getCurrent().updateContent();
}
public static class ConstellioMenuButton implements Serializable {
private Class<? extends MenuViewGroup> menuViewGroupClass;
private Button button;
public ConstellioMenuButton(Class<? extends MenuViewGroup> menuViewGroupClass, Button button) {
this.menuViewGroupClass = menuViewGroupClass;
this.button = button;
}
public Class<? extends MenuViewGroup> getMenuViewGroup() {
return menuViewGroupClass;
}
public Button getButton() {
return button;
}
}
}