/* * Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com] * 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 de.ks.menu.presenter; import com.google.common.util.concurrent.ThreadFactoryBuilder; import de.ks.i18n.Localized; import de.ks.imagecache.Images; import de.ks.menu.MenuItemDescriptor; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.image.ImageView; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * */ public class MenuBarPresenter extends AbstractPresenter<MenuBar> { Map<String, Menu> menus = new TreeMap<>(); List<String> menuNames = new ArrayList<>(); MenuBar menuBar = null; protected final ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newCachedThreadPool(new ThreadFactoryBuilder().setDaemon(true).build()); public MenuBarPresenter() { executorService.setCorePoolSize(0); executorService.setKeepAliveTime(5, TimeUnit.SECONDS); } @Override public MenuBar getMenu(String menuPath) { if (menuBar == null) { for (MenuItemDescriptor item : this.menuExtension.getMenuEntries(menuPath)) { String currentItemMenuPath = item.getMenuPath(); menuNames.add(currentItemMenuPath); Menu menu = getOrCreateMenu(currentItemMenuPath); MenuItem menuItem = createMenuItem(item); menu.getItems().add(menuItem); } List<Menu> rootMenus = createMenuTreeStructure(); menuBar = new MenuBar(); menuBar.getMenus().addAll(rootMenus); } return menuBar; } private Menu getOrCreateMenu(String currentItemMenuPath) { if (!menus.containsKey(currentItemMenuPath)) { createMenu(currentItemMenuPath); } return menus.get(currentItemMenuPath); } private MenuItem createMenuItem(MenuItemDescriptor item) { MenuItem menuItem = new MenuItem(); if (item.getImagePath() != null && !item.getImagePath().isEmpty()) { Images.later(item.getImagePath(), executorService)// .thenAccept(img -> menuItem.setGraphic(new ImageView(img))); } menuItem.setId(item.getMenuItemPath()); menuItem.setText(Localized.get(item.getTranslationPath())); menuItem.setOnAction(createDefaultActionHandler(item)); return menuItem; } private void createMenu(String menuPath) { Menu menu = new Menu(); menu.setId(menuPath); menu.setText(Localized.get(menuPath.toLowerCase(Locale.ROOT).substring(1).replace("/", "."))); menus.put(menuPath, menu); } protected List<Menu> createMenuTreeStructure() { List<String> rootMenus = new ArrayList<>(); for (String menuName : menuNames) { String seperator = de.ks.menu.MenuItem.SEPERATOR; String[] menuPath = menuName.substring(1).split(seperator); String currentMenuName = seperator + menuPath[0]; Menu lastMenu = null; for (int i = 1; i < menuPath.length; i++) { currentMenuName += seperator + menuPath[i]; Menu currentMenu = getOrCreateMenu(currentMenuName); if (lastMenu != null) { lastMenu.getItems().add(currentMenu); } if (i == 1) { String rootName = seperator + menuPath[0] + seperator + menuPath[1]; if (!rootMenus.contains(rootName)) { rootMenus.add(rootName); } } lastMenu = currentMenu; } } List<Menu> retval = rootMenus.stream().map(m -> getOrCreateMenu(m)).collect(Collectors.toList()); return retval; } }