X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Freader%2Fui%2FGuiReaderFrame.java;h=d28f941e933e9d2c53e2cbd3f5db4491cad82ec6;hp=b1ba90c9acde6cca6d23ad060eaf9526bac0a479;hb=97b36d32a43b7fbbd4938c95c4b40db0c68daa71;hpb=8d34f396c1ceec46688b7d440fa4f177cedba56f diff --git a/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java b/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java index b1ba90c..d28f941 100644 --- a/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java +++ b/src/be/nikiroo/fanfix/reader/ui/GuiReaderFrame.java @@ -16,7 +16,6 @@ import java.io.IOException; import java.net.URL; import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -169,7 +168,11 @@ class GuiReaderFrame extends JFrame { lib.refresh(pg); invalidate(); setJMenuBar(createMenu(true)); - addBookPane(typeF, true); + if (typeF == null) { + addBookPane(true, false); + } else { + addBookPane(typeF, true); + } refreshBooks(); validate(); pane.setVisible(true); @@ -205,20 +208,21 @@ class GuiReaderFrame extends JFrame { setVisible(true); } - private void addSourcePanes() { + private void addListPane(String name, List values, + final boolean type) { // Sources -> i18n - GuiReaderGroup bookPane = new GuiReaderGroup(reader, "Sources", color); + GuiReaderGroup bookPane = new GuiReaderGroup(reader, name, color); - List sources = new ArrayList(); - for (String source : reader.getLibrary().getSources()) { + List metas = new ArrayList(); + for (String source : values) { MetaData mSource = new MetaData(); mSource.setLuid(null); mSource.setTitle(source); mSource.setSource(source); - sources.add(mSource); + metas.add(mSource); } - bookPane.refreshBooks(sources, false); + bookPane.refreshBooks(metas, false); this.invalidate(); pane.invalidate(); @@ -242,35 +246,43 @@ class GuiReaderFrame extends JFrame { @Override public void action(final GuiReaderBook book) { removeBookPanes(); - addBookPane(book.getMeta().getSource(), true); + addBookPane(book.getMeta().getSource(), type); refreshBooks(); } }); } /** - * Add a new {@link GuiReaderGroup} on the frame to display the books of the - * selected type or author. + * Add a new {@link GuiReaderGroup} on the frame to display all the + * sources/types or all the authors, or a listing of all the books sorted + * either by source or author. + *

+ * A display of all the sources/types or all the authors will show one icon + * per source/type or author. + *

+ * A listing of all the books sorted by source/type or author will display + * all the books. * - * @param value - * the author or the type, or NULL to get all the - * authors-or-types * @param type - * TRUE for type, FALSE for author + * TRUE for type/source, FALSE for author + * @param listMode + * TRUE to get a listing of all the sources or authors, FALSE to + * get one icon per source or author */ - private void addBookPane(String value, boolean type) { - if (value == null) { - if (type) { - if (Instance.getUiConfig().getBoolean(UiConfig.SOURCE_PAGE, - false)) { - addSourcePanes(); - } else { - for (String tt : reader.getLibrary().getSources()) { - if (tt != null) { - addBookPane(tt, type); - } + private void addBookPane(boolean type, boolean listMode) { + if (type) { + if (!listMode) { + addListPane("Sources", reader.getLibrary().getSources(), type); + } else { + for (String tt : reader.getLibrary().getSources()) { + if (tt != null) { + addBookPane(tt, type); } } + } + } else { + if (!listMode) { + addListPane("Authors", reader.getLibrary().getAuthors(), type); } else { for (String tt : reader.getLibrary().getAuthors()) { if (tt != null) { @@ -278,10 +290,21 @@ class GuiReaderFrame extends JFrame { } } } - - return; } + } + /** + * Add a new {@link GuiReaderGroup} on the frame to display the books of the + * selected type or author. + * + * @param value + * the author or the type, or NULL to get all the + * authors-or-types + * @param type + * TRUE for type/source, FALSE for author + * + */ + private void addBookPane(String value, boolean type) { GuiReaderGroup bookPane = new GuiReaderGroup(reader, value, color); if (type) { booksByType.put(bookPane, value); @@ -328,6 +351,10 @@ class GuiReaderFrame extends JFrame { }); } + /** + * Clear the pane from any book that may be present, usually prior to adding + * new ones. + */ private void removeBookPanes() { booksByType.clear(); booksByAuthor.clear(); @@ -443,82 +470,85 @@ class GuiReaderFrame extends JFrame { view.add(vwords); bar.add(view); + Map> groupedSources = new HashMap>(); + if (libOk) { + groupedSources = reader.getLibrary().getSourcesGrouped(); + } JMenu sources = new JMenu("Sources"); sources.setMnemonic(KeyEvent.VK_S); + populateMenuSA(sources, groupedSources, true); + bar.add(sources); - Map> groupedSources = new HashMap>(); + Map> goupedAuthors = new HashMap>(); if (libOk) { - groupedSources = reader.getLibrary().getSourcesGrouped(); + goupedAuthors = reader.getLibrary().getAuthorsGrouped(); } + JMenu authors = new JMenu("Authors"); + authors.setMnemonic(KeyEvent.VK_A); + populateMenuSA(authors, goupedAuthors, false); + bar.add(authors); - JMenuItem item = new JMenuItem("All"); - item.addActionListener(getActionOpenSource(null)); - sources.add(item); - sources.addSeparator(); + JMenu options = new JMenu("Options"); + options.setMnemonic(KeyEvent.VK_O); + options.add(createMenuItemConfig()); + options.add(createMenuItemUiConfig()); + bar.add(options); - for (final String type : groupedSources.keySet()) { - List list = groupedSources.get(type); - if (list.size() == 1 && list.get(0).isEmpty()) { - item = new JMenuItem(type); - item.addActionListener(getActionOpenSource(type)); - sources.add(item); + return bar; + } + + // "" = [unknown] + private void populateMenuSA(JMenu menu, + Map> groupedValues, boolean type) { + + // "All" and "Listing" special items + JMenuItem item = new JMenuItem("All"); + item.addActionListener(getActionOpenList(type, false)); + menu.add(item); + item = new JMenuItem("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.addActionListener(getActionOpen(value, type)); + menu.add(item); } else { - JMenu dir = new JMenu(type); + JMenu dir; + if (!type && groupedValues.size() == 1) { + // only one group of authors + dir = menu; + } else { + dir = new JMenu(value.isEmpty() ? "[unknown]" : value); + } + for (String sub : list) { // " " instead of "" for the visual height String itemName = sub.isEmpty() ? " " : sub; - String actualType = type; - if (!sub.isEmpty()) { - actualType += "/" + sub; + String actualValue = value; + + if (type) { + if (!sub.isEmpty()) { + actualValue += "/" + sub; + } + } else { + actualValue = sub; } item = new JMenuItem(itemName); - item.addActionListener(getActionOpenSource(actualType)); + item.addActionListener(getActionOpen(actualValue, type)); dir.add(item); } - sources.add(dir); - } - } - - bar.add(sources); - - JMenu authors = new JMenu("Authors"); - authors.setMnemonic(KeyEvent.VK_A); - - List>> authorGroups = reader.getLibrary() - .getAuthorsGrouped(); - if (authorGroups.size() > 1) { - // Multiple groups - - // null -> "All" authors special item - populateMenuAuthorList(authors, Arrays.asList((String) null)); - - for (Entry> group : authorGroups) { - JMenu thisGroup = new JMenu(group.getKey()); - populateMenuAuthorList(thisGroup, group.getValue()); - authors.add(thisGroup); - } - } else { - // Only one group - // null -> "All" authors special item - List authorNames = new ArrayList(); - authorNames.add(null); - if (authorGroups.size() > 0) { - authorNames.addAll(authorGroups.get(0).getValue()); + if (menu != dir) { + menu.add(dir); + } } - populateMenuAuthorList(authors, authorNames); } - - bar.add(authors); - - JMenu options = new JMenu("Options"); - options.setMnemonic(KeyEvent.VK_O); - options.add(createMenuItemConfig()); - options.add(createMenuItemUiConfig()); - bar.add(options); - - return bar; } /** @@ -526,50 +556,31 @@ class GuiReaderFrame extends JFrame { * the selected/displayed one. * * @param type - * the type (source) to select + * the type (source) to select, cannot be NULL * * @return the {@link ActionListener} */ - private ActionListener getActionOpenSource(final String type) { + private ActionListener getActionOpen(final String source, final boolean type) { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { removeBookPanes(); - addBookPane(type, true); + addBookPane(source, type); refreshBooks(); } }; } - /** - * Populate a list of authors as {@link JMenuItem}s into the given - * {@link JMenu}. - *

- * Each item will select the author when clicked. - * - * @param authors - * the parent {@link JMenuItem} - * @param names - * the authors' names - */ - private void populateMenuAuthorList(JMenu authors, List names) { - for (final String name : names) { - JMenuItem item = new JMenuItem(name == null ? "All" - : name.isEmpty() ? "[unknown]" : name); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - removeBookPanes(); - addBookPane(name, false); - refreshBooks(); - } - }); - authors.add(item); - - if (name == null || name.isEmpty()) { - authors.addSeparator(); + private ActionListener getActionOpenList(final boolean type, + final boolean listMode) { + return new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + removeBookPanes(); + addBookPane(type, listMode); + refreshBooks(); } - } + }; } /** @@ -817,21 +828,21 @@ class GuiReaderFrame extends JFrame { // Existing authors if (libOk) { - List>> authorGroups = reader - .getLibrary().getAuthorsGrouped(); + Map> groupedAuthors = reader.getLibrary() + .getAuthorsGrouped(); - if (authorGroups.size() > 1) { - for (Entry> entry : authorGroups) { - JMenu group = new JMenu(entry.getKey()); - for (String value : entry.getValue()) { + 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("AUTHOR", value)); group.add(item); } changeTo.add(group); } - } else if (authorGroups.size() == 1) { - for (String value : authorGroups.get(0).getValue()) { + } else if (groupedAuthors.size() == 1) { + for (String value : groupedAuthors.values().iterator().next()) { JMenuItem item = new JMenuItem(value); item.addActionListener(createMoveAction("AUTHOR", value)); changeTo.add(item);