X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2Fui%2FGuiReaderFrame.java;h=e0ef6d72f8a6b75805e3989a46591ae5e7abbbaf;hb=d66deb8d8b30cff6b54db352eef34a3508939f84;hp=f7fb09f205c3546402b6acad8a719125a9c66e15;hpb=14bb95fae33d405c0a43682c144d081bfbcad545;p=nikiroo-utils.git diff --git a/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java b/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java index f7fb09f..e0ef6d7 100644 --- a/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java +++ b/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java @@ -26,14 +26,19 @@ import javax.swing.filechooser.FileNameExtensionFilter; import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix.bundles.Config; +import be.nikiroo.fanfix.bundles.StringIdGui; import be.nikiroo.fanfix.bundles.UiConfig; import be.nikiroo.fanfix.data.MetaData; import be.nikiroo.fanfix.data.Story; +import be.nikiroo.fanfix.library.BasicLibrary; +import be.nikiroo.fanfix.library.BasicLibrary.Status; import be.nikiroo.fanfix.library.LocalLibrary; import be.nikiroo.fanfix.output.BasicOutput.OutputType; import be.nikiroo.fanfix.reader.BasicReader; import be.nikiroo.fanfix.reader.ui.GuiReaderMainPanel.FrameHelper; -import be.nikiroo.fanfix.reader.ui.GuiReaderMainPanel.StoryRunnable; +import be.nikiroo.fanfix.reader.ui.GuiReaderMainPanel.MetaDataRunnable; +import be.nikiroo.fanfix.searchable.BasicSearchable; +import be.nikiroo.fanfix.supported.SupportType; import be.nikiroo.utils.Progress; import be.nikiroo.utils.Version; import be.nikiroo.utils.ui.ConfigEditor; @@ -49,10 +54,20 @@ import be.nikiroo.utils.ui.ConfigEditor; class GuiReaderFrame extends JFrame implements FrameHelper { private static final long serialVersionUID = 1L; private GuiReader reader; - private GuiReaderMainPanel helpee; + private GuiReaderMainPanel mainPanel; - private enum MoveAction { - SOURCE, TITLE, AUTHOR + /** + * The different modification actions you can use on {@link Story} items. + * + * @author niki + */ + private enum ChangeAction { + /** Change the source/type, that is, move it to another source. */ + SOURCE, + /** Change its name. */ + TITLE, + /** Change its author. */ + AUTHOR } /** @@ -65,71 +80,80 @@ class GuiReaderFrame extends JFrame implements FrameHelper { * the type of {@link Story} to load, or NULL for all types */ public GuiReaderFrame(GuiReader reader, String type) { - super(String.format("Fanfix %s Library", Version.getCurrentVersion())); + super(getAppTitle(reader.getLibrary().getLibraryName())); this.reader = reader; - // TODO: should we still have that?? - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - helpee = new GuiReaderMainPanel(this, type); + mainPanel = new GuiReaderMainPanel(this, type); setSize(800, 600); setLayout(new BorderLayout()); - add(helpee); - - setVisible(true); + add(mainPanel, BorderLayout.CENTER); } @Override public JPopupMenu createBookPopup() { + Status status = reader.getLibrary().getStatus(); JPopupMenu popup = new JPopupMenu(); popup.add(createMenuItemOpenBook()); popup.addSeparator(); popup.add(createMenuItemExport()); - popup.add(createMenuItemMoveTo(true)); - popup.add(createMenuItemSetCover()); + if (status.isWritable()) { + popup.add(createMenuItemMoveTo()); + popup.add(createMenuItemSetCoverForSource()); + popup.add(createMenuItemSetCoverForAuthor()); + } + popup.add(createMenuItemDownloadToCache()); popup.add(createMenuItemClearCache()); - popup.add(createMenuItemRedownload()); - popup.addSeparator(); - popup.add(createMenuItemRename(true)); - popup.add(createMenuItemSetAuthor(true)); - popup.addSeparator(); - popup.add(createMenuItemDelete()); + if (status.isWritable()) { + popup.add(createMenuItemRedownload()); + popup.addSeparator(); + popup.add(createMenuItemRename()); + popup.add(createMenuItemSetAuthor()); + popup.addSeparator(); + popup.add(createMenuItemDelete()); + } popup.addSeparator(); popup.add(createMenuItemProperties()); return popup; } @Override - public JPopupMenu createSourcePopup() { + public JPopupMenu createSourceAuthorPopup() { JPopupMenu popup = new JPopupMenu(); popup.add(createMenuItemOpenBook()); return popup; } @Override - public void createMenu(boolean libOk) { + public void createMenu(Status status) { + invalidate(); + JMenuBar bar = new JMenuBar(); - JMenu file = new JMenu("File"); + JMenu file = new JMenu(GuiReader.trans(StringIdGui.MENU_FILE)); file.setMnemonic(KeyEvent.VK_F); - JMenuItem imprt = new JMenuItem("Import URL...", KeyEvent.VK_U); + JMenuItem imprt = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_IMPORT_URL), + KeyEvent.VK_U); imprt.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.imprt(true); + mainPanel.imprt(true); } }); - JMenuItem imprtF = new JMenuItem("Import File...", KeyEvent.VK_F); + JMenuItem imprtF = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_IMPORT_FILE), + KeyEvent.VK_F); imprtF.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.imprt(false); + mainPanel.imprt(false); } }); - JMenuItem exit = new JMenuItem("Exit", KeyEvent.VK_X); + JMenuItem exit = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_EXIT), KeyEvent.VK_X); exit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -140,21 +164,28 @@ class GuiReaderFrame extends JFrame implements FrameHelper { file.add(createMenuItemOpenBook()); file.add(createMenuItemExport()); - file.add(createMenuItemMoveTo(libOk)); - file.addSeparator(); - file.add(imprt); - file.add(imprtF); + if (status.isWritable()) { + file.add(createMenuItemMoveTo()); + file.addSeparator(); + file.add(imprt); + file.add(imprtF); + file.addSeparator(); + file.add(createMenuItemRename()); + file.add(createMenuItemSetAuthor()); + } file.addSeparator(); - file.add(createMenuItemRename(libOk)); - file.add(createMenuItemSetAuthor(libOk)); + file.add(createMenuItemProperties()); file.addSeparator(); file.add(exit); bar.add(file); - JMenu edit = new JMenu("Edit"); + JMenu edit = new JMenu(GuiReader.trans(StringIdGui.MENU_EDIT)); edit.setMnemonic(KeyEvent.VK_E); + edit.add(createMenuItemSetCoverForSource()); + edit.add(createMenuItemSetCoverForAuthor()); + edit.add(createMenuItemDownloadToCache()); edit.add(createMenuItemClearCache()); edit.add(createMenuItemRedownload()); edit.addSeparator(); @@ -162,49 +193,77 @@ class GuiReaderFrame extends JFrame implements FrameHelper { bar.add(edit); - JMenu view = new JMenu("View"); + JMenu search = new JMenu(GuiReader.trans(StringIdGui.MENU_SEARCH)); + search.setMnemonic(KeyEvent.VK_H); + for (final SupportType type : SupportType.values()) { + BasicSearchable searchable = BasicSearchable.getSearchable(type); + if (searchable != null) { + JMenuItem searchItem = new JMenuItem(type.getSourceName()); + searchItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + reader.search(type, null, 1, 0, false); + } + }); + search.add(searchItem); + } + } + + bar.add(search); + + JMenu view = new JMenu(GuiReader.trans(StringIdGui.MENU_VIEW)); view.setMnemonic(KeyEvent.VK_V); - JMenuItem vauthors = new JMenuItem("Author"); + JMenuItem vauthors = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_VIEW_AUTHOR)); vauthors.setMnemonic(KeyEvent.VK_A); vauthors.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.setWords(false); - helpee.refreshBooks(); + mainPanel.setWords(false); + mainPanel.refreshBooks(); } }); view.add(vauthors); - JMenuItem vwords = new JMenuItem("Word count"); + JMenuItem vwords = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_VIEW_WCOUNT)); vwords.setMnemonic(KeyEvent.VK_W); vwords.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.setWords(true); - helpee.refreshBooks(); + mainPanel.setWords(true); + mainPanel.refreshBooks(); } }); view.add(vwords); bar.add(view); Map> groupedSources = new HashMap>(); - if (libOk) { - groupedSources = reader.getLibrary().getSourcesGrouped(); + if (status.isReady()) { + try { + groupedSources = reader.getLibrary().getSourcesGrouped(); + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); + } } - JMenu sources = new JMenu("Sources"); + JMenu sources = new JMenu(GuiReader.trans(StringIdGui.MENU_SOURCES)); sources.setMnemonic(KeyEvent.VK_S); populateMenuSA(sources, groupedSources, true); bar.add(sources); Map> goupedAuthors = new HashMap>(); - if (libOk) { - goupedAuthors = reader.getLibrary().getAuthorsGrouped(); + if (status.isReady()) { + try { + goupedAuthors = reader.getLibrary().getAuthorsGrouped(); + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); + } } - JMenu authors = new JMenu("Authors"); + JMenu authors = new JMenu(GuiReader.trans(StringIdGui.MENU_AUTHORS)); authors.setMnemonic(KeyEvent.VK_A); populateMenuSA(authors, goupedAuthors, false); bar.add(authors); - JMenu options = new JMenu("Options"); + JMenu options = new JMenu(GuiReader.trans(StringIdGui.MENU_OPTIONS)); options.setMnemonic(KeyEvent.VK_O); options.add(createMenuItemConfig()); options.add(createMenuItemUiConfig()); @@ -217,20 +276,25 @@ class GuiReaderFrame extends JFrame implements FrameHelper { private void populateMenuSA(JMenu menu, Map> groupedValues, boolean type) { - // "All" and "Listing" special items - JMenuItem item = new JMenuItem("All"); + // "All" and "Listing" special items first + JMenuItem item = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_XXX_ALL_GROUPED)); item.addActionListener(getActionOpenList(type, false)); menu.add(item); - item = new JMenuItem("Listing"); + item = new JMenuItem(GuiReader.trans(StringIdGui.MENU_XXX_ALL_LISTING)); item.addActionListener(getActionOpenList(type, true)); menu.add(item); + menu.addSeparator(); for (final String value : groupedValues.keySet()) { List list = groupedValues.get(value); if (type && list.size() == 1 && list.get(0).isEmpty()) { // leaf item source/type - item = new JMenuItem(value.isEmpty() ? "[unknown]" : value); + item = new JMenuItem( + value.isEmpty() ? GuiReader + .trans(StringIdGui.MENU_AUTHORS_UNKNOWN) + : value); item.addActionListener(getActionOpen(value, type)); menu.add(item); } else { @@ -239,14 +303,21 @@ class GuiReaderFrame extends JFrame implements FrameHelper { // only one group of authors dir = menu; } else { - dir = new JMenu(value.isEmpty() ? "[unknown]" : value); + dir = new JMenu( + value.isEmpty() ? GuiReader + .trans(StringIdGui.MENU_AUTHORS_UNKNOWN) + : value); } for (String sub : list) { // " " instead of "" for the visual height - String itemName = sub.isEmpty() ? " " : sub; - String actualValue = value; + String itemName = sub; + if (itemName.isEmpty()) { + itemName = type ? " " : GuiReader + .trans(StringIdGui.MENU_AUTHORS_UNKNOWN); + } + String actualValue = value; if (type) { if (!sub.isEmpty()) { actualValue += "/" + sub; @@ -280,9 +351,9 @@ class GuiReaderFrame extends JFrame implements FrameHelper { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.removeBookPanes(); - helpee.addBookPane(source, type); - helpee.refreshBooks(); + mainPanel.removeBookPanes(); + mainPanel.addBookPane(source, type); + mainPanel.refreshBooks(); } }; } @@ -291,10 +362,14 @@ class GuiReaderFrame extends JFrame implements FrameHelper { final boolean listMode) { return new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { - helpee.removeBookPanes(); - helpee.addBookPane(type, listMode); - helpee.refreshBooks(); + public void actionPerformed(ActionEvent ae) { + mainPanel.removeBookPanes(); + try { + mainPanel.addBookPane(type, listMode); + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); + } + mainPanel.refreshBooks(); } }; } @@ -305,7 +380,7 @@ class GuiReaderFrame extends JFrame implements FrameHelper { * @return the item */ private JMenuItem createMenuItemConfig() { - final String title = "Fanfix Configuration"; + final String title = GuiReader.trans(StringIdGui.TITLE_CONFIG); JMenuItem item = new JMenuItem(title); item.setMnemonic(KeyEvent.VK_F); @@ -313,11 +388,10 @@ class GuiReaderFrame extends JFrame implements FrameHelper { @Override public void actionPerformed(ActionEvent e) { ConfigEditor ed = new ConfigEditor( - Config.class, Instance.getConfig(), - "This is where you configure the options of the program."); + Config.class, Instance.getInstance().getConfig(), GuiReader.trans(StringIdGui.SUBTITLE_CONFIG)); JFrame frame = new JFrame(title); frame.add(ed); - frame.setSize(800, 600); + frame.setSize(850, 600); frame.setVisible(true); } }); @@ -331,7 +405,7 @@ class GuiReaderFrame extends JFrame implements FrameHelper { * @return the item */ private JMenuItem createMenuItemUiConfig() { - final String title = "UI Configuration"; + final String title = GuiReader.trans(StringIdGui.TITLE_CONFIG_UI); JMenuItem item = new JMenuItem(title); item.setMnemonic(KeyEvent.VK_U); @@ -339,8 +413,8 @@ class GuiReaderFrame extends JFrame implements FrameHelper { @Override public void actionPerformed(ActionEvent e) { ConfigEditor ed = new ConfigEditor( - UiConfig.class, Instance.getUiConfig(), - "This is where you configure the graphical appearence of the program."); + UiConfig.class, Instance.getInstance().getUiConfig(), + GuiReader.trans(StringIdGui.SUBTITLE_CONFIG_UI)); JFrame frame = new JFrame(title); frame.add(ed); frame.setSize(800, 600); @@ -360,53 +434,49 @@ class GuiReaderFrame extends JFrame implements FrameHelper { final JFileChooser fc = new JFileChooser(); fc.setAcceptAllFileFilterUsed(false); - final Map filters = new HashMap(); + // Add the "ALL" filters first, then the others + final Map otherFilters = new HashMap(); for (OutputType type : OutputType.values()) { String ext = type.getDefaultExtension(false); String desc = type.getDesc(false); if (ext == null || ext.isEmpty()) { - filters.put(createAllFilter(desc), type); + fc.addChoosableFileFilter(createAllFilter(desc)); } else { - filters.put(new FileNameExtensionFilter(desc, ext), type); + otherFilters.put(new FileNameExtensionFilter(desc, ext), type); } } - // First the "ALL" filters, then, the extension filters - for (Entry entry : filters.entrySet()) { - if (!(entry.getKey() instanceof FileNameExtensionFilter)) { - fc.addChoosableFileFilter(entry.getKey()); - } - } - for (Entry entry : filters.entrySet()) { - if (entry.getKey() instanceof FileNameExtensionFilter) { - fc.addChoosableFileFilter(entry.getKey()); - } + for (Entry entry : otherFilters.entrySet()) { + fc.addChoosableFileFilter(entry.getKey()); } // - JMenuItem export = new JMenuItem("Save as...", KeyEvent.VK_S); + JMenuItem export = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_EXPORT), KeyEvent.VK_S); export.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); if (selectedBook != null) { - fc.showDialog(GuiReaderFrame.this, "Save"); + fc.showDialog(GuiReaderFrame.this, + GuiReader.trans(StringIdGui.TITLE_SAVE)); if (fc.getSelectedFile() != null) { - final OutputType type = filters.get(fc.getFileFilter()); + final OutputType type = otherFilters.get(fc + .getFileFilter()); final String path = fc.getSelectedFile() .getAbsolutePath() + type.getDefaultExtension(false); final Progress pg = new Progress(); - helpee.outOfUi(pg, new Runnable() { + mainPanel.outOfUi(pg, false, new Runnable() { @Override public void run() { try { reader.getLibrary().export( - selectedBook.getMeta().getLuid(), - type, path, pg); + selectedBook.getInfo().getMeta() + .getLuid(), type, path, pg); } catch (IOException e) { - Instance.getTraceHandler().error(e); + Instance.getInstance().getTraceHandler().error(e); } } }); @@ -447,20 +517,22 @@ class GuiReaderFrame extends JFrame implements FrameHelper { * @return the item */ private JMenuItem createMenuItemClearCache() { - JMenuItem refresh = new JMenuItem("Clear cache", KeyEvent.VK_C); + JMenuItem refresh = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_EDIT_CLEAR_CACHE), + KeyEvent.VK_C); refresh.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); if (selectedBook != null) { - helpee.outOfUi(null, new Runnable() { + mainPanel.outOfUi(null, false, new Runnable() { @Override public void run() { - reader.clearLocalReaderCache(selectedBook.getMeta() - .getLuid()); + reader.clearLocalReaderCache(selectedBook.getInfo() + .getMeta().getLuid()); selectedBook.setCached(false); GuiReaderCoverImager.clearIcon(selectedBook - .getMeta()); + .getInfo()); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { @@ -479,22 +551,23 @@ class GuiReaderFrame extends JFrame implements FrameHelper { /** * Create the "move to" menu item. * - * @param libOk - * the library can be queried - * * @return the item */ - private JMenuItem createMenuItemMoveTo(boolean libOk) { - JMenu changeTo = new JMenu("Move to"); + private JMenuItem createMenuItemMoveTo() { + JMenu changeTo = new JMenu( + GuiReader.trans(StringIdGui.MENU_FILE_MOVE_TO)); changeTo.setMnemonic(KeyEvent.VK_M); Map> groupedSources = new HashMap>(); - if (libOk) { + try { groupedSources = reader.getLibrary().getSourcesGrouped(); + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); } - JMenuItem item = new JMenuItem("New type..."); - item.addActionListener(createMoveAction(MoveAction.SOURCE, null)); + JMenuItem item = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_MOVE_TO_NEW_TYPE)); + item.addActionListener(createMoveAction(ChangeAction.SOURCE, null)); changeTo.add(item); changeTo.addSeparator(); @@ -502,7 +575,8 @@ class GuiReaderFrame extends JFrame implements FrameHelper { List list = groupedSources.get(type); if (list.size() == 1 && list.get(0).isEmpty()) { item = new JMenuItem(type); - item.addActionListener(createMoveAction(MoveAction.SOURCE, type)); + item.addActionListener(createMoveAction(ChangeAction.SOURCE, + type)); changeTo.add(item); } else { JMenu dir = new JMenu(type); @@ -515,8 +589,8 @@ class GuiReaderFrame extends JFrame implements FrameHelper { } item = new JMenuItem(itemName); - item.addActionListener(createMoveAction(MoveAction.SOURCE, - actualType)); + item.addActionListener(createMoveAction( + ChangeAction.SOURCE, actualType)); dir.add(item); } changeTo.add(dir); @@ -529,44 +603,54 @@ class GuiReaderFrame extends JFrame implements FrameHelper { /** * Create the "set author" menu item. * - * @param libOk - * the library can be queried - * * @return the item */ - private JMenuItem createMenuItemSetAuthor(boolean libOk) { - JMenu changeTo = new JMenu("Set author"); + private JMenuItem createMenuItemSetAuthor() { + JMenu changeTo = new JMenu( + GuiReader.trans(StringIdGui.MENU_FILE_SET_AUTHOR)); changeTo.setMnemonic(KeyEvent.VK_A); // New author - JMenuItem newItem = new JMenuItem("New author..."); + JMenuItem newItem = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_MOVE_TO_NEW_AUTHOR)); changeTo.add(newItem); changeTo.addSeparator(); - newItem.addActionListener(createMoveAction(MoveAction.AUTHOR, null)); + newItem.addActionListener(createMoveAction(ChangeAction.AUTHOR, null)); // Existing authors - if (libOk) { - Map> groupedAuthors = reader.getLibrary() - .getAuthorsGrouped(); - - if (groupedAuthors.size() > 1) { - for (String key : groupedAuthors.keySet()) { - JMenu group = new JMenu(key); - for (String value : groupedAuthors.get(key)) { - JMenuItem item = new JMenuItem(value); - item.addActionListener(createMoveAction( - MoveAction.AUTHOR, value)); - group.add(item); - } - changeTo.add(group); - } - } else if (groupedAuthors.size() == 1) { - for (String value : groupedAuthors.values().iterator().next()) { - JMenuItem item = new JMenuItem(value); - item.addActionListener(createMoveAction(MoveAction.AUTHOR, - value)); - changeTo.add(item); + Map> groupedAuthors; + + try { + groupedAuthors = reader.getLibrary().getAuthorsGrouped(); + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); + groupedAuthors = new HashMap>(); + + } + + if (groupedAuthors.size() > 1) { + for (String key : groupedAuthors.keySet()) { + JMenu group = new JMenu(key); + for (String value : groupedAuthors.get(key)) { + JMenuItem item = new JMenuItem( + value.isEmpty() ? GuiReader + .trans(StringIdGui.MENU_AUTHORS_UNKNOWN) + : value); + item.addActionListener(createMoveAction( + ChangeAction.AUTHOR, value)); + group.add(item); } + changeTo.add(group); + } + } else if (groupedAuthors.size() == 1) { + for (String value : groupedAuthors.values().iterator().next()) { + JMenuItem item = new JMenuItem( + value.isEmpty() ? GuiReader + .trans(StringIdGui.MENU_AUTHORS_UNKNOWN) + : value); + item.addActionListener(createMoveAction(ChangeAction.AUTHOR, + value)); + changeTo.add(item); } } @@ -576,41 +660,50 @@ class GuiReaderFrame extends JFrame implements FrameHelper { /** * Create the "rename" menu item. * - * @param libOk - * the library can be queried - * * @return the item */ - private JMenuItem createMenuItemRename( - @SuppressWarnings("unused") boolean libOk) { - JMenuItem changeTo = new JMenuItem("Rename..."); + private JMenuItem createMenuItemRename() { + JMenuItem changeTo = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_RENAME)); changeTo.setMnemonic(KeyEvent.VK_R); - changeTo.addActionListener(createMoveAction(MoveAction.TITLE, null)); + changeTo.addActionListener(createMoveAction(ChangeAction.TITLE, null)); return changeTo; } - private ActionListener createMoveAction(final MoveAction what, + private ActionListener createMoveAction(final ChangeAction what, final String type) { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); if (selectedBook != null) { + boolean refreshRequired = false; + + if (what == ChangeAction.SOURCE) { + refreshRequired = mainPanel.getCurrentType(); + } else if (what == ChangeAction.TITLE) { + refreshRequired = false; + } else if (what == ChangeAction.AUTHOR) { + refreshRequired = !mainPanel.getCurrentType(); + } + String changeTo = type; if (type == null) { + MetaData meta = selectedBook.getInfo().getMeta(); String init = ""; - if (what == MoveAction.SOURCE) { - init = selectedBook.getMeta().getSource(); - } else if (what == MoveAction.TITLE) { - init = selectedBook.getMeta().getTitle(); - } else if (what == MoveAction.AUTHOR) { - init = selectedBook.getMeta().getAuthor(); + if (what == ChangeAction.SOURCE) { + init = meta.getSource(); + } else if (what == ChangeAction.TITLE) { + init = meta.getTitle(); + } else if (what == ChangeAction.AUTHOR) { + init = meta.getAuthor(); } Object rep = JOptionPane.showInputDialog( - GuiReaderFrame.this, "Move to:", - "Moving story", JOptionPane.QUESTION_MESSAGE, - null, null, init); + GuiReaderFrame.this, + GuiReader.trans(StringIdGui.SUBTITLE_MOVE_TO), + GuiReader.trans(StringIdGui.TITLE_MOVE_TO), + JOptionPane.QUESTION_MESSAGE, null, null, init); if (rep == null) { return; @@ -620,26 +713,26 @@ class GuiReaderFrame extends JFrame implements FrameHelper { } final String fChangeTo = changeTo; - helpee.outOfUi(null, new Runnable() { + mainPanel.outOfUi(null, refreshRequired, new Runnable() { @Override public void run() { - if (what.equals("SOURCE")) { - reader.changeSource(selectedBook.getMeta() - .getLuid(), fChangeTo); - } else if (what.equals("TITLE")) { - reader.changeTitle(selectedBook.getMeta() - .getLuid(), fChangeTo); - } else if (what.equals("AUTHOR")) { - reader.changeAuthor(selectedBook.getMeta() - .getLuid(), fChangeTo); + String luid = selectedBook.getInfo().getMeta() + .getLuid(); + if (what == ChangeAction.SOURCE) { + reader.changeSource(luid, fChangeTo); + } else if (what == ChangeAction.TITLE) { + reader.changeTitle(luid, fChangeTo); + } else if (what == ChangeAction.AUTHOR) { + reader.changeAuthor(luid, fChangeTo); } - helpee.unsetSelectedBook(); + mainPanel.getSelectedBook().repaint(); + mainPanel.unsetSelectedBook(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - createMenu(true); + createMenu(reader.getLibrary().getStatus()); } }); } @@ -650,30 +743,51 @@ class GuiReaderFrame extends JFrame implements FrameHelper { } /** - * Create the redownload (then delete original) menu item. + * Create the re-download (then delete original) menu item. * * @return the item */ private JMenuItem createMenuItemRedownload() { - JMenuItem refresh = new JMenuItem("Redownload", KeyEvent.VK_R); + JMenuItem refresh = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_EDIT_REDOWNLOAD), + KeyEvent.VK_R); refresh.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); if (selectedBook != null) { - final MetaData meta = selectedBook.getMeta(); - helpee.imprt(meta.getUrl(), new StoryRunnable() { + final MetaData meta = selectedBook.getInfo().getMeta(); + mainPanel.imprt(meta.getUrl(), new MetaDataRunnable() { @Override - public void run(Story story) { - reader.delete(meta.getLuid()); - helpee.unsetSelectedBook(); - MetaData newMeta = story.getMeta(); + public void run(MetaData newMeta) { if (!newMeta.getSource().equals(meta.getSource())) { reader.changeSource(newMeta.getLuid(), meta.getSource()); } } - }, "Removing old copy"); + }, GuiReader.trans(StringIdGui.PROGRESS_CHANGE_SOURCE)); + } + } + }); + + return refresh; + } + + /** + * Create the download to cache menu item. + * + * @return the item + */ + private JMenuItem createMenuItemDownloadToCache() { + JMenuItem refresh = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_EDIT_DOWNLOAD_TO_CACHE), + KeyEvent.VK_T); + refresh.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); + if (selectedBook != null) { + mainPanel.prefetchBook(selectedBook); } } }); @@ -681,25 +795,39 @@ class GuiReaderFrame extends JFrame implements FrameHelper { return refresh; } + /** * Create the delete menu item. * * @return the item */ private JMenuItem createMenuItemDelete() { - JMenuItem delete = new JMenuItem("Delete", KeyEvent.VK_D); + JMenuItem delete = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_EDIT_DELETE), KeyEvent.VK_D); delete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); - if (selectedBook != null) { - helpee.outOfUi(null, new Runnable() { - @Override - public void run() { - reader.delete(selectedBook.getMeta().getLuid()); - helpee.unsetSelectedBook(); - } - }); + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); + if (selectedBook != null + && selectedBook.getInfo().getMeta() != null) { + + final MetaData meta = selectedBook.getInfo().getMeta(); + int rep = JOptionPane.showConfirmDialog( + GuiReaderFrame.this, + GuiReader.trans(StringIdGui.SUBTITLE_DELETE, + meta.getLuid(), meta.getTitle()), + GuiReader.trans(StringIdGui.TITLE_DELETE), + JOptionPane.OK_CANCEL_OPTION); + + if (rep == JOptionPane.OK_OPTION) { + mainPanel.outOfUi(null, true, new Runnable() { + @Override + public void run() { + reader.delete(meta.getLuid()); + mainPanel.unsetSelectedBook(); + } + }); + } } } }); @@ -713,17 +841,20 @@ class GuiReaderFrame extends JFrame implements FrameHelper { * @return the item */ private JMenuItem createMenuItemProperties() { - JMenuItem delete = new JMenuItem("Properties", KeyEvent.VK_P); + JMenuItem delete = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_PROPERTIES), + KeyEvent.VK_P); delete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); if (selectedBook != null) { - helpee.outOfUi(null, new Runnable() { + mainPanel.outOfUi(null, false, new Runnable() { @Override public void run() { - new GuiReaderPropertiesFrame(reader, selectedBook - .getMeta()).setVisible(true); + new GuiReaderPropertiesFrame(reader.getLibrary(), + selectedBook.getInfo().getMeta()) + .setVisible(true); } }); } @@ -734,24 +865,25 @@ class GuiReaderFrame extends JFrame implements FrameHelper { } /** - * Create the open menu item for a book or a source/type (no LUID). + * Create the open menu item for a book, a source/type or an author. * * @return the item */ public JMenuItem createMenuItemOpenBook() { - JMenuItem open = new JMenuItem("Open", KeyEvent.VK_O); + JMenuItem open = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_FILE_OPEN), KeyEvent.VK_O); open.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); if (selectedBook != null) { - if (selectedBook.getMeta().getLuid() == null) { - helpee.removeBookPanes(); - helpee.addBookPane(selectedBook.getMeta().getSource(), - true); - helpee.refreshBooks(); + if (selectedBook.getInfo().getMeta() == null) { + mainPanel.removeBookPanes(); + mainPanel.addBookPane(selectedBook.getInfo() + .getMainInfo(), mainPanel.getCurrentType()); + mainPanel.refreshBooks(); } else { - helpee.openBook(selectedBook); + mainPanel.openBook(selectedBook); } } } @@ -766,19 +898,65 @@ class GuiReaderFrame extends JFrame implements FrameHelper { * * @return the item */ - private JMenuItem createMenuItemSetCover() { - JMenuItem open = new JMenuItem("Set as cover for source", KeyEvent.VK_C); + private JMenuItem createMenuItemSetCoverForSource() { + JMenuItem open = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_EDIT_SET_COVER_FOR_SOURCE), + KeyEvent.VK_C); open.addActionListener(new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); + public void actionPerformed(ActionEvent ae) { + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); if (selectedBook != null) { - reader.getLibrary().setSourceCover( - selectedBook.getMeta().getSource(), - selectedBook.getMeta().getLuid()); - MetaData source = selectedBook.getMeta().clone(); - source.setLuid(null); - GuiReaderCoverImager.clearIcon(source); + BasicLibrary lib = reader.getLibrary(); + String luid = selectedBook.getInfo().getMeta().getLuid(); + String source = selectedBook.getInfo().getMeta() + .getSource(); + + try { + lib.setSourceCover(source, luid); + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); + } + + GuiReaderBookInfo sourceInfo = GuiReaderBookInfo + .fromSource(lib, source); + GuiReaderCoverImager.clearIcon(sourceInfo); + } + } + }); + + return open; + } + + /** + * Create the SetCover menu item for a book to change the linked source + * cover. + * + * @return the item + */ + private JMenuItem createMenuItemSetCoverForAuthor() { + JMenuItem open = new JMenuItem( + GuiReader.trans(StringIdGui.MENU_EDIT_SET_COVER_FOR_AUTHOR), + KeyEvent.VK_A); + open.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent ae) { + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); + if (selectedBook != null) { + BasicLibrary lib = reader.getLibrary(); + String luid = selectedBook.getInfo().getMeta().getLuid(); + String author = selectedBook.getInfo().getMeta() + .getAuthor(); + + try { + lib.setAuthorCover(author, luid); + } catch (IOException e) { + error(e.getLocalizedMessage(), "IOException", e); + } + + GuiReaderBookInfo authorInfo = GuiReaderBookInfo + .fromAuthor(lib, author); + GuiReaderCoverImager.clearIcon(authorInfo); } } }); @@ -797,9 +975,9 @@ class GuiReaderFrame extends JFrame implements FrameHelper { * the exception to log if any */ public void error(final String message, final String title, Exception e) { - Instance.getTraceHandler().error(title + ": " + message); + Instance.getInstance().getTraceHandler().error(title + ": " + message); if (e != null) { - Instance.getTraceHandler().error(e); + Instance.getInstance().getTraceHandler().error(e); } SwingUtilities.invokeLater(new Runnable() { @@ -815,4 +993,23 @@ class GuiReaderFrame extends JFrame implements FrameHelper { public GuiReader getReader() { return reader; } + + /** + * Return the title of the application. + * + * @param libraryName + * the name of the associated {@link BasicLibrary}, which can be + * EMPTY + * + * @return the title + */ + static private String getAppTitle(String libraryName) { + if (!libraryName.isEmpty()) { + return GuiReader.trans(StringIdGui.TITLE_LIBRARY_WITH_NAME, Version + .getCurrentVersion().toString(), libraryName); + } + + return GuiReader.trans(StringIdGui.TITLE_LIBRARY, Version + .getCurrentVersion().toString()); + } }