package org.rr.jeborker.gui; import static org.rr.commons.utils.StringUtil.EMPTY; import java.awt.Component; import java.io.File; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import javax.swing.Action; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JRadioButtonMenuItem; import javax.swing.JSeparator; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import org.apache.commons.lang.ObjectUtils; import org.rr.commons.mufs.IResourceHandler; import org.rr.commons.swing.SwingUtils; import org.rr.commons.utils.ListUtils; import org.rr.commons.utils.StringUtil; import org.rr.jeborker.app.BasePathList; import org.rr.jeborker.app.JeboorkerConstants; import org.rr.jeborker.app.preferences.APreferenceStore; import org.rr.jeborker.app.preferences.PreferenceStoreFactory; import org.rr.jeborker.converter.ConverterFactory; import org.rr.jeborker.converter.IEBookConverter; import org.rr.jeborker.db.item.EbookPropertyItem; import org.rr.jeborker.db.item.EbookPropertyItemUtils; import org.rr.jeborker.gui.action.ActionFactory; import org.rr.jeborker.gui.action.ApplicationAction; import org.rr.jeborker.gui.resources.ImageResourceBundle; import org.rr.jeborker.metadata.MetadataHandlerFactory; class MainMenuBarView extends JMenuBar { private static final long serialVersionUID = 5278345064008258478L; private static Icon eyesVisible; private static Icon eyesInvisible; static { eyesVisible = ImageResourceBundle.getResourceAsImageIcon("eyes_blue_16.png"); eyesInvisible = ImageResourceBundle.getResourceAsImageIcon("eyes_gray_16.png"); } private JMenu menueFile; private JMenu menuEdit; private JMenu menueHelp; private JMenu menuRemoveBasePath; private JMenu menuRefreshBasePath; private JMenu menueBasePathShowHide; MainMenuBarView() { this.init(); } private void init() { add(createFileMenu()); add(createEditMenu()); add(createHelpMenu()); } /** * Removes the menu item having the given path in it's name from the refresh and the remove base menu. * @param path The path entry to be removed. */ void removeBasePathMenuEntry(String path) { removeBasePathMenuEntry(menuRemoveBasePath, path); removeBasePathMenuEntry(menuRefreshBasePath, path); } void removeBasePathMenuEntry(JMenu menu, String path) { final Component[] menuComponents = menu.getMenuComponents(); for (int i = 0; i < menuComponents.length; i++) { if(menuComponents[i] instanceof JMenuItem) { final String name = (String) ((JMenuItem)menuComponents[i]).getAction().getValue(Action.NAME); if(StringUtil.replace(name, File.separator, EMPTY).equals(StringUtil.replace(path, File.separator, EMPTY))) { menu.remove((JMenuItem)menuComponents[i]); } } } } /** * Creates the file menu entry with it's menu items. * @return The new created menu entry. */ private JMenu createFileMenu() { String fileMenuBarName = Bundle.getString("EborkerMainView.file"); this.menueFile = new JMenu(SwingUtils.removeMnemonicMarker(fileMenuBarName)); this.menueFile.setMnemonic(SwingUtils.getMnemonicKeyCode(fileMenuBarName)); this.menueFile.addMenuListener(new MenuListener() { @Override public void menuSelected(MenuEvent e) { createDynamicFileMenu(); } @Override public void menuDeselected(MenuEvent e) { } @Override public void menuCanceled(MenuEvent e) { } private void createDynamicFileMenu() { final MainController controller = MainController.getController(); final List<EbookPropertyItem> selectedItems = controller.getSelectedEbookPropertyItems(); final int[] selectedEbookPropertyItemRows = controller.getSelectedEbookPropertyItemRows(); menueFile.removeAll(); JMenuItem mntmAddEbooks = new JMenuItem(); mntmAddEbooks.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.ADD_BASE_PATH_ACTION, null)); menueFile.add(mntmAddEbooks); final APreferenceStore preferenceStore = PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.DB_STORE); final List<String> basePath = preferenceStore.getBasePath(); { String name = Bundle.getString("EborkerMainView.removeBasePath"); menuRemoveBasePath = new JMenu(SwingUtils.removeMnemonicMarker(name)); menuRemoveBasePath.setMnemonic(SwingUtils.getMnemonicKeyCode(name)); for (Iterator<String> iterator = basePath.iterator(); iterator.hasNext();) { String path = iterator.next(); if(ObjectUtils.notEqual(path, BasePathList.getImportBasePath())) { JMenuItem pathItem = new JMenuItem(); pathItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.REMOVE_BASE_PATH_ACTION, path)); menuRemoveBasePath.add(pathItem); } } menueFile.add(menuRemoveBasePath); if(basePath.isEmpty()) { menuRemoveBasePath.setEnabled(false); } menuRemoveBasePath.add(new JSeparator()); if(basePath.size() > 1) { JMenuItem pathItem = new JMenuItem(); pathItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.REMOVE_BASE_PATH_ACTION, "removeAll")); menuRemoveBasePath.add(pathItem); } } { String name = Bundle.getString("EborkerMainView.refreshBasePath"); menuRefreshBasePath = new JMenu(SwingUtils.removeMnemonicMarker(name)); menuRefreshBasePath.setMnemonic(SwingUtils.getMnemonicKeyCode(name)); for (Iterator<String> iterator = basePath.iterator(); iterator.hasNext();) { String path = iterator.next(); JMenuItem pathItem = new JMenuItem(); pathItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.REFRESH_BASE_PATH_ACTION, path)); menuRefreshBasePath.add(pathItem); } menueFile.add(menuRefreshBasePath); if(basePath.isEmpty()) { menuRefreshBasePath.setEnabled(false); } menuRefreshBasePath.add(new JSeparator()); if(basePath.size() > 1) { JMenuItem pathItem = new JMenuItem(); pathItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.REFRESH_BASE_PATH_ACTION, "refreshAll")); menuRefreshBasePath.add(pathItem); } } { String name = Bundle.getString("EborkerMainView.basePathVisibility"); menueBasePathShowHide = new JMenu(SwingUtils.removeMnemonicMarker(name)); menueBasePathShowHide.setMnemonic(SwingUtils.getMnemonicKeyCode(name)); for (Iterator<String> iterator = basePath.iterator(); iterator.hasNext();) { String path = iterator.next(); ApplicationAction action = ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.SHOW_HIDE_BASE_PATH_ACTION, path); boolean isShow = MainMenuBarController.getController().isShowHideBasePathStatusShow(path); if(isShow) { action.putValue(Action.SMALL_ICON, eyesVisible); } else { action.putValue(Action.SMALL_ICON, eyesInvisible); } JMenuItem pathItem = new JMenuItem(action); menueBasePathShowHide.add(pathItem); } menueBasePathShowHide.add(new JSeparator()); if(basePath.size() > 1) { { JMenuItem pathItem = new JMenuItem(); pathItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.SHOW_HIDE_BASE_PATH_ACTION, "showAll")); menueBasePathShowHide.add(pathItem); } { JMenuItem pathItem = new JMenuItem(); pathItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.SHOW_HIDE_BASE_PATH_ACTION, "hideAll")); menueBasePathShowHide.add(pathItem); } } menueFile.add(menueBasePathShowHide); if(basePath.isEmpty()) { menueBasePathShowHide.setEnabled(false); } } menueFile.add(new JSeparator()); final JMenuItem saveMetadataMenuEntry = new JMenuItem((ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.SAVE_METADATA_ACTION, EMPTY))); saveMetadataMenuEntry.setAccelerator(MainViewMenuUtils.SAVE_KEY); menueFile.add(saveMetadataMenuEntry); menueFile.add(new JSeparator()); //Open folder only for single selection. final JMenuItem openFolderMenuEntry; final JMenuItem openFileMenuEntry; final JMenuItem renameFileMenuEntry; final JMenuItem deleteFileMenuEntry; if(selectedItems.size() == 1) { openFolderMenuEntry = new JMenuItem(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.OPEN_FOLDER_ACTION, selectedItems.get(0).getFile())); openFolderMenuEntry.setEnabled(true); openFileMenuEntry = new JMenuItem(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.OPEN_FILE_ACTION, selectedItems.get(0).getFile())); openFileMenuEntry.setEnabled(true); } else { if(MainViewSelectionUtils.isTreeItemSingleSelection()) { List<IResourceHandler> selectedResources = controller.getMainTreeHandler().getSelectedTreeItems(); openFolderMenuEntry = new JMenuItem(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.OPEN_FOLDER_ACTION, selectedResources.get(0).toString())); openFolderMenuEntry.setEnabled(true); openFileMenuEntry = new JMenuItem(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.OPEN_FILE_ACTION, selectedResources.get(0).toString())); openFileMenuEntry.setEnabled(true); } else { openFolderMenuEntry = new JMenuItem(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.OPEN_FOLDER_ACTION, EMPTY)); openFolderMenuEntry.setEnabled(false); openFileMenuEntry = new JMenuItem(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.OPEN_FILE_ACTION, EMPTY)); openFileMenuEntry.setEnabled(false); } } renameFileMenuEntry = MainViewMenuUtils.createRenameFileMenuItem(); renameFileMenuEntry.setEnabled(false); if(!MainViewSelectionUtils.isDirectorySelectionIncluded() && (MainViewSelectionUtils.isTreeItemSelection() || MainViewSelectionUtils.isMainTableSelection())) { renameFileMenuEntry.setEnabled(true); } if(MainViewSelectionUtils.isMainTableSelection()) { deleteFileMenuEntry = new JMenuItem(ActionFactory.getActionForItems(ActionFactory.DYNAMIC_ACTION_TYPES.DELETE_FILE_ACTION, selectedItems, selectedEbookPropertyItemRows)); deleteFileMenuEntry.setEnabled(true); } else if(MainViewSelectionUtils.isTreeItemSelection()) { List<IResourceHandler> selectedTreeItems = MainController.getController().getMainTreeHandler().getSelectedTreeItems(); deleteFileMenuEntry = new JMenuItem(ActionFactory.getActionForResource(ActionFactory.DYNAMIC_ACTION_TYPES.DELETE_FILE_ACTION, selectedTreeItems)); if(PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.DB_STORE).getBasePath().isOneEntryABasePathMember(selectedTreeItems)) { deleteFileMenuEntry.setEnabled(false); } else { deleteFileMenuEntry.setEnabled(true); } } else { deleteFileMenuEntry = new JMenuItem(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.DELETE_FILE_ACTION, EMPTY)); deleteFileMenuEntry.setEnabled(false); } deleteFileMenuEntry.setAccelerator(MainViewMenuUtils.DELETE_KEY); JMenu copyToSubMenu = MainViewMenuUtils.createSendToMenu(); if(selectedItems.size() >= 1) { copyToSubMenu.setEnabled(true); } else { if(controller.getMainTreeHandler().getSelectedTreeItems().size() > 0) { copyToSubMenu.setEnabled(true); } else { copyToSubMenu.setEnabled(false); } } menueFile.add(openFileMenuEntry); menueFile.add(renameFileMenuEntry); menueFile.add(openFolderMenuEntry); menueFile.add(copyToSubMenu); menueFile.add(deleteFileMenuEntry); menueFile.add(new JSeparator()); //quit menu entry JMenuItem mntmQuit = new JMenuItem(); mntmQuit.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.QUIT_ACTION, (String) null)); mntmQuit.setAccelerator(MainViewMenuUtils.QUIT_KEY); menueFile.add(mntmQuit); } }); return menueFile; } private JMenu createEditMenu() { String editMenuBarName = Bundle.getString("EborkerMainView.edit"); this.menuEdit = new JMenu(SwingUtils.removeMnemonicMarker(editMenuBarName)); this.menuEdit.setMnemonic(SwingUtils.getMnemonicKeyCode(editMenuBarName)); this.menuEdit.addMenuListener(new MenuListener() { @Override public void menuSelected(MenuEvent e) { final MainController controller = MainController.getController(); final List<EbookPropertyItem> selectedItems = controller.getSelectedEbookPropertyItems(); final int[] selectedEbookPropertyItemRows = controller.getSelectedEbookPropertyItemRows(); final List<IResourceHandler> selectedItemResources = EbookPropertyItemUtils.createIResourceHandlerList(selectedItems); menuEdit.removeAll(); createDynamicEditMenu(selectedItems, selectedEbookPropertyItemRows); JMenuItem find = new JMenuItem(ActionFactory.getTableFindAction(null)); find.setText(SwingUtils.removeMnemonicMarker(Bundle.getString("MainMenuBarView.find"))); find.setMnemonic(SwingUtils.getMnemonicKeyCode(Bundle.getString("MainMenuBarView.find"))); find.setIcon(ImageResourceBundle.getResourceAsImageIcon("find_16.png")); find.setAccelerator(MainViewMenuUtils.FIND_KEY); menuEdit.add(find); menuEdit.add(new JSeparator()); createDynamicMetadataMenuEntries(selectedItems, selectedEbookPropertyItemRows); JMenuItem metadataDownloadItem = new JMenuItem(); metadataDownloadItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.SHOW_METADATA_DOWNLOAD_ACTION, null)); menuEdit.add(metadataDownloadItem); if(!MainViewSelectionUtils.isMainTableSelection() || !MetadataHandlerFactory.hasWriterSupport(selectedItemResources)) { metadataDownloadItem.setEnabled(false); } createConvertMenuEntry(selectedItems, selectedEbookPropertyItemRows); JMenuItem pdfScissorsItem = new JMenuItem(); pdfScissorsItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.SHOW_PDF_SCISSORS_ACTION, null)); pdfScissorsItem.setEnabled(false); if(MainViewSelectionUtils.isMainTableSingleSelection()) { if(selectedItems.get(0).getMimeType().equals(JeboorkerConstants.SUPPORTED_MIMES.MIME_PDF.getMime())) { pdfScissorsItem.setEnabled(true); } else if(selectedItems.get(0).getMimeType().equals(JeboorkerConstants.SUPPORTED_MIMES.MIME_CBZ.getMime())) { pdfScissorsItem.setEnabled(true); } else if(selectedItems.get(0).getMimeType().equals(JeboorkerConstants.SUPPORTED_MIMES.MIME_CBR.getMime())) { pdfScissorsItem.setEnabled(true); } } menuEdit.add(pdfScissorsItem); JMenuItem mergeDocItem = new JMenuItem(); mergeDocItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.MERGE_DOCUMENT_ACTION, null)); mergeDocItem.setEnabled(false); if(MainViewSelectionUtils.isMainTableMultiSelection()) { Collection<String> mimeTypesFromSelection = MainViewSelectionUtils.getMimeTypesFromSelection(); if(mimeTypesFromSelection.size() == 1) { if(mimeTypesFromSelection.contains(JeboorkerConstants.SUPPORTED_MIMES.MIME_PDF.getMime())) { mergeDocItem.setEnabled(true); } } } // menuEdit.add(mergeDocItem); menuEdit.add(new JSeparator()); JMenuItem editPreferencesItem = new JMenuItem(); editPreferencesItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.SHOW_PREFERENCE_DIALOG_ACTION, null)); menuEdit.add(editPreferencesItem); } @Override public void menuDeselected(MenuEvent e) { } @Override public void menuCanceled(MenuEvent e) { } private void createDynamicEditMenu(List<EbookPropertyItem> selectedItems, int[] selectedEbookPropertyItemRows) { List<IResourceHandler> selectedTreeItems = MainController.getController().getMainTreeHandler().getSelectedTreeItems(); JMenuItem copyClipboard = new JMenuItem(ActionFactory.getActionForItems(ActionFactory.DYNAMIC_ACTION_TYPES.COPY_TO_CLIPBOARD_ACTION, selectedItems, selectedEbookPropertyItemRows)); if(!copyClipboard.isEnabled()) { copyClipboard = new JMenuItem(ActionFactory.getActionForResource(ActionFactory.DYNAMIC_ACTION_TYPES.COPY_TO_CLIPBOARD_ACTION, selectedTreeItems)); } copyClipboard.setAccelerator(MainViewMenuUtils.COPY_KEY); menuEdit.add(copyClipboard); JMenuItem pasteClipboard = new JMenuItem(ActionFactory.getActionForItems(ActionFactory.DYNAMIC_ACTION_TYPES.PASTE_FROM_CLIPBOARD_ACTION, selectedItems, selectedEbookPropertyItemRows)); if(!pasteClipboard.isEnabled()) { pasteClipboard = new JMenuItem(ActionFactory.getActionForResource(ActionFactory.DYNAMIC_ACTION_TYPES.PASTE_FROM_CLIPBOARD_ACTION, selectedTreeItems)); } pasteClipboard.setAccelerator(MainViewMenuUtils.PASTE_KEY); menuEdit.add(pasteClipboard); } /** * Creates the menu entries for the metadata menu entry. * @param items Items for the menu items. * @return The list of menu entries. */ private void createDynamicMetadataMenuEntries(List<EbookPropertyItem> selectedItems, int[] selectedEbookPropertyItemRows) { String name = Bundle.getString("EborkerMainView.cover"); JMenu coverSubMenu = new JMenu(SwingUtils.removeMnemonicMarker(name)); coverSubMenu.setMnemonic(SwingUtils.getMnemonicKeyCode(name)); coverSubMenu.setIcon(ImageResourceBundle.getResourceAsImageIcon("image_16.png")); MainView.addCoverMenuItems(coverSubMenu, selectedItems, selectedEbookPropertyItemRows); menuEdit.add(coverSubMenu); if(coverSubMenu.getMenuComponentCount() == 0) { coverSubMenu.setEnabled(false); } Action action = ActionFactory.getActionForItems(ActionFactory.DYNAMIC_ACTION_TYPES.EDIT_PLAIN_METADATA_ACTION, selectedItems, selectedEbookPropertyItemRows); menuEdit.add(new JMenuItem(action)); action = ActionFactory.getActionForItems(ActionFactory.DYNAMIC_ACTION_TYPES.REFRESH_ENTRY_ACTION, selectedItems, selectedEbookPropertyItemRows); menuEdit.add(new JMenuItem(action)); } private void createConvertMenuEntry(List<EbookPropertyItem> selectedItems, int[] selectedEbookPropertyItemRows) { String name = Bundle.getString("EborkerMainView.convert"); JMenu convertSubMenu = new JMenu(SwingUtils.removeMnemonicMarker(name)); convertSubMenu.setMnemonic(SwingUtils.getMnemonicKeyCode(name)); convertSubMenu.setIcon(ImageResourceBundle.getResourceAsImageIcon("convert_16.png")); convertSubMenu.setEnabled(false); if(!selectedItems.isEmpty() && sameType(selectedItems)) { List<IEBookConverter> converter = ConverterFactory.getConverter(selectedItems.get(0).getResourceHandler()); for(IEBookConverter c : converter) { Action action = ActionFactory.getActionForItems(ActionFactory.DYNAMIC_ACTION_TYPES.CONVERT_EBOOK_ACTION, selectedItems, selectedEbookPropertyItemRows); action.putValue("converterClass", c.getClass()); JMenuItem converterMenuItem = new JMenuItem(action); converterMenuItem.setText(StringUtil.capitalize(c.getConversionSourceType().getName()) + " " + Bundle.getString("MainMenuBarView.conversion.connector") + " " + StringUtil.capitalize(c.getConversionTargetType().getName())); convertSubMenu.add(converterMenuItem); convertSubMenu.setEnabled(true); } } menuEdit.add(convertSubMenu); } }); return this.menuEdit; } private JMenu createHelpMenu() { final String helpMenuBarName = Bundle.getString("EborkerMainView.help"); menueHelp = new JMenu(SwingUtils.removeMnemonicMarker(helpMenuBarName)); menueHelp.setMnemonic(SwingUtils.getMnemonicKeyCode(helpMenuBarName)); JMenuItem logItem = new JMenuItem(); logItem.setAction(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.VIEW_LOG_MONITOR_ACTION, null)); menueHelp.add(logItem); { // look and feel menu String lookAndFeelName = Bundle.getString("EborkerMainView.laf"); JMenu lookAndFeelMenu = new JMenu(SwingUtils.removeMnemonicMarker(lookAndFeelName)); lookAndFeelMenu.setMnemonic(SwingUtils.getMnemonicKeyCode(lookAndFeelName)); final String currentLaf = PreferenceStoreFactory.getPreferenceStore(PreferenceStoreFactory.PREFERENCE_KEYS.LOOK_AND_FEEL) .getEntryAsString(PreferenceStoreFactory.PREFERENCE_KEYS.LOOK_AND_FEEL); final ButtonGroup grp = new ButtonGroup(); final HashMap<String, JMenu> subMenus = new HashMap<String, JMenu>(); for(String lafName : JeboorkerConstants.LOOK_AND_FEELS.keySet()) { JMenu parentMenu = lookAndFeelMenu; String lafViewName = lafName; if(lafName.contains(";")) { List<String> split = ListUtils.split(lafName, ";"); parentMenu = subMenus.containsKey(split.get(0)) ? subMenus.get(split.get(0)) : new JMenu(split.get(0)); subMenus.put(split.get(0), parentMenu); lookAndFeelMenu.add(parentMenu); lafViewName = split.get(1); } ApplicationAction action = ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.CHANGE_LOOK_AND_FEEL_ACTION, lafName); JRadioButtonMenuItem radioMenuItem = new JRadioButtonMenuItem(action); radioMenuItem.setText(lafViewName); grp.add(radioMenuItem); if(JeboorkerConstants.LOOK_AND_FEELS.get(lafName).equals(currentLaf)) { radioMenuItem.setSelected(true); } else { radioMenuItem.setSelected(false); } parentMenu.add(radioMenuItem); } menueHelp.add(lookAndFeelMenu); } menueHelp.add(ActionFactory.getAction(ActionFactory.COMMON_ACTION_TYPES.VIEW_ABOUT_DIALOG_ACTION, null)); return menueHelp; } /** * Tests of the selected {@link EbookPropertyItem} are from the same mime type. */ private static boolean sameType(List<EbookPropertyItem> selectedItems) { String type = null; for(EbookPropertyItem item : selectedItems) { if(type == null) { type = item.getMimeType(); } else { if(item.getMimeType().equals(type)) { continue; } else { return false; } } } return true; } }