package moviescraper.doctord.view;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.function.Consumer;
import java.util.function.Supplier;
import javax.swing.Icon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import moviescraper.doctord.controller.BrowseDirectoryAction;
import moviescraper.doctord.controller.BrowseUriAction;
import moviescraper.doctord.controller.ChooseExternalMediaPlayerAction;
import moviescraper.doctord.controller.ChooseFavoriteGenresAction;
import moviescraper.doctord.controller.ChooseFavoriteTagsAction;
import moviescraper.doctord.controller.FileNameCleanupAction;
import moviescraper.doctord.controller.MoveToNewFolderAction;
import moviescraper.doctord.controller.OpenFileAction;
import moviescraper.doctord.controller.PlayMovieAction;
import moviescraper.doctord.controller.RefreshDirectoryAction;
import moviescraper.doctord.controller.SelectAmalgamationSettingsAction;
import moviescraper.doctord.controller.WriteFileDataAction;
import moviescraper.doctord.controller.amalgamation.ScrapeAmalgamatedAction;
import moviescraper.doctord.controller.siteparsingprofile.SiteParsingProfileItem;
import moviescraper.doctord.controller.siteparsingprofile.SpecificProfileFactory;
import moviescraper.doctord.controller.siteparsingprofile.SiteParsingProfile.ScraperGroupName;
import moviescraper.doctord.model.Movie;
import moviescraper.doctord.model.preferences.MoviescraperPreferences;
public class GUIMainMenuBar extends JMenuBar{
/**
*
*/
private static final long serialVersionUID = 1L;
private MoviescraperPreferences preferences;
private GUIMain guiMain;
private JMenuItem writeFileMenuItem;
public GUIMainMenuBar(GUIMain guiMain)
{
this.preferences = guiMain.getPreferences();
this.guiMain = guiMain;
initializeMenus();
}
/**
* Allows you to create a new JCheckBoxMenuItem using Lambda expressions. The preferenceSetterFunction function will be called to change the value when the
* menu item is checked and the initial value will be determined by the value returned by preferenceGetterFunction.
* @param checkboxTitle - Text of menu item to create
* @param preferenceSetterFunction - setter function called when checkbox item clicked
* @param preferenceGetterFunction - function to return initial value of the checkbox
* @return
*/
private JCheckBoxMenuItem createCheckBoxMenuItem(String checkboxTitle, Consumer<Boolean> preferenceSetterFunction,
Supplier<Boolean> preferenceGetterFunction)
{
JCheckBoxMenuItem checkBoxMenuItemToCreate = new JCheckBoxMenuItem(checkboxTitle);
checkBoxMenuItemToCreate.setState(preferenceGetterFunction.get());
checkBoxMenuItemToCreate.addItemListener(e -> {
if(e.getStateChange() == ItemEvent.SELECTED) {
preferenceSetterFunction.accept(true);
}
else if(e.getStateChange() == ItemEvent.DESELECTED) {
preferenceSetterFunction.accept(false);
}
});
return checkBoxMenuItemToCreate;
}
private void initializePreferencesMenu(){
//Set up the preferences menu
JMenu preferenceMenu = new JMenu("Preferences");
preferenceMenu.setMnemonic(KeyEvent.VK_P);
preferenceMenu.getAccessibleContext().setAccessibleDescription(
"Preferences for JAVMovieScraper");
createAllCheckBoxMenusForPreferencesMenu(preferenceMenu);
add(preferenceMenu);
}
private void createAllCheckBoxMenusForPreferencesMenu(JMenu preferenceMenu) {
if(preferenceMenu != null) {
preferenceMenu.add(createFileCreationMenu());
preferenceMenu.add(createTranslationMenu());
preferenceMenu.add(createScrapingSearchOptionsMenu());
preferenceMenu.add(createScrapingDialogsToShowMenu());
preferenceMenu.add(createModifiyScrapedResultsByMenu());
preferenceMenu.add(createRenamingMenu());
preferenceMenu.add(createCleanUpFileNameMenu());
}
}
private JMenu createCleanUpFileNameMenu() {
JMenu submenu = new JMenu("Clean Up File Name");
//Checkbox for whether the user needs to manually confirm the results of each clean up file operation
JCheckBoxMenuItem confirmNameForFileNameCleanup = createCheckBoxMenuItem(
"Confirm New Name Each Time for \"Clean Up File Name\"",
b -> getPreferences().setConfirmCleanUpFileNameNameBeforeRenaming(b),
() -> getPreferences().getConfirmCleanUpFileNameNameBeforeRenaming());
submenu.add(confirmNameForFileNameCleanup);
return submenu;
}
private JMenu createRenamingMenu() {
JMenu submenu = new JMenu("Renaming");
//Checkbox for renaming Movie file
JCheckBoxMenuItem renameMovieFile = createCheckBoxMenuItem(
"Enable Renaming When Writing File Data",
b -> getPreferences().setRenameMovieFile(b),
() -> getPreferences().getRenameMovieFile());
submenu.add(renameMovieFile);
return submenu;
}
private JMenu createModifiyScrapedResultsByMenu() {
JMenu submenu = new JMenu("Modify Scraped Results By");
//Checkbox for option to append the ID to start of the title field
JCheckBoxMenuItem appendIDToStartOfTitle = createCheckBoxMenuItem(
"Appending ID to Start of Title Field When Scraping",
b -> getPreferences().setAppendIDToStartOfTitle(b),
() -> getPreferences().getAppendIDToStartOfTitle());
submenu.add(appendIDToStartOfTitle);
//Checkbox for option to use file name as the scraped title every time
JCheckBoxMenuItem useFilenameAsScrapedMovieTitle = createCheckBoxMenuItem(
"Title Field is Always Set as Filename",
b -> getPreferences().setUseFileNameAsTitle(b),
() -> getPreferences().getUseFileNameAsTitle());
submenu.add(useFilenameAsScrapedMovieTitle);
return submenu;
}
private JMenu createScrapingDialogsToShowMenu() {
JMenu submenu = new JMenu("Scraping Dialogs to Show");
//Checkbox for scraping dialog box allowing the user to override the URL used when scraping
JCheckBoxMenuItem promptForUserProvidedURL = createCheckBoxMenuItem(
"Provide URL Manually",
b -> getPreferences().setPromptForUserProvidedURLWhenScraping(b),
() -> getPreferences().getPromptForUserProvidedURLWhenScraping());
submenu.add(promptForUserProvidedURL);
//Checkbox for scraping dialog box allowing the user to override the URL used when scraping
JCheckBoxMenuItem considerUserSelectionOneURL = createCheckBoxMenuItem(
"Consider All Selections one Item",
b -> getPreferences().setConsiderUserSelectionOneURLWhenScraping(b),
() -> getPreferences().getConsiderUserSelectionOneURLWhenScraping());
submenu.add(considerUserSelectionOneURL);
//Checkbox for whether the user needs to manually select the art while scraping
JCheckBoxMenuItem selectArtManuallyWhenScraping = createCheckBoxMenuItem(
"Select Art Manually",
b -> getPreferences().setSelectArtManuallyWhenScraping(b),
() -> getPreferences().getSelectArtManuallyWhenScraping());
submenu.add(selectArtManuallyWhenScraping);
//Checkbox for whether the user needs to manually select the search result when scraping
JCheckBoxMenuItem selectSearchResultManuallyWhenScraping = createCheckBoxMenuItem(
"Select Search Results Manually",
b -> getPreferences().setSelectSearchResultManuallyWhenScraping(b),
() -> getPreferences().getSelectSearchResultManuallyWhenScraping());
submenu.add(selectSearchResultManuallyWhenScraping);
return submenu;
}
private JMenu createScrapingSearchOptionsMenu() {
JMenu submenu = new JMenu("Scraping Search Options");
//Checkbox for option if the ID is just considered the first word in the file
JCheckBoxMenuItem isFirstWordOfFileID = createCheckBoxMenuItem(
"Use First Word of File for ID Instead of Last",
b -> getPreferences().setIsFirstWordOfFileID(b),
() -> getPreferences().getIsFirstWordOfFileID());
submenu.add(isFirstWordOfFileID);
return submenu;
}
private JMenu createTranslationMenu() {
JMenu submenu = new JMenu("Translation");
//Checkbox for scraping JAV files in japanese instead of english when clicking scrape jav
JCheckBoxMenuItem scrapeInJapanese = createCheckBoxMenuItem(
"Scrape JAV Movies in Japanese Instead of English",
b -> getPreferences().setScrapeInJapanese(b),
() -> getPreferences().getScrapeInJapanese());
submenu.add(scrapeInJapanese);
return submenu;
}
private JMenu createFileCreationMenu() {
JMenu submenu = new JMenu("File Creation");
//Checkbox for writing fanart and poster
JCheckBoxMenuItem writeFanartAndPosters = createCheckBoxMenuItem(
"Write Fanart and Poster Images",
b -> getPreferences().setWriteFanartAndPostersPreference(b),
() -> getPreferences().getWriteFanartAndPostersPreference());
submenu.add(writeFanartAndPosters);
//Checkbox for overwriting writing actors to .actor folder
JCheckBoxMenuItem writeActorImages = createCheckBoxMenuItem(
"Write Actor Images",
b -> getPreferences().setDownloadActorImagesToActorFolderPreference(b),
() -> getPreferences().getDownloadActorImagesToActorFolderPreference());
submenu.add(writeActorImages);
//Checkbox for scraping extrafanart
JCheckBoxMenuItem scrapeExtraFanart = createCheckBoxMenuItem(
"Write Extrafanart When Writing Data to a Directory or Moving File to a Directory",
b -> getPreferences().setExtraFanartScrapingEnabledPreference(b),
() -> getPreferences().getExtraFanartScrapingEnabledPreference());
submenu.add(scrapeExtraFanart);
//Checkbox for also creating folder.jpg in addition to the poster file jpg
JCheckBoxMenuItem createFolderJpg = createCheckBoxMenuItem(
"Create folder.jpg for Each Folder",
b -> getPreferences().setCreateFolderJpgEnabledPreference(b),
() -> getPreferences().getCreateFolderJpgEnabledPreference());
submenu.add(createFolderJpg);
//Checkbox for writing the trailer to file
JCheckBoxMenuItem writeTrailerToFile = createCheckBoxMenuItem(
"Download and Write Trailer To File (Warning: Slow)",
b -> getPreferences().setWriteTrailerToFile(b),
() -> getPreferences().getWriteTrailerToFile());
submenu.add(writeTrailerToFile);
//Checkbox for overwriting fanart and poster
JCheckBoxMenuItem overwriteFanartAndPosters = createCheckBoxMenuItem(
"Overwrite Fanart, Poster, and folder.jpg Files",
b -> getPreferences().setOverWriteFanartAndPostersPreference(b),
() -> getPreferences().getOverWriteFanartAndPostersPreference());
submenu.add(overwriteFanartAndPosters);
//Checkbox for using fanart.jpg and poster.jpg, not moviename-fanart.jpg and moviename-poster.jpg
JCheckBoxMenuItem noMovieNameInImageFiles = createCheckBoxMenuItem(
"Save poster and fanart as fanart.jpg and poster.jpg instead of moviename-fanart.jpg and moviename-poster.jpg",
b -> getPreferences().setNoMovieNameInImageFiles(b),
() -> getPreferences().getNoMovieNameInImageFiles());
submenu.add(noMovieNameInImageFiles);
//Checkbox for naming .nfo file movie.nfo instead of using movie name in file
JCheckBoxMenuItem nfoNamedMovieDotNfo = createCheckBoxMenuItem(
".nfo file named movie.nfo instead of using movie name",
b -> getPreferences().setNfoNamedMovieDotNfo(b),
() -> getPreferences().getNfoNamedMovieDotNfo());
submenu.add(nfoNamedMovieDotNfo);
//Checkbox for whether to write the <thumb> tags into the nfo file
JCheckBoxMenuItem writeThumbTagsForPosterAndFanartToNfo = createCheckBoxMenuItem(
"Write <thumb> tags for poster and fanart into .nfo file",
b -> getPreferences().setWriteThumbTagsForPosterAndFanartToNfo(b),
() -> getPreferences().getWriteThumbTagsForPosterAndFanartToNfo());
submenu.add(writeThumbTagsForPosterAndFanartToNfo);
return submenu;
}
private void initializeSettingsMenu() {
JMenu settingsMenu = new JMenu("Settings");
settingsMenu.setMnemonic(KeyEvent.VK_S);
// This is a scraping preference but fits better under the Settings menu
JMenuItem scrapersMenuItem = new JMenuItem("Amalgamation Settings...");
scrapersMenuItem.addActionListener(new SelectAmalgamationSettingsAction(guiMain));
settingsMenu.add(scrapersMenuItem);
JMenuItem renameSettings = new JMenuItem("Rename Settings...");
renameSettings.addActionListener(new ActionListener() {
@SuppressWarnings("unused") //simply calling the new for RenamerGUI below will show the dialog
@Override
public void actionPerformed(ActionEvent e) {
Movie currentSelectedMovie = null;
File currentlySelectedFile = null;
if(guiMain.getMovieToWriteToDiskList().size() > 0)
currentSelectedMovie = guiMain.getMovieToWriteToDiskList().get(0);
if(guiMain.getCurrentlySelectedMovieFileList().size() > 0)
currentlySelectedFile = guiMain.getCurrentlySelectedMovieFileList().get(0);
new RenamerGUI(getPreferences(), currentSelectedMovie, currentlySelectedFile);
}
});
settingsMenu.add(renameSettings);
JMenuItem favoriteGenresMenuItem = new JMenuItem("Favorite Genres...");
favoriteGenresMenuItem.addActionListener(new ChooseFavoriteGenresAction(guiMain));
settingsMenu.add(favoriteGenresMenuItem);
JMenuItem favoriteTagsMenuItem = new JMenuItem("Favorite Tags...");
favoriteTagsMenuItem.addActionListener(new ChooseFavoriteTagsAction(guiMain));
settingsMenu.add(favoriteTagsMenuItem);
JMenuItem externalMediaPlayerPickerMenu = new JMenuItem("Pick External Media Player...");
externalMediaPlayerPickerMenu.addActionListener(new ChooseExternalMediaPlayerAction(guiMain));
settingsMenu.add(externalMediaPlayerPickerMenu);
add(settingsMenu);
}
private void initializeFileMenu() {
// File menu
JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
fileMenu.getAccessibleContext().setAccessibleDescription(
"File actions for JAVMovieScraper");
//Browse directory file menu
JMenuItem browseDirectory = new JMenuItem("Browse directory...");
browseDirectory.setMnemonic(KeyEvent.VK_B);
browseDirectory.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
Event.CTRL_MASK));
browseDirectory.addActionListener(new BrowseDirectoryAction(guiMain));
fileMenu.add(browseDirectory);
//Refresh file menu
JMenuItem refreshDirectory = new JMenuItem("Refresh");
refreshDirectory.setMnemonic(KeyEvent.VK_R);
refreshDirectory.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,
Event.CTRL_MASK));
refreshDirectory.addActionListener(new RefreshDirectoryAction(guiMain));
fileMenu.add(refreshDirectory);
fileMenu.addSeparator();
//Open file menu
JMenuItem openFile = new JMenuItem("Open File");
openFile.setMnemonic(KeyEvent.VK_O);
openFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,
Event.CTRL_MASK));
openFile.addActionListener(new OpenFileAction(guiMain));
fileMenu.add(openFile);
JMenuItem playMovie = new JMenuItem("Play Movie");
playMovie.setMnemonic(KeyEvent.VK_P);
playMovie.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,
Event.CTRL_MASK));
playMovie.addActionListener(new PlayMovieAction(guiMain));
fileMenu.add(playMovie);
writeFileMenuItem = new JMenuItem("Write File Data");
writeFileMenuItem.setToolTipText("Write out the .nfo file to disk. The movie must have a title for this to be enabled.");
writeFileMenuItem.setEnabled(false); //this becomes enabled later when there is an actual movie to write
writeFileMenuItem.setMnemonic(KeyEvent.VK_W);
writeFileMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,
Event.CTRL_MASK));
writeFileMenuItem.addActionListener(new WriteFileDataAction(guiMain));
fileMenu.add(writeFileMenuItem);
JMenuItem moveFile = new JMenuItem("Move File to New Folder");
moveFile.setMnemonic(KeyEvent.VK_M);
moveFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M,
Event.CTRL_MASK));
moveFile.addActionListener(new MoveToNewFolderAction(guiMain));
fileMenu.add(moveFile);
JMenuItem cleanFile = new JMenuItem("Clean up File Name");
cleanFile.setMnemonic(KeyEvent.VK_C);
cleanFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
Event.CTRL_MASK));
cleanFile.addActionListener(new FileNameCleanupAction(guiMain));
fileMenu.add(cleanFile);
fileMenu.addSeparator();
//Exit file menu
JMenuItem exit = new JMenuItem("Exit");
exit.setMnemonic(KeyEvent.VK_E);
exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
Event.CTRL_MASK));
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
fileMenu.add(exit);
add(fileMenu);
}
private void initializeViewMenu() {
JMenu viewMenu = new JMenu("View");
viewMenu.setMnemonic(KeyEvent.VK_V);
JMenuItem consoleInSeperateWindowMenuItem = new JMenuItem("View Output In New Window");
consoleInSeperateWindowMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MessageConsoleGUI.showWindow();
}
});
JCheckBoxMenuItem consolePanelMenuItem = new JCheckBoxMenuItem("Show Output Panel");
consolePanelMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0));
consolePanelMenuItem.setState(guiMain.getGuiSettings().getShowOutputPanel());
consolePanelMenuItem.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED)
guiMain.showMessageConsolePanel();
else if(e.getStateChange() == ItemEvent.DESELECTED)
guiMain.hideMessageConsolePanel();
}
});
JCheckBoxMenuItem buttonPanelMenuItem = new JCheckBoxMenuItem("Show Tool Bar");
buttonPanelMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0));
buttonPanelMenuItem.setState(guiMain.getGuiSettings().getShowToolbar());
buttonPanelMenuItem.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED)
guiMain.showButtonPanel();
else if(e.getStateChange() == ItemEvent.DESELECTED)
guiMain.hideButtonPanel();
}
});
viewMenu.add(buttonPanelMenuItem);
viewMenu.add(consolePanelMenuItem);
viewMenu.add(consoleInSeperateWindowMenuItem);
add(viewMenu);
}
private void initializeScrapeMenu() {
JMenu scrapeMenu = new JMenu("Scrape");
scrapeMenu.setMnemonic(KeyEvent.VK_S);
JMenuItem scrapeAdultDVDAmalgamated = new JMenuItem(new ScrapeAmalgamatedAction(guiMain,
guiMain.getAllAmalgamationOrderingPreferences()
.getScraperGroupAmalgamationPreference(ScraperGroupName.AMERICAN_ADULT_DVD_SCRAPER_GROUP)));
scrapeAdultDVDAmalgamated.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK | Event.SHIFT_MASK));
scrapeAdultDVDAmalgamated.setIcon(GUIMainButtonPanel.initializeImageIcon("App"));
JMenuItem scrapeJAVAmalgamated = new JMenuItem(new ScrapeAmalgamatedAction(guiMain, guiMain.getAllAmalgamationOrderingPreferences().getScraperGroupAmalgamationPreference(ScraperGroupName.JAV_CENSORED_SCRAPER_GROUP)));
scrapeJAVAmalgamated.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK));
scrapeJAVAmalgamated.setIcon(GUIMainButtonPanel.initializeImageIcon("Japan"));
scrapeMenu.add(scrapeAdultDVDAmalgamated);
scrapeMenu.add(scrapeJAVAmalgamated);
JMenu specificMenu = new JMenu("Specific Scrape");
scrapeMenu.add(specificMenu);
int i = 0;
for(SiteParsingProfileItem item: SpecificProfileFactory.getAll()){
JMenuItem menuItem = new JMenuItem(item.toString());
Icon menuItemIcon = item.getParser().getProfileIcon();
if(menuItemIcon != null)
menuItem.setIcon(menuItemIcon);
if (++i < 10){
menuItem.setAccelerator(KeyStroke.getKeyStroke(Character.forDigit(i, 10), Event.CTRL_MASK));
}
else if(i < 20){
if(i==10)
++i;
menuItem.setAccelerator(KeyStroke.getKeyStroke(Character.forDigit(i%10, 10), Event.CTRL_MASK | Event.SHIFT_MASK));
}
menuItem.addActionListener(new ScrapeAmalgamatedAction(guiMain, item.getParser()));
specificMenu.add(menuItem);
}
add(scrapeMenu);
}
private void initializeHelpMenu() {
JMenu helpMenu = new JMenu("Help");
helpMenu.setMnemonic(KeyEvent.VK_H);
JMenuItem website = new JMenuItem("Visit website");
website.addActionListener(new BrowseUriAction(BrowseUriAction.MainWebsiteUri));
JMenuItem reportBug = new JMenuItem("Report bug");
reportBug.addActionListener(new BrowseUriAction(BrowseUriAction.ReportBugUri));
JMenuItem about = new JMenuItem("About...");
about.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new AboutDialog(guiMain.getFrmMoviescraper()).setVisible(true);
}
});
helpMenu.add(website);
helpMenu.add(reportBug);
helpMenu.addSeparator();
helpMenu.add(about);
add(helpMenu);
}
private void initializeMenus() {
//add the various menus together
initializeFileMenu();
initializeScrapeMenu();
initializePreferencesMenu();
initializeSettingsMenu();
initializeViewMenu();
initializeHelpMenu();
}
private MoviescraperPreferences getPreferences(){
return preferences;
}
public void disableWriteFile() {
if (writeFileMenuItem != null) {
writeFileMenuItem.setEnabled(false);
}
}
public void enableWriteFile() {
if (writeFileMenuItem != null) {
writeFileMenuItem.setEnabled(true);
}
}
}