import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.io.File;
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;
* 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;
mainPanel = new GuiReaderMainPanel(this, type);
setSize(800, 600);
setLayout(new BorderLayout());
- add(mainPanel);
+ add(mainPanel, BorderLayout.CENTER);
}
@Override
}
@Override
- public JPopupMenu createSourcePopup() {
+ public JPopupMenu createSourceAuthorPopup() {
JPopupMenu popup = new JPopupMenu();
popup.add(createMenuItemOpenBook());
return popup;
@Override
public void createMenu(boolean libOk) {
+ 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) {
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) {
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) {
file.add(createMenuItemRename(libOk));
file.add(createMenuItemSetAuthor(libOk));
file.addSeparator();
+ 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(createMenuItemClearCache());
edit.add(createMenuItemRedownload());
edit.addSeparator();
bar.add(edit);
- JMenu view = new JMenu("View");
+ 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
}
});
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
if (libOk) {
groupedSources = reader.getLibrary().getSourcesGrouped();
}
- 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);
if (libOk) {
goupedAuthors = reader.getLibrary().getAuthorsGrouped();
}
- 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());
private void populateMenuSA(JMenu menu,
Map<String, List<String>> 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<String> 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 {
// 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;
if (itemName.isEmpty()) {
- itemName = type ? " " : "[unknown]";
+ itemName = type ? " " : GuiReader
+ .trans(StringIdGui.MENU_AUTHORS_UNKNOWN);
}
String actualValue = value;
* @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);
@Override
public void actionPerformed(ActionEvent e) {
ConfigEditor<Config> ed = new ConfigEditor<Config>(
- Config.class, Instance.getConfig(),
- "This is where you configure the options of the program.");
+ Config.class, Instance.getConfig(), GuiReader
+ .trans(StringIdGui.SUBTITLE_CONFIG));
JFrame frame = new JFrame(title);
frame.add(ed);
frame.setSize(800, 600);
* @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);
@Override
public void actionPerformed(ActionEvent e) {
ConfigEditor<UiConfig> ed = new ConfigEditor<UiConfig>(
- UiConfig.class, Instance.getUiConfig(),
- "This is where you configure the graphical appearence of the program.");
+ UiConfig.class, Instance.getUiConfig(), GuiReader
+ .trans(StringIdGui.SUBTITLE_CONFIG_UI));
JFrame frame = new JFrame(title);
frame.add(ed);
frame.setSize(800, 600);
final JFileChooser fc = new JFileChooser();
fc.setAcceptAllFileFilterUsed(false);
- final Map<FileFilter, OutputType> filters = new HashMap<FileFilter, OutputType>();
+ // Add the "ALL" filters first, then the others
+ final Map<FileFilter, OutputType> otherFilters = new HashMap<FileFilter, OutputType>();
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<FileFilter, OutputType> entry : filters.entrySet()) {
- if (!(entry.getKey() instanceof FileNameExtensionFilter)) {
- fc.addChoosableFileFilter(entry.getKey());
- }
- }
- for (Entry<FileFilter, OutputType> entry : filters.entrySet()) {
- if (entry.getKey() instanceof FileNameExtensionFilter) {
- fc.addChoosableFileFilter(entry.getKey());
- }
+ for (Entry<FileFilter, OutputType> 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 = 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();
- mainPanel.outOfUi(pg, new Runnable() {
+ mainPanel.outOfUi(pg, false, new Runnable() {
@Override
public void run() {
try {
* @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 = mainPanel.getSelectedBook();
if (selectedBook != null) {
- mainPanel.outOfUi(null, new Runnable() {
+ mainPanel.outOfUi(null, false, new Runnable() {
@Override
public void run() {
reader.clearLocalReaderCache(selectedBook.getInfo()
* @return the item
*/
private JMenuItem createMenuItemMoveTo(boolean libOk) {
- JMenu changeTo = new JMenu("Move to");
+ JMenu changeTo = new JMenu(
+ GuiReader.trans(StringIdGui.MENU_FILE_MOVE_TO));
changeTo.setMnemonic(KeyEvent.VK_M);
Map<String, List<String>> groupedSources = new HashMap<String, List<String>>();
groupedSources = reader.getLibrary().getSourcesGrouped();
}
- JMenuItem item = new JMenuItem("New type...");
+ JMenuItem item = new JMenuItem(
+ GuiReader.trans(StringIdGui.MENU_FILE_MOVE_TO_NEW_TYPE));
item.addActionListener(createMoveAction(ChangeAction.SOURCE, null));
changeTo.add(item);
changeTo.addSeparator();
* @return the item
*/
private JMenuItem createMenuItemSetAuthor(boolean libOk) {
- JMenu changeTo = new JMenu("Set author");
+ 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(ChangeAction.AUTHOR, null));
JMenu group = new JMenu(key);
for (String value : groupedAuthors.get(key)) {
JMenuItem item = new JMenuItem(
- value.isEmpty() ? "[unknown]" : value);
+ value.isEmpty() ? GuiReader
+ .trans(StringIdGui.MENU_AUTHORS_UNKNOWN)
+ : value);
item.addActionListener(createMoveAction(
ChangeAction.AUTHOR, value));
group.add(item);
} else if (groupedAuthors.size() == 1) {
for (String value : groupedAuthors.values().iterator().next()) {
JMenuItem item = new JMenuItem(
- value.isEmpty() ? "[unknown]" : value);
+ value.isEmpty() ? GuiReader
+ .trans(StringIdGui.MENU_AUTHORS_UNKNOWN)
+ : value);
item.addActionListener(createMoveAction(
ChangeAction.AUTHOR, value));
changeTo.add(item);
*/
private JMenuItem createMenuItemRename(
@SuppressWarnings("unused") boolean libOk) {
- JMenuItem changeTo = new JMenuItem("Rename...");
+ JMenuItem changeTo = new JMenuItem(
+ GuiReader.trans(StringIdGui.MENU_FILE_RENAME));
changeTo.setMnemonic(KeyEvent.VK_R);
changeTo.addActionListener(createMoveAction(ChangeAction.TITLE, null));
return changeTo;
public void actionPerformed(ActionEvent e) {
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();
}
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;
}
final String fChangeTo = changeTo;
- mainPanel.outOfUi(null, new Runnable() {
+ mainPanel.outOfUi(null, refreshRequired, new Runnable() {
@Override
public void run() {
String luid = selectedBook.getInfo().getMeta()
reader.changeAuthor(luid, fChangeTo);
}
+ mainPanel.getSelectedBook().repaint();
mainPanel.unsetSelectedBook();
SwingUtilities.invokeLater(new Runnable() {
* @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 = mainPanel.getSelectedBook();
if (selectedBook != null) {
final MetaData meta = selectedBook.getInfo().getMeta();
- mainPanel.imprt(meta.getUrl(), new StoryRunnable() {
- @Override
- public void run(Story story) {
- reader.delete(meta.getLuid());
- mainPanel.unsetSelectedBook();
- MetaData newMeta = story.getMeta();
- if (!newMeta.getSource().equals(meta.getSource())) {
- reader.changeSource(newMeta.getLuid(),
- meta.getSource());
- }
- }
- }, "Removing old copy");
+ mainPanel.imprt(
+ meta.getUrl(),
+ new StoryRunnable() {
+ @Override
+ public void run(Story story) {
+ MetaData newMeta = story.getMeta();
+ if (!newMeta.getSource().equals(
+ meta.getSource())) {
+ reader.changeSource(newMeta.getLuid(),
+ meta.getSource());
+ }
+ }
+ },
+ GuiReader
+ .trans(StringIdGui.PROGRESS_CHANGE_SOURCE));
}
}
});
* @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 = mainPanel.getSelectedBook();
- if (selectedBook != null) {
- mainPanel.outOfUi(null, new Runnable() {
- @Override
- public void run() {
- reader.delete(selectedBook.getInfo().getMeta()
- .getLuid());
- mainPanel.unsetSelectedBook();
- }
- });
+ 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();
+ }
+ });
+ }
}
}
});
* @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 = mainPanel.getSelectedBook();
if (selectedBook != null) {
- mainPanel.outOfUi(null, new Runnable() {
+ mainPanel.outOfUi(null, false, new Runnable() {
@Override
public void run() {
- new GuiReaderPropertiesFrame(reader, selectedBook
- .getInfo()).setVisible(true);
+ new GuiReaderPropertiesFrame(reader.getLibrary(),
+ selectedBook.getInfo().getMeta())
+ .setVisible(true);
}
});
}
}
/**
- * 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 = mainPanel.getSelectedBook();
if (selectedBook != null) {
- if (selectedBook.getInfo().getMeta().getLuid() == null) {
+ if (selectedBook.getInfo().getMeta() == null) {
mainPanel.removeBookPanes();
- mainPanel.addBookPane(selectedBook.getInfo().getMeta()
- .getSource(), true);
+ mainPanel.addBookPane(selectedBook.getInfo()
+ .getMainInfo(), mainPanel.getCurrentType());
mainPanel.refreshBooks();
} else {
mainPanel.openBook(selectedBook);
* @return the item
*/
private JMenuItem createMenuItemSetCoverForSource() {
- JMenuItem open = new JMenuItem("Set as cover for source", KeyEvent.VK_C);
+ 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) {
* @return the item
*/
private JMenuItem createMenuItemSetCoverForAuthor() {
- JMenuItem open = new JMenuItem("Set as cover for author", KeyEvent.VK_A);
+ 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 e) {
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());
+ }
}