Project

General

Profile

Download (3.13 KB) Statistics
| Branch: | Tag: | Revision:
1
package eu.etaxonomy.vaadin.ui.mainmenu;
2

    
3
import java.util.List;
4
import java.util.Optional;
5
import java.util.stream.Collectors;
6
import java.util.stream.StreamSupport;
7

    
8
import org.springframework.beans.factory.annotation.Autowired;
9
import org.springframework.context.ApplicationEventPublisher;
10
import org.springframework.context.event.EventListener;
11

    
12
import com.vaadin.server.FontAwesome;
13
import com.vaadin.server.Resource;
14
import com.vaadin.spring.annotation.SpringComponent;
15
import com.vaadin.spring.annotation.UIScope;
16
import com.vaadin.ui.Button;
17
import com.vaadin.ui.CssLayout;
18
import com.vaadin.ui.themes.ValoTheme;
19

    
20
import eu.etaxonomy.vaadin.ui.MainMenu;
21
import eu.etaxonomy.vaadin.ui.navigation.AfterViewChangeEvent;
22
import eu.etaxonomy.vaadin.ui.navigation.NavigationEvent;
23

    
24
/**
25
 * ValoMainMenuBean is the implementation of responsive Vaadin Valo theme's menu
26
 *
27
 * @author Peter / Vaadin
28
 */
29

    
30
@SpringComponent
31
@UIScope
32
class ValoMainMenuBean extends CssLayout implements MainMenu {
33

    
34
	private static final long serialVersionUID = -993548217313748689L;
35

    
36
	private final static String MENU_VISIBLE = "valo-menu-visible";
37

    
38
	private CssLayout menuArea;
39

    
40
	private Button menuToggle;
41

    
42
	@Autowired
43
    ApplicationEventPublisher eventBus;
44

    
45
	public ValoMainMenuBean() {
46
		setPrimaryStyleName(ValoTheme.MENU_ROOT);
47

    
48
		CssLayout menuPart = new CssLayout();
49
		menuPart.addStyleName(ValoTheme.MENU_PART);
50

    
51
		menuToggle = new Button("Menu", FontAwesome.LIST);
52
		menuToggle.addClickListener(e -> onToggleMenu());
53
		menuToggle.addStyleName("valo-menu-toggle");
54
		menuToggle.addStyleName(ValoTheme.BUTTON_SMALL);
55

    
56
		menuPart.addComponent(menuToggle);
57

    
58
		menuArea = new CssLayout();
59
		menuArea.setPrimaryStyleName("valo-menuitems");
60
		menuArea.setWidth(100, Unit.PERCENTAGE);
61

    
62
		menuPart.addComponent(menuArea);
63

    
64
		addComponent(menuPart);
65
	}
66

    
67
	private void onToggleMenu() {
68
		if (getStyleName().contains(MENU_VISIBLE)) {
69
			removeStyleName(MENU_VISIBLE);
70
		} else {
71
			addStyleName(MENU_VISIBLE);
72
		}
73
	}
74

    
75
	@Override
76
	public MainMenuItem addMenuItem(String caption, Resource icon, String navigationResource) {
77
		MainMenuItemBean mainMenuItem = new MainMenuItemBean(caption, icon, navigationResource,
78
				e -> onMenuItemClicked(navigationResource));
79
		menuArea.addComponent(mainMenuItem);
80
		return mainMenuItem;
81
	}
82

    
83
	private void onMenuItemClicked(String navigationResource) {
84
	    eventBus.publishEvent(new NavigationEvent(navigationResource));
85
	}
86

    
87
	@EventListener
88
	protected void onNavigationEvent(NavigationEvent e) {
89
		List<MainMenuItemBean> menuItems = StreamSupport.stream(menuArea.spliterator(), false)
90
				.filter(component -> MainMenuItemBean.class.isAssignableFrom(component.getClass()))
91
				.map(component -> MainMenuItemBean.class.cast(component)).collect(Collectors.toList());
92

    
93
		menuItems.forEach(menuItem -> menuItem.setSelected(false));
94
		Optional<MainMenuItemBean> selectedMenuItem = menuItems.stream()
95
				.filter(menuItem -> menuItem.getViewName().equals(e.getViewName())).findFirst();
96
		if (selectedMenuItem.isPresent()) {
97
			selectedMenuItem.get().setSelected(true);
98
		}
99
	}
100

    
101
	@EventListener
102
	protected void afterViewChange(AfterViewChangeEvent event) {
103
		removeStyleName(MENU_VISIBLE);
104
	}
105
}
(3-3/3)