import java.awt.BorderLayout;
import java.awt.Color;
+import java.awt.Font;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
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;
import java.util.Map.Entry;
+import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
+import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
popup.add(createMenuItemRedownload());
popup.addSeparator();
popup.add(createMenuItemDelete());
+ popup.addSeparator();
+ popup.add(createMenuItemProperties());
popup.show(e.getComponent(), e.getX(), e.getY());
}
JMenu authors = new JMenu("Authors");
authors.setMnemonic(KeyEvent.VK_A);
- List<String> aa = new ArrayList<String>();
- if (libOk) {
- aa.addAll(reader.getLibrary().getAuthors());
- }
- aa.add(0, null);
- for (final String author : aa) {
- JMenuItem item = new JMenuItem(author == null ? "All"
- : author.isEmpty() ? "[unknown]" : author);
- item.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- removeBookPanes();
- addBookPane(author, false);
- refreshBooks();
- }
- });
- authors.add(item);
+ List<Entry<String, List<String>>> authorGroups = reader.getLibrary()
+ .getAuthorsGrouped();
+ if (authorGroups.size() > 1) {
+ // Multiple groups
- if (author == null || author.isEmpty()) {
- authors.addSeparator();
+ // null -> "All" authors special item
+ populateMenuAuthorList(authors, Arrays.asList((String) null));
+
+ for (Entry<String, List<String>> 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<String> authorNames = new ArrayList<String>();
+ authorNames.add(null);
+ if (authorGroups.size() > 0) {
+ authorNames.addAll(authorGroups.get(0).getValue());
}
+ populateMenuAuthorList(authors, authorNames);
}
bar.add(authors);
return bar;
}
+ /**
+ * Populate a list of authors as {@link JMenuItem}s into the given
+ * {@link JMenu}.
+ * <p>
+ * 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<String> 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();
+ }
+ }
+ }
+
/**
* Create the Fanfix Configuration menu item.
*
reader.clearLocalReaderCache(selectedBook.getMeta()
.getLuid());
selectedBook.setCached(false);
- GuiReaderBook.clearIcon(selectedBook.getMeta());
+ GuiReaderCoverImager.clearIcon(selectedBook
+ .getMeta());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
return delete;
}
+ /**
+ * Create the properties menu item.
+ *
+ * @return the item
+ */
+ private JMenuItem createMenuItemProperties() {
+ JMenuItem delete = new JMenuItem("Properties", KeyEvent.VK_P);
+ delete.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (selectedBook != null) {
+ outOfUi(null, new Runnable() {
+ @Override
+ public void run() {
+ final MetaData meta = selectedBook.getMeta();
+ new JFrame() {
+ private static final long serialVersionUID = 1L;
+ @SuppressWarnings("unused")
+ private Object init = init();
+
+ private Object init() {
+ // Borders
+ int top = 20;
+ int space = 10;
+
+ // Image
+ ImageIcon img = GuiReaderCoverImager
+ .generateCoverIcon(
+ reader.getLibrary(), meta);
+
+ // frame
+ setTitle(meta.getLuid() + ": "
+ + meta.getTitle());
+
+ setSize(800, img.getIconHeight() + 2 * top);
+ setLayout(new BorderLayout());
+
+ // Main panel
+ JPanel mainPanel = new JPanel(
+ new BorderLayout());
+ JPanel mainPanelKeys = new JPanel();
+ mainPanelKeys.setLayout(new BoxLayout(
+ mainPanelKeys, BoxLayout.Y_AXIS));
+ JPanel mainPanelValues = new JPanel();
+ mainPanelValues.setLayout(new BoxLayout(
+ mainPanelValues, BoxLayout.Y_AXIS));
+
+ mainPanel.add(mainPanelKeys,
+ BorderLayout.WEST);
+ mainPanel.add(mainPanelValues,
+ BorderLayout.CENTER);
+
+ List<Entry<String, String>> infos = BasicReader
+ .getMetaDesc(meta);
+
+ Color trans = new Color(0, 0, 0, 1);
+ for (Entry<String, String> info : infos) {
+ JTextArea key = new JTextArea(info
+ .getKey());
+ key.setFont(new Font(key.getFont()
+ .getFontName(), Font.BOLD, key
+ .getFont().getSize()));
+ key.setEditable(false);
+ key.setLineWrap(false);
+ key.setBackground(trans);
+ mainPanelKeys.add(key);
+
+ JTextArea value = new JTextArea(info
+ .getValue());
+ value.setEditable(false);
+ value.setLineWrap(false);
+ value.setBackground(trans);
+ mainPanelValues.add(value);
+ }
+
+ // Image
+ JLabel imgLabel = new JLabel(img);
+ imgLabel.setVerticalAlignment(JLabel.TOP);
+
+ // Borders
+ mainPanelKeys.setBorder(BorderFactory
+ .createEmptyBorder(top, space, 0, 0));
+ mainPanelValues.setBorder(BorderFactory
+ .createEmptyBorder(top, space, 0, 0));
+ imgLabel.setBorder(BorderFactory
+ .createEmptyBorder(0, space, 0, 0));
+
+ // Add all
+ add(imgLabel, BorderLayout.WEST);
+ add(mainPanel, BorderLayout.CENTER);
+
+ return null;
+ }
+
+ }.setVisible(true);
+ }
+ });
+ }
+ }
+ });
+
+ return delete;
+ }
+
/**
* Create the open menu item for a book or a source (no LUID).
*
selectedBook.getMeta().getLuid());
MetaData source = selectedBook.getMeta().clone();
source.setLuid(null);
- GuiReaderBook.clearIcon(source);
+ GuiReaderCoverImager.clearIcon(source);
}
}
});