package com.constellio.app.ui.pages.base; import com.constellio.app.api.extensions.SelectionPanelExtension; import com.constellio.app.api.extensions.params.AvailableActionsParam; import com.constellio.app.entities.navigation.NavigationItem; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; 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.application.Navigation; import com.constellio.app.ui.entities.MetadataSchemaTypeVO; import com.constellio.app.ui.framework.buttons.BaseButton; import com.constellio.app.ui.framework.buttons.SearchButton; import com.constellio.app.ui.framework.buttons.WindowButton; import com.constellio.app.ui.framework.buttons.WindowButton.WindowConfiguration; import com.constellio.app.ui.framework.components.BasePopupView; import com.constellio.app.ui.framework.components.ComponentState; import com.constellio.app.ui.framework.components.converters.CollectionCodeToLabelConverter; import com.constellio.app.ui.framework.components.display.ReferenceDisplay; import com.constellio.app.ui.framework.components.fields.BaseTextField; import com.constellio.app.ui.framework.components.table.RecordVOTable; import com.constellio.app.ui.framework.components.table.SelectionTableAdapter; import com.constellio.app.ui.framework.containers.RecordVOLazyContainer; import com.constellio.app.ui.handlers.OnEnterKeyHandler; import com.constellio.app.ui.pages.base.SessionContext.SelectedRecordIdsChangeListener; import com.constellio.app.ui.pages.search.AdvancedSearchCriteriaComponent; import com.constellio.app.ui.pages.search.AdvancedSearchView; import com.constellio.app.ui.pages.search.SimpleSearchView; import com.constellio.app.ui.pages.search.criteria.Criterion; import com.constellio.model.entities.records.wrappers.Collection; import com.vaadin.data.Item; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.event.FieldEvents.FocusEvent; import com.vaadin.event.FieldEvents.FocusListener; import com.vaadin.event.ItemClickEvent; import com.vaadin.event.MouseEvents; import com.vaadin.navigator.Navigator; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.*; import com.vaadin.shared.MouseEventDetails.MouseButton; import com.vaadin.ui.AbstractSelect.ItemCaptionMode; import com.vaadin.ui.*; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.MenuBar.Command; import com.vaadin.ui.MenuBar.MenuItem; import com.vaadin.ui.PopupView.PopupVisibilityEvent; import com.vaadin.ui.PopupView.PopupVisibilityListener; import com.vaadin.ui.Table.ColumnHeaderMode; import com.vaadin.ui.Window.CloseEvent; import com.vaadin.ui.Window.CloseListener; import com.vaadin.ui.themes.ValoTheme; import java.util.ArrayList; import java.util.List; import static com.constellio.app.ui.i18n.i18n.$; import static java.util.Arrays.asList; @SuppressWarnings("serial") public class ConstellioHeaderImpl extends HorizontalLayout implements ConstellioHeader, SelectedRecordIdsChangeListener { private static final String POPUP_ID = "header-popup"; private static final String SHOW_ADVANCED_SEARCH_POPUP_HIDDEN_STYLE_NAME = "header-show-advanced-search-button-popup-hidden"; private static final String SHOW_ADVANCED_SEARCH_POPUP_VISIBLE_STYLE_NAME = "header-show-advanced-search-button-popup-visible"; private List<String> collections = new ArrayList<>(); private final ConstellioHeaderPresenter presenter; private TextField searchField; private WindowButton selectionButton; private BasePopupView popupView; private Button showAdvancedSearchButton; private ComboBox advancedSearchSchemaTypeField; private Component advancedSearchForm; private Button clearAdvancedSearchButton; private AdvancedSearchCriteriaComponent criteria; private Component selectionPanel; private Table selectionTable; private SelectionTableAdapter selectionTableAdapter; private VerticalLayout actionMenuLayout; private int selectionCount; private Boolean delayedSelectionButtonEnabled; private CollectionCodeToLabelConverter collectionCodeToLabelConverter = new CollectionCodeToLabelConverter(); public ConstellioHeaderImpl() { presenter = new ConstellioHeaderPresenter(this); Resource resource = presenter.getUserLogoResource(); Image logo = new Image("", resource != null ? resource : new ThemeResource("images/logo_eim_406x60.png")); logo.setHeight("30px"); logo.setWidth("203px"); logo.setAlternateText(("logo")); logo.addStyleName("header-logo"); logo.addClickListener(new MouseEvents.ClickListener() { @Override public void click(MouseEvents.ClickEvent event) { if (event.getButton() == MouseButton.LEFT) { presenter.logoClicked(); } } }); searchField = new BaseTextField(); searchField.addStyleName("header-search"); searchField.addFocusListener(new FocusListener() { @Override public void focus(FocusEvent event) { if (presenter.isValidAdvancedSearchCriterionPresent()) { presenter.advancedSearchFormButtonClicked(); } } }); showAdvancedSearchButton = new Button(); showAdvancedSearchButton.addStyleName("header-show-advanced-search-button"); showAdvancedSearchButton.addStyleName(ValoTheme.BUTTON_BORDERLESS); showAdvancedSearchButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.advancedSearchFormButtonClicked(); } }); showAdvancedSearchButton.addStyleName(SHOW_ADVANCED_SEARCH_POPUP_HIDDEN_STYLE_NAME); Button searchButton = new SearchButton(); searchButton.addStyleName("header-search-button"); searchButton.addStyleName(ValoTheme.BUTTON_PRIMARY); searchButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.searchRequested(searchField.getValue(), getAdvancedSearchSchemaType()); } }); OnEnterKeyHandler onEnterHandler = new OnEnterKeyHandler() { @Override public void onEnterKeyPressed() { presenter.searchRequested(searchField.getValue(), getAdvancedSearchSchemaType()); } }; onEnterHandler.installOn(searchField); advancedSearchForm = buildAdvancedSearchUI(); popupView = newPopupView(advancedSearchForm); MenuBar collectionMenu = buildCollectionMenu(); MenuBar actionMenu = buildActionMenu(); selectionButton = buildSelectionButton(); setSelectionButtonIcon(); selectionPanel = buildSelectionPanel(); addComponents(logo, searchField, showAdvancedSearchButton, searchButton, collectionMenu, actionMenu, selectionButton, popupView); // setComponentAlignment(headerMenu, Alignment.MIDDLE_RIGHT); setSizeFull(); adjustSearchFieldContent(); getNavigator().addViewChangeListener(new ViewChangeListener() { @Override public boolean beforeViewChange(ViewChangeEvent event) { return true; } @Override public void afterViewChange(ViewChangeEvent event) { if (!(event.getNewView() instanceof AdvancedSearchView || event.getNewView() instanceof SimpleSearchView)) { searchField.setValue(null); advancedSearchSchemaTypeField.setValue(null); criteria.clear(); criteria.addEmptyCriterion().addEmptyCriterion(); clearAdvancedSearchButton.setEnabled(false); adjustSearchFieldContent(); } } }); } private BasePopupView newPopupView(final Component component) { Responsive.makeResponsive(component); component.addStyleName("header-popup-content"); component.setWidthUndefined(); Panel wrapper = new Panel(component); wrapper.addStyleName("header-popup-content-wrapper"); BasePopupView popupView = new BasePopupView("", wrapper); popupView.setId(POPUP_ID); popupView.addStyleName(POPUP_ID); popupView.setHideOnMouseOut(false); popupView.addPopupVisibilityListener(new PopupVisibilityListener() { @Override public void popupVisibilityChange(PopupVisibilityEvent event) { if (component == advancedSearchForm) { if (event.isPopupVisible()) { showAdvancedSearchButton.removeStyleName(SHOW_ADVANCED_SEARCH_POPUP_HIDDEN_STYLE_NAME); showAdvancedSearchButton.addStyleName(SHOW_ADVANCED_SEARCH_POPUP_VISIBLE_STYLE_NAME); } else { showAdvancedSearchButton.removeStyleName(SHOW_ADVANCED_SEARCH_POPUP_VISIBLE_STYLE_NAME); showAdvancedSearchButton.addStyleName(SHOW_ADVANCED_SEARCH_POPUP_HIDDEN_STYLE_NAME); } adjustSearchFieldContent(); } if (!event.isPopupVisible()) { presenter.popupClosed(); } } }); return popupView; } @Override public void setAdvancedSearchFormVisible(boolean visible) { if (visible) { if (popupView.getContent().getPopupComponent() != advancedSearchForm) { BasePopupView newPopupView = newPopupView(advancedSearchForm); replaceComponent(popupView, newPopupView); popupView = newPopupView; } popupView.setPopupVisible(true, false); } else { popupView.setPopupVisible(false, false); } } @Override public void setSelectionPanelVisible(boolean visible, boolean refresh) { if (visible) { if (refresh) { selectionPanel = buildSelectionPanel(); } // if (popupView.getContent().getPopupComponent() != selectionPanel) { // BasePopupView newPopupView = newPopupView(selectionPanel); // replaceComponent(popupView, newPopupView); // popupView = newPopupView; // } // popupView.setPopupVisible(true, false); // } else { // popupView.setPopupVisible(false, false); } if (selectionPanel.isVisible() != visible) { selectionPanel.setVisible(visible); } } private void adjustSearchFieldContent() { if (popupView.isPopupVisible()) { searchField.setInputPrompt(""); } else if (presenter.isValidAdvancedSearchCriterionPresent()) { searchField.setInputPrompt($("AdvancedSearchView.advancedCriteriaPrompt")); } else { searchField.setInputPrompt($("AdvancedSearchView.searchPrompt")); } } protected Component buildAdvancedSearchUI() { Button addCriterion = new Button($("add")); addCriterion.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.addCriterionRequested(); } }); addCriterion.addStyleName(ValoTheme.BUTTON_LINK); HorizontalLayout top = new HorizontalLayout(buildSchemaTypeComponent(), addCriterion); top.setComponentAlignment(addCriterion, Alignment.BOTTOM_RIGHT); top.setWidth("100%"); criteria = new AdvancedSearchCriteriaComponent(presenter); criteria.addEmptyCriterion(); criteria.addEmptyCriterion(); criteria.setWidth("100%"); Button advancedSearch = new Button($("AdvancedSearchView.search")); advancedSearch.addStyleName(ValoTheme.BUTTON_PRIMARY); advancedSearch.addStyleName("advanced-search-button"); advancedSearch.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.searchRequested(searchField.getValue(), getAdvancedSearchSchemaType()); } }); clearAdvancedSearchButton = new Button($("AdvancedSearchView.clearAdvancedSearch")); clearAdvancedSearchButton.addStyleName(ValoTheme.BUTTON_LINK); clearAdvancedSearchButton.addStyleName("clear-advanced-search-button"); clearAdvancedSearchButton.setEnabled(false); clearAdvancedSearchButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { advancedSearchSchemaTypeField.setValue(null); criteria.clear(); criteria.addEmptyCriterion().addEmptyCriterion(); clearAdvancedSearchButton.setEnabled(false); } }); Button savedSearches = new Button($("AdvancedSearchView.savedSearches")); savedSearches.addStyleName(ValoTheme.BUTTON_LINK); savedSearches.addStyleName("saved-searches-button"); savedSearches.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.savedSearchPageRequested(); } }); HorizontalLayout bottom = new HorizontalLayout(advancedSearch, clearAdvancedSearchButton, savedSearches); bottom.addStyleName("header-popup-clear-and-search-buttons"); bottom.setSpacing(true); VerticalLayout searchUI = new VerticalLayout(top, criteria, bottom); searchUI.setSpacing(true); return searchUI; } private Component buildSchemaTypeComponent() { Label label = new Label($("AdvancedSearchView.type")); advancedSearchSchemaTypeField = new ComboBox(); for (MetadataSchemaTypeVO schemaType : presenter.getSchemaTypes()) { advancedSearchSchemaTypeField.addItem(schemaType.getCode()); String itemCaption = schemaType.getLabel(ConstellioUI.getCurrentSessionContext().getCurrentLocale()); advancedSearchSchemaTypeField.setItemCaption(schemaType.getCode(), itemCaption); } advancedSearchSchemaTypeField.setItemCaptionMode(ItemCaptionMode.EXPLICIT); advancedSearchSchemaTypeField.setNullSelectionAllowed(false); advancedSearchSchemaTypeField.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { selectAdvancedSearchSchemaType((String) advancedSearchSchemaTypeField.getValue()); } }); HorizontalLayout layout = new HorizontalLayout(label, advancedSearchSchemaTypeField); layout.setComponentAlignment(label, Alignment.MIDDLE_LEFT); layout.setSpacing(true); return layout; } private WindowButton buildSelectionButton() { WindowConfiguration config = new WindowConfiguration(true, true, "80%", null); WindowButton selectionButton = new WindowButton($("ConstellioHeader.selection"), $("ConstellioHeader.selectionPanelTitle"), config) { @Override protected Component buildWindowContent() { return selectionPanel; } @Override protected boolean acceptWindowOpen(ClickEvent event) { presenter.selectionButtonClicked(); return selectionPanel.isVisible(); } }; selectionButton.setBadgeVisible(true); selectionButton.setBadgeCount(selectionCount); selectionButton.addStyleName("header-selection-button"); if (delayedSelectionButtonEnabled != null) { selectionButton.setEnabled(delayedSelectionButtonEnabled); } selectionButton.addCloseListener(new CloseListener() { @Override public void windowClose(CloseEvent e) { Navigator navigator = ConstellioUI.getCurrent().getNavigator(); navigator.navigateTo(navigator.getState()); } }); return selectionButton; } @Override public void attach() { SessionContext sessionContext = ConstellioUI.getCurrentSessionContext(); sessionContext.addSelectedRecordIdsChangeListener(this); super.attach(); } @Override public void detach() { SessionContext sessionContext = ConstellioUI.getCurrentSessionContext(); sessionContext.removeSelectedRecordIdsChangeListener(this); super.detach(); } @Override public void selectionCleared() { presenter.selectedRecordsCleared(); } @Override public void recordIdRemoved(String recordId) { presenter.selectedRecordIdRemoved(recordId); } @Override public void recordIdAdded(String recordId) { presenter.selectedRecordIdAdded(recordId); } @SuppressWarnings({ "unchecked" }) private Component buildSelectionPanel() { final VerticalLayout selectionPanel = new VerticalLayout(); selectionPanel.setSpacing(true); // selectionPanel.setWidth("100%"); selectionPanel.addStyleName("header-selection-panel"); selectionPanel.addStyleName("no-scroll"); HorizontalLayout selectionLayout = new HorizontalLayout(); selectionLayout.setSpacing(true); selectionLayout.setWidth("100%"); selectionLayout.addStyleName("header-selection-panel-layout"); selectionTable = new Table(); selectionTable.addContainerProperty("recordId", ReferenceDisplay.class, null); selectionTable.setWidth("100%"); selectionTable.setColumnExpandRatio("recordId", 1); selectionTable.setColumnHeaderMode(ColumnHeaderMode.HIDDEN); List<String> selectedRecordIds = getSessionContext().getSelectedRecordIds(); for (String selectedRecordId : selectedRecordIds) { ReferenceDisplay referenceDisplay = new ReferenceDisplay(selectedRecordId, false); Item item = selectionTable.addItem(selectedRecordId); item.getItemProperty("recordId").setValue(referenceDisplay); } Button clearSelectionButton = new BaseButton($("ConstellioHeader.clearSelection")) { @Override protected void buttonClick(ClickEvent event) { presenter.clearSelectionButtonClicked(); } }; clearSelectionButton.addStyleName(ValoTheme.BUTTON_LINK); selectionTableAdapter = new SelectionTableAdapter(selectionTable) { @Override public void selectAll() { presenter.selectAllClicked(); } @Override public void deselectAll() { presenter.deselectAllClicked(); } @Override public boolean isAllItemsSelected() { return presenter.isAllItemsSelected(); } @Override public boolean isAllItemsDeselected() { return presenter.isAllItemsDeselected(); } @Override public boolean isSelected(Object itemId) { String recordId = (String) itemId; return presenter.isSelected(recordId); } @Override public void setSelected(Object itemId, boolean selected) { String recordId = (String) itemId; presenter.selectionChanged(recordId, selected); refreshButtons(); adjustSelectAllButton(selected); } }; Component component = selectionTableAdapter.getComponent(0); HorizontalLayout topButtonsLayout = new HorizontalLayout(component, clearSelectionButton); topButtonsLayout.setSpacing(true); selectionTableAdapter.addComponent(topButtonsLayout, 0); selectionTableAdapter.removeComponent(component); actionMenuLayout = new VerticalLayout(); actionMenuLayout.addStyleName("header-selection-panel-actions"); buildSelectionPanelButtons(actionMenuLayout); VerticalLayout selectionActionMenu = new VerticalLayout(); selectionActionMenu.setWidth("200px"); selectionActionMenu.setSpacing(true); selectionActionMenu.addComponent(actionMenuLayout); HorizontalLayout buttonsLayout = new HorizontalLayout(); buttonsLayout.setSpacing(true); Button closeButton = new BaseButton($("ConstellioHeader.close")) { @Override protected void buttonClick(ClickEvent event) { closeWindow(); } }; buttonsLayout.addComponents(closeButton); buttonsLayout.setDefaultComponentAlignment(Alignment.TOP_CENTER); buttonsLayout.setSpacing(true); selectionPanel.addComponent(selectionLayout); selectionPanel.addComponent(buttonsLayout); selectionPanel.setComponentAlignment(buttonsLayout, Alignment.TOP_CENTER); selectionLayout.addComponent(selectionTableAdapter); selectionLayout.addComponent(selectionActionMenu); selectionLayout.setExpandRatio(selectionTableAdapter, 1); selectionLayout.setComponentAlignment(selectionActionMenu, Alignment.TOP_RIGHT); return selectionPanel; } private void buildSelectionPanelButtons(VerticalLayout actionMenuLayout) { WindowButton addToCartButton = buildAddToCartButton(actionMenuLayout); SelectionPanelExtension.setStyles(addToCartButton); actionMenuLayout.addComponent(addToCartButton); presenter.buildSelectionPanelActionButtons(actionMenuLayout); } private WindowButton buildAddToCartButton(VerticalLayout actionMenuLayout) { final AvailableActionsParam param = presenter.buildAvailableActionsParam(actionMenuLayout); WindowButton windowButton = new WindowButton($("ConstellioHeader.selection.actions.addToCart"), $("ConstellioHeader.selection.actions.addToCart")) { @Override protected Component buildWindowContent() { VerticalLayout layout = new VerticalLayout(); HorizontalLayout newCartLayout = new HorizontalLayout(); newCartLayout.setSpacing(true); newCartLayout.addComponent(new Label($("CartView.newCart"))); final BaseTextField newCartTitleField; newCartLayout.addComponent(newCartTitleField = new BaseTextField()); BaseButton saveButton; newCartLayout.addComponent(saveButton = new BaseButton($("save")) { @Override protected void buttonClick(ClickEvent event) { presenter.createNewCartAndAddToItRequested(newCartTitleField.getValue()); getWindow().close(); } }); saveButton.addStyleName(ValoTheme.BUTTON_PRIMARY); TabSheet tabSheet = new TabSheet(); final RecordVOLazyContainer ownedCartsContainer = new RecordVOLazyContainer(presenter.getOwnedCartsDataProvider()); RecordVOTable ownedCartsTable = new RecordVOTable($("CartView.ownedCarts"), ownedCartsContainer); ownedCartsTable.addItemClickListener(new ItemClickEvent.ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { presenter.addToCartRequested(param.getIds(), ownedCartsContainer.getRecordVO((int) event.getItemId())); getWindow().close(); } }); final RecordVOLazyContainer sharedCartsContainer = new RecordVOLazyContainer(presenter.getSharedCartsDataProvider()); RecordVOTable sharedCartsTable = new RecordVOTable($("CartView.sharedCarts"), sharedCartsContainer); sharedCartsTable.addItemClickListener(new ItemClickEvent.ItemClickListener() { @Override public void itemClick(ItemClickEvent event) { presenter.addToCartRequested(param.getIds(), sharedCartsContainer.getRecordVO((int) event.getItemId())); getWindow().close(); } }); ownedCartsTable.setPageLength(Math.min(15, ownedCartsContainer.size())); ownedCartsTable.setWidth("100%"); sharedCartsTable.setPageLength(Math.min(15, ownedCartsContainer.size())); sharedCartsTable.setWidth("100%"); tabSheet.addTab(ownedCartsTable); tabSheet.addTab(sharedCartsTable); layout.addComponents(newCartLayout,tabSheet); return layout; } @Override public boolean isVisible() { return presenter.getCurrentUser().has(RMPermissionsTo.USE_CART).globally() && containsOnly(param.getSchemaTypeCodes(), asList(Folder.SCHEMA_TYPE, Document.SCHEMA_TYPE, ContainerRecord.SCHEMA_TYPE)); } @Override public boolean isEnabled() { return isVisible(); } }; SelectionPanelExtension.setStyles(windowButton); windowButton.setEnabled(presenter.getCurrentUser().has(RMPermissionsTo.USE_CART).globally() && containsOnly(param.getSchemaTypeCodes(), asList(Folder.SCHEMA_TYPE, Document.SCHEMA_TYPE, ContainerRecord.SCHEMA_TYPE))); windowButton.setVisible(isEnabled()); return windowButton; } @Override public void setSearchExpression(String expression) { searchField.setValue(expression); } @Override public String getSearchExpression() { return searchField.getValue(); } @Override public void addEmptyCriterion() { criteria.addEmptyCriterion(); } @Override public ConstellioHeader hideAdvancedSearchPopup() { popupView.setPopupVisible(false); return this; } @Override public List<Criterion> getAdvancedSearchCriteria() { return criteria.getSearchCriteria(); } @Override public void setAdvancedSearchCriteria(List<Criterion> criteria) { this.criteria.setSearchCriteria(criteria); } @Override public void selectAdvancedSearchSchemaType(String schemaTypeCode) { if (schemaTypeCode == null || !schemaTypeCode.equals(advancedSearchSchemaTypeField.getValue())) { advancedSearchSchemaTypeField.setValue(schemaTypeCode); } presenter.schemaTypeSelected(schemaTypeCode); clearAdvancedSearchButton.setEnabled(true); } @Override public String getAdvancedSearchSchemaType() { return presenter.getSchemaType(); } @Override public void setAdvancedSearchSchemaType(String schemaTypeCode) { criteria.setSchemaType(schemaTypeCode); } @Override public CoreViews navigateTo() { return new CoreViews(getUI().getNavigator()); } @Override public SessionContext getSessionContext() { return ConstellioUI.getCurrentSessionContext(); } public Navigator getNavigator() { return UI.getCurrent().getNavigator(); } @Override public String getCollection() { return getSessionContext().getCurrentCollection(); } @Override public ConstellioFactories getConstellioFactories() { return ConstellioFactories.getInstance(); } @Override public void updateUIContent() { ConstellioUI.getCurrent().updateContent(); } protected MenuBar buildCollectionMenu() { MenuBar collectionMenu = new MenuBar(); if (!collections.isEmpty()) { collectionMenu.setAutoOpen(true); collectionMenu.addStyleName("header-collection-menu"); SessionContext sessionContext = getSessionContext(); String currentCollection = sessionContext.getCurrentCollection(); String collectionLabel = collectionCodeToLabelConverter.getCollectionCaption(currentCollection); Page.getCurrent().setTitle(collectionLabel); MenuItem collectionSubMenu = collectionMenu.addItem("", FontAwesome.DATABASE, null); for (final String collection : collections) { if (!Collection.SYSTEM_COLLECTION.equals(collection)) { String collectionCaption = collectionCodeToLabelConverter.getCollectionCaption(collection); MenuItem collectionMenuItem = collectionSubMenu.addItem(collectionCaption, new Command() { @Override public void menuSelected(MenuItem selectedItem) { presenter.collectionClicked(collection); List<MenuItem> menuItems = selectedItem.getParent().getChildren(); for (MenuItem menuItem : menuItems) { menuItem.setChecked(false); } selectedItem.setChecked(true); } }); collectionMenuItem.setCheckable(true); collectionMenuItem.setChecked(currentCollection.equals(collection)); } } } else { collectionMenu.setVisible(false); } return collectionMenu; } private MenuBar buildActionMenu() { MenuBar headerMenu = new MenuBar(); headerMenu.setAutoOpen(true); headerMenu.addStyleName("header-action-menu"); MenuItem headerMenuRoot = headerMenu.addItem($("ConstellioHeader.actions"), FontAwesome.BARS, null); for (final NavigationItem item : presenter.getActionMenuItems()) { ComponentState state = presenter.getStateFor(item); MenuItem menuItem = headerMenuRoot.addItem($("ConstellioHeader." + item.getCode()), new MenuBar.Command() { @Override public void menuSelected(MenuItem selectedItem) { item.activate(navigate()); } }); if (item.getFontAwesome() != null) { menuItem.setIcon(item.getFontAwesome()); } menuItem.setVisible(state.isVisible()); menuItem.setEnabled(state.isEnabled()); menuItem.setStyleName(item.getCode()); } return headerMenu; } public Navigation navigate() { return ConstellioUI.getCurrent().navigate(); } @Override public void setCollections(List<String> collections) { this.collections = collections; } @Override public void setSelectionButtonEnabled(boolean enabled) { if (selectionButton != null) { selectionButton.setEnabled(enabled); setSelectionButtonIcon(); } else { delayedSelectionButtonEnabled = enabled; } } private void setSelectionButtonIcon() { Resource icon; if (selectionButton.isEnabled()) { icon = FontAwesome.CHECK_SQUARE_O; } else { icon = FontAwesome.SQUARE_O; } selectionButton.setIcon(icon); } @Override public void setSelectionCount(int selectionCount) { this.selectionCount = selectionCount; if (selectionButton != null) { selectionButton.setBadgeCount(selectionCount); } } @Override public void refreshSelectionPanel() { } public void closeWindow() { for (Window window : new ArrayList<>(UI.getCurrent().getWindows())) { window.close(); } } public void removeRecordsFromPanel(List<String> idList) { for(String id: idList) { selectionTable.removeItem(id); } refreshButtons(); } public boolean containsOnly(List<String> list, List<String> values) { for(String value: list) { if(!values.contains(value)) { return false; } } return true && list.size() > 0; } @Override public void refreshButtons() { actionMenuLayout.removeAllComponents(); buildSelectionPanelButtons(actionMenuLayout); } public void updateRecords() { selectionTableAdapter.refreshUI(); } }