com.hybridbpm.ui.MainMenu.java Source code

Java tutorial

Introduction

Here is the source code for com.hybridbpm.ui.MainMenu.java

Source

/*
 * Copyright (c) 2011-2015 Marat Gubaidullin. 
 *
 * This file is part of HYBRIDBPM.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 *
 */
package com.hybridbpm.ui;

import com.hybridbpm.core.data.access.User;
import com.hybridbpm.ui.component.ValoMenuItemButton;
import com.hybridbpm.ui.component.ValoMenuAddViewButton;
import com.hybridbpm.core.data.dashboard.ViewDefinition;
import com.hybridbpm.ui.component.UserImageSource;
import com.hybridbpm.ui.component.access.UsersLayout;
import com.hybridbpm.ui.view.AccessView;
import com.hybridbpm.ui.view.AdministrationView;
import com.hybridbpm.ui.view.CalendarView;
import com.hybridbpm.ui.view.CaseView;
import com.hybridbpm.ui.view.DashboardView;
import com.hybridbpm.ui.view.DevelopmentView;
import com.hybridbpm.ui.view.DocumentView;
import com.hybridbpm.ui.view.TaskListView;
import com.vaadin.annotations.DesignRoot;
import com.vaadin.server.FontAwesome;
import com.vaadin.server.Sizeable;
import com.vaadin.server.StreamResource;
import com.vaadin.server.ThemeResource;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.Image;
import com.vaadin.ui.Label;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.Window;
import com.vaadin.ui.declarative.Design;
import com.vaadin.ui.themes.ValoTheme;
import java.util.List;
import java.util.Objects;
import java.util.UUID;

/**
 * A responsive menu component providing user information and the controls for primary navigation between the views.
 */
@SuppressWarnings({ "serial", "unchecked" })
@DesignRoot
public final class MainMenu extends CssLayout implements Button.ClickListener, MenuBar.Command {

    private static final String STYLE_VISIBLE = "valo-menu-visible";
    private Image userImage;
    private MenuBar settings;
    private MenuItem settingsItem;
    private MenuItem profileItem;
    private MenuItem signOutItem;
    private CssLayout menuItemsLayout;
    private Button valoMenuToggleButton;
    private Button developerButton;

    public MainMenu() {
        setSizeUndefined();
        Design.read(this);
        settingsItem = settings.addItem("", null);
        profileItem = settingsItem.addItem("Profile", this);
        settingsItem.addSeparator();
        signOutItem = settingsItem.addItem("Sign Out", this);
        valoMenuToggleButton.addClickListener(this);
        valoMenuToggleButton.setIcon(FontAwesome.LIST);
        developerButton.setIcon(FontAwesome.EYE_SLASH);
        developerButton.setDescription("Turn on developer mode");
        developerButton.addClickListener(this);
    }

    public void buildMenu(String viewUrl, boolean navigate, String selectedUrl) {
        cleanMenu();
        setUserImage();
        // add build-in views
        if (HybridbpmUI.getAccessAPI().isUser()) {

            ViewDefinition vd = new ViewDefinition(TaskListView.ORDER, TaskListView.VIEW_URL, TaskListView.TITLE,
                    TaskListView.ICON);
            addMenuItemComponent(vd, null);
            HybridbpmUI.registerView(vd, new TaskListView());

            vd = new ViewDefinition(CaseView.ORDER, CaseView.VIEW_URL, CaseView.TITLE, CaseView.ICON);
            addMenuItemComponent(vd, null);
            HybridbpmUI.registerView(vd, new CaseView());

            vd = new ViewDefinition(CalendarView.ORDER, CalendarView.VIEW_URL, CalendarView.TITLE,
                    CalendarView.ICON);
            addMenuItemComponent(vd, null);
            HybridbpmUI.registerView(vd, new CalendarView());

            vd = new ViewDefinition(DocumentView.ORDER, DocumentView.VIEW_URL, DocumentView.TITLE,
                    DocumentView.ICON);
            addMenuItemComponent(vd, null);
            HybridbpmUI.registerView(vd, new DocumentView());

        }

        if (HybridbpmUI.getAccessAPI().isAdministrator()) {
            ViewDefinition vd = new ViewDefinition(AdministrationView.ORDER, AdministrationView.VIEW_URL,
                    AdministrationView.TITLE, AdministrationView.ICON);
            addMenuItemComponent(vd, null);
            HybridbpmUI.registerView(vd, new AdministrationView());

            //            vd = new ViewDefinition(MobileView.ORDER, MobileView.VIEW_URL, MobileView.TITLE, MobileView.ICON);
            //            addMenuItemComponent(vd, null);
            //            HybridbpmUI.registerView(vd, new MobileView());

            vd = new ViewDefinition(AccessView.ORDER, AccessView.VIEW_URL, AccessView.TITLE, AccessView.ICON);
            addMenuItemComponent(vd, null);
            HybridbpmUI.registerView(vd, new AccessView());
        }

        if (HybridbpmUI.getAccessAPI().isDeveloper()) {
            ViewDefinition vd = new ViewDefinition(DevelopmentView.ORDER, DevelopmentView.VIEW_URL,
                    DevelopmentView.TITLE, DevelopmentView.ICON);
            addMenuItemComponent(vd, null);
            HybridbpmUI.registerView(vd, new DevelopmentView());
        }

        List<ViewDefinition> definitions = HybridbpmUI.getDashboardAPI().getViewDefinitions();
        for (ViewDefinition vd : definitions) {
            addMenuItemComponent(vd, null);
            HybridbpmUI.registerView(vd, new DashboardView(vd));
        }

        if (HybridbpmUI.getAccessAPI().isDeveloper()) {
            developerButton.setVisible(true);
            developerButton.setEnabled(true);
            // new view menu
            addMenuItemComponent(null, null);
        } else {
            developerButton.setVisible(false);
            developerButton.setEnabled(false);
        }
        //        if (getAccessAPI().isManager()) {
        //            ViewDefinition vd = new ViewDefinition(DashboardView.ORDER, DashboardView.VIEW_URL, DashboardView.TITLE, DashboardView.ICON);
        //            addMenuItemComponent(vd, null);
        //            HybridbpmUI.registerView(vd, new DashboardView());
        //        }

        // navigate to view
        if (navigate) {
            if (viewUrl != null) {
                HybridbpmUI.getCurrent().getNavigator().navigateTo(viewUrl);
            } else {
                HybridbpmUI.getCurrent().getNavigator().navigateTo(TaskListView.VIEW_URL);
            }
        } else if (selectedUrl != null) {
            setSelection(selectedUrl, viewUrl);
        }
    }

    protected void addMenuItemComponent(final ViewDefinition viewDefinition, String parameters) {
        CssLayout dashboardWrapper = new CssLayout();
        dashboardWrapper.addStyleName("badgewrapper");
        dashboardWrapper.addStyleName(ValoTheme.MENU_ITEM);
        dashboardWrapper.setWidth(100.0f, Sizeable.Unit.PERCENTAGE);

        Label notificationsBadge = new Label();
        notificationsBadge.addStyleName(ValoTheme.MENU_BADGE);
        notificationsBadge.setWidthUndefined();
        notificationsBadge.setVisible(false);

        if (viewDefinition != null) {
            dashboardWrapper.addComponents(new ValoMenuItemButton(viewDefinition, parameters), notificationsBadge);
            menuItemsLayout.addComponent(dashboardWrapper);
        } else if (HybridbpmUI.getDeveloperMode()) {
            dashboardWrapper.addComponents(new ValoMenuAddViewButton(), notificationsBadge);
            menuItemsLayout.addComponent(dashboardWrapper);
        }
    }

    public void cleanMenu() {
        menuItemsLayout.removeAllComponents();
    }

    public void setSelection(String viewUrl, String parameters) {
        for (Component comp : menuItemsLayout) {
            if (comp instanceof CssLayout) {
                CssLayout dashboardWrapper = (CssLayout) comp;
                if (dashboardWrapper.getComponent(0) instanceof ValoMenuItemButton) {
                    ValoMenuItemButton menuItemButton = (ValoMenuItemButton) dashboardWrapper.getComponent(0);
                    menuItemButton.removeStyleName("selected");
                    if (menuItemButton.getView().getUrl().equals(viewUrl) && menuItemButton.getParameters() == null
                            && (parameters == null || parameters.isEmpty())) {
                        menuItemButton.addStyleName("selected");
                    } else if (menuItemButton.getView().getUrl().equals(viewUrl) && parameters != null
                            && Objects.equals(menuItemButton.getParameters(), parameters)) {
                        menuItemButton.addStyleName("selected");
                    }
                }
            }
        }
    }

    @Override
    public void buttonClick(Button.ClickEvent event) {
        if (event.getButton().equals(valoMenuToggleButton)) {
            if (getStyleName().contains(STYLE_VISIBLE)) {
                removeStyleName(STYLE_VISIBLE);
            } else {
                addStyleName(STYLE_VISIBLE);
            }
        } else if (event.getButton().equals(developerButton)) {
            HybridbpmUI.setDeveloperMode(!HybridbpmUI.getDeveloperMode());
            developerButton.setIcon(HybridbpmUI.getDeveloperMode() ? FontAwesome.EYE : FontAwesome.EYE_SLASH);
            developerButton.setDescription(
                    HybridbpmUI.getDeveloperMode() ? "Turn off developer mode" : "Turn on developer mode");
            HybridbpmUI.getCurrent().buildMenu(HybridbpmUI.getCurrent().getNavigator().getState(), true,
                    HybridbpmUI.getCurrent().getNavigator().getState());
        }
    }

    @Override
    public void menuSelected(MenuItem selectedItem) {
        if (selectedItem.equals(signOutItem)) {
            HybridbpmUI.getCurrent().logout();
        } else if (selectedItem.equals(profileItem)) {
            UsersLayout.openUserEditor(HybridbpmUI.getUser(), new Window.CloseListener() {

                @Override
                public void windowClose(Window.CloseEvent e) {
                    HybridbpmUI.getCurrent().reloadUser();
                }
            });
        }
    }

    public void changeNotification(String viewUrl, Boolean visible, String message) {
        for (Component component : menuItemsLayout) {
            if (component instanceof CssLayout) {
                Component button = ((CssLayout) component).getComponent(0);
                if (button instanceof ValoMenuItemButton) {
                    ValoMenuItemButton valoMenuItemButton = (ValoMenuItemButton) button;
                    if (valoMenuItemButton.getView().getUrl().equals(viewUrl)) {
                        Label label = (Label) ((CssLayout) component).getComponent(1);
                        label.setValue(message);
                        label.setVisible(visible);
                    }
                }
            }
        }
    }

    public void setUserImage() {
        User user = HybridbpmUI.getUser();
        settingsItem.setText(user.getUsername());
        if (user.getImage() != null) {
            StreamResource.StreamSource imagesource = new UserImageSource(user.getImage().toStream());
            StreamResource resource = new StreamResource(imagesource, UUID.randomUUID().toString());
            userImage.setSource(resource);
        } else {
            userImage.setSource(new ThemeResource("img/profile-pic-300px.jpg"));
        }
    }

}