gui: do not always refresh the books after an action
[fanfix.git] / src / be / nikiroo / fanfix / reader / ui / GuiReaderFrame.java
index f7fb09f205c3546402b6acad8a719125a9c66e15..97541026188404fd27420d5184f38c41a02e2f54 100644 (file)
@@ -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<String> 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,27 @@ 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) {
                                        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 +636,20 @@ class GuiReaderFrame extends JFrame implements FrameHelper {
                                        }
 
                                        final String fChangeTo = changeTo;
-                                       helpee.outOfUi(null, new Runnable() {
+                                       mainPanel.outOfUi(null, true, 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.unsetSelectedBook();
 
                                                        SwingUtilities.invokeLater(new Runnable() {
                                                                @Override
@@ -650,7 +665,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 +674,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,13 +706,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, true, new Runnable() {
                                                @Override
                                                public void run() {
-                                                       reader.delete(selectedBook.getMeta().getLuid());
-                                                       helpee.unsetSelectedBook();
+                                                       reader.delete(selectedBook.getInfo().getMeta()
+                                                                       .getLuid());
+                                                       mainPanel.unsetSelectedBook();
                                                }
                                        });
                                }
@@ -717,13 +733,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 +751,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 +760,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 +783,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);
                                }
                        }
                });