X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2Fui%2FGuiReaderFrame.java;h=820075426d812286bb0e9966b7ab7929641cc5dd;hb=c349fd480d7ab36ad423e965434a6f1f418d60a5;hp=f7fb09f205c3546402b6acad8a719125a9c66e15;hpb=14bb95fae33d405c0a43682c144d081bfbcad545;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java b/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java index f7fb09f..8200754 100644 --- a/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java +++ b/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java @@ -29,6 +29,7 @@ import be.nikiroo.fanfix.bundles.Config; 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.LocalLibrary; import be.nikiroo.fanfix.output.BasicOutput.OutputType; import be.nikiroo.fanfix.reader.BasicReader; @@ -49,10 +50,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 } /** @@ -69,16 +80,11 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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 @@ -88,7 +94,8 @@ class GuiReaderFrame extends JFrame implements FrameHelper { popup.addSeparator(); popup.add(createMenuItemExport()); popup.add(createMenuItemMoveTo(true)); - popup.add(createMenuItemSetCover()); + popup.add(createMenuItemSetCoverForSource()); + popup.add(createMenuItemSetCoverForAuthor()); popup.add(createMenuItemClearCache()); popup.add(createMenuItemRedownload()); popup.addSeparator(); @@ -102,7 +109,7 @@ class GuiReaderFrame extends JFrame implements FrameHelper { } @Override - public JPopupMenu createSourcePopup() { + public JPopupMenu createSourceAuthorPopup() { JPopupMenu popup = new JPopupMenu(); popup.add(createMenuItemOpenBook()); return popup; @@ -110,6 +117,8 @@ class GuiReaderFrame extends JFrame implements FrameHelper { @Override public void createMenu(boolean libOk) { + invalidate(); + JMenuBar bar = new JMenuBar(); JMenu file = new JMenu("File"); @@ -119,14 +128,14 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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); imprtF.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.imprt(false); + mainPanel.imprt(false); } }); JMenuItem exit = new JMenuItem("Exit", KeyEvent.VK_X); @@ -169,8 +178,8 @@ class GuiReaderFrame extends JFrame implements FrameHelper { vauthors.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.setWords(false); - helpee.refreshBooks(); + mainPanel.setWords(false); + mainPanel.refreshBooks(); } }); view.add(vauthors); @@ -179,8 +188,8 @@ class GuiReaderFrame extends JFrame implements FrameHelper { vwords.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.setWords(true); - helpee.refreshBooks(); + mainPanel.setWords(true); + mainPanel.refreshBooks(); } }); view.add(vwords); @@ -244,9 +253,12 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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 ? " " : "[unknown]"; + } + String actualValue = value; if (type) { if (!sub.isEmpty()) { actualValue += "/" + sub; @@ -280,9 +292,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(); } }; } @@ -292,9 +304,9 @@ class GuiReaderFrame extends JFrame implements FrameHelper { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - helpee.removeBookPanes(); - helpee.addBookPane(type, listMode); - helpee.refreshBooks(); + mainPanel.removeBookPanes(); + mainPanel.addBookPane(type, listMode); + mainPanel.refreshBooks(); } }; } @@ -389,7 +401,7 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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"); if (fc.getSelectedFile() != null) { @@ -398,13 +410,13 @@ class GuiReaderFrame extends JFrame implements FrameHelper { .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); } @@ -451,16 +463,16 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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() { @@ -494,7 +506,7 @@ class GuiReaderFrame extends JFrame implements FrameHelper { } JMenuItem item = new JMenuItem("New type..."); - item.addActionListener(createMoveAction(MoveAction.SOURCE, null)); + item.addActionListener(createMoveAction(ChangeAction.SOURCE, null)); changeTo.add(item); changeTo.addSeparator(); @@ -502,7 +514,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 +528,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); @@ -542,7 +555,7 @@ class GuiReaderFrame extends JFrame implements FrameHelper { JMenuItem newItem = new JMenuItem("New author..."); changeTo.add(newItem); changeTo.addSeparator(); - newItem.addActionListener(createMoveAction(MoveAction.AUTHOR, null)); + newItem.addActionListener(createMoveAction(ChangeAction.AUTHOR, null)); // Existing authors if (libOk) { @@ -553,18 +566,20 @@ class GuiReaderFrame extends JFrame implements FrameHelper { for (String key : groupedAuthors.keySet()) { JMenu group = new JMenu(key); for (String value : groupedAuthors.get(key)) { - JMenuItem item = new JMenuItem(value); + JMenuItem item = new JMenuItem( + value.isEmpty() ? "[unknown]" : value); item.addActionListener(createMoveAction( - MoveAction.AUTHOR, value)); + 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); - item.addActionListener(createMoveAction(MoveAction.AUTHOR, - value)); + JMenuItem item = new JMenuItem( + value.isEmpty() ? "[unknown]" : value); + item.addActionListener(createMoveAction( + ChangeAction.AUTHOR, value)); changeTo.add(item); } } @@ -585,26 +600,37 @@ class GuiReaderFrame extends JFrame implements FrameHelper { @SuppressWarnings("unused") boolean libOk) { JMenuItem changeTo = new JMenuItem("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( @@ -620,21 +646,21 @@ 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 @@ -650,7 +676,7 @@ 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 */ @@ -659,14 +685,14 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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 StoryRunnable() { @Override public void run(Story story) { reader.delete(meta.getLuid()); - helpee.unsetSelectedBook(); + mainPanel.unsetSelectedBook(); MetaData newMeta = story.getMeta(); if (!newMeta.getSource().equals(meta.getSource())) { reader.changeSource(newMeta.getLuid(), @@ -691,15 +717,26 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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, + String.format("Delete %s: %s", meta.getLuid(), + meta.getTitle()), "Delete story", + 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(); + } + }); + } } } }); @@ -717,13 +754,14 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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,7 +772,7 @@ 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 */ @@ -743,15 +781,15 @@ class GuiReaderFrame extends JFrame implements FrameHelper { 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 +804,53 @@ class GuiReaderFrame extends JFrame implements FrameHelper { * * @return the item */ - private JMenuItem createMenuItemSetCover() { + private JMenuItem createMenuItemSetCoverForSource() { JMenuItem open = new JMenuItem("Set as cover for source", KeyEvent.VK_C); open.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final GuiReaderBook selectedBook = helpee.getSelectedBook(); + 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(); + + lib.setSourceCover(source, luid); + + 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("Set as cover for author", KeyEvent.VK_A); + open.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final GuiReaderBook selectedBook = mainPanel.getSelectedBook(); + if (selectedBook != null) { + BasicLibrary lib = reader.getLibrary(); + String luid = selectedBook.getInfo().getMeta().getLuid(); + String author = selectedBook.getInfo().getMeta() + .getAuthor(); + + lib.setAuthorCover(author, luid); + + GuiReaderBookInfo authorInfo = GuiReaderBookInfo + .fromAuthor(lib, author); + GuiReaderCoverImager.clearIcon(authorInfo); } } });