/*
* PS3 Media Server, for streaming any medias to your PS3.
* Copyright (C) 2008 A.Brochard
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.pms.newgui;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.sun.jna.Platform;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.event.*;
import java.io.File;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import net.pms.Messages;
import net.pms.PMS;
import net.pms.configuration.PmsConfiguration;
import net.pms.dlna.DLNAMediaDatabase;
import net.pms.newgui.components.CustomJButton;
import net.pms.util.CoverSupplier;
import net.pms.util.FormLayoutUtil;
import net.pms.util.FullyPlayedAction;
import net.pms.util.KeyedComboBoxModel;
import net.pms.util.UMSUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NavigationShareTab {
private static final Logger LOGGER = LoggerFactory.getLogger(NavigationShareTab.class);
public static final String ALL_DRIVES = Messages.getString("FoldTab.0");
private JTable FList;
private SharedFoldersTableModel folderTableModel;
private JCheckBox hidevideosettings;
private JCheckBox hidetranscode;
private JCheckBox hidemedialibraryfolder;
private JCheckBox hideextensions;
private JCheckBox hideemptyfolders;
private JCheckBox hideengines;
private CustomJButton but5;
private JTextField seekpos;
private JCheckBox thumbgenCheckBox;
private JCheckBox mplayer_thumb;
private JCheckBox dvdiso_thumb;
private JCheckBox image_thumb;
private JCheckBox cacheenable;
private JCheckBox archive;
private JComboBox<String> sortmethod;
private JComboBox<String> audiothumbnail;
private JTextField defaultThumbFolder;
private JCheckBox iphoto;
private JCheckBox aperture;
public static JCheckBox itunes;
private CustomJButton select;
private CustomJButton cachereset;
private JCheckBox ignorethewordthe;
private JTextField atzLimit;
private JCheckBox liveSubtitles;
private JCheckBox prettifyfilenames;
private JCheckBox episodeTitles;
private JCheckBox newmediafolder;
private JCheckBox recentlyplayedfolder;
private JCheckBox resume;
private JComboBox fullyPlayedAction;
private JTextField fullyPlayedOutputDirectory;
private CustomJButton selectFullyPlayedOutputDirectory;
public SharedFoldersTableModel getDf() {
return folderTableModel;
}
private final PmsConfiguration configuration;
private LooksFrame looksFrame;
NavigationShareTab(PmsConfiguration configuration, LooksFrame looksFrame) {
this.configuration = configuration;
this.looksFrame = looksFrame;
}
private void updateModel() {
if (folderTableModel.getRowCount() == 1 && folderTableModel.getValueAt(0, 0).equals(ALL_DRIVES)) {
configuration.setFolders("");
} else {
StringBuilder folders = new StringBuilder();
StringBuilder foldersMonitored = new StringBuilder();
int i2 = 0;
for (int i = 0; i < folderTableModel.getRowCount(); i++) {
if (i > 0) {
folders.append(',');
}
String directory = (String) folderTableModel.getValueAt(i, 0);
boolean monitored = (boolean) folderTableModel.getValueAt(i, 1);
// escape embedded commas. note: backslashing isn't safe as it conflicts with
// Windows path separators:
// http://ps3mediaserver.org/forum/viewtopic.php?f=14&t=8883&start=250#p43520
folders.append(directory.replace(",", ","));
if (monitored) {
if (i2 > 0) {
foldersMonitored.append(',');
}
i2++;
foldersMonitored.append(directory.replace(",", ","));
}
}
configuration.setFolders(folders.toString());
configuration.setFoldersMonitored(foldersMonitored.toString());
}
}
private static final String PANEL_COL_SPEC = "left:pref, 50dlu, pref, 150dlu, pref, 25dlu, pref, 9dlu, pref, default:grow, pref, 25dlu";
private static final String PANEL_ROW_SPEC =
// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
"p," // Thumbnails
+ "3dlu," //
+ "p," // Generate thumbnails Thumbnail seeking position: [seeking position] Image thumbnails
+ "3dlu," //
+ "p," //
+ "3dlu," //
+ "p," //
+ "9dlu," //
+ "p," // File sorting
+ "3dlu," //
+ "p," //
+ "3dlu," //
+ "p," //
+ "9dlu," //
+ "p," // Virtual folders
+ "3dlu," //
+ "p," //
+ "3dlu," //
+ "p," //
+ "3dlu," //
+ "p," //
+ "3dlu," //
+ "p," //
+ "3dlu," //
+ "p," //
+ "3dlu," //
+ "p," //
+ "3dlu," //
+ "p," //
+ "9dlu," //
+ "fill:default:grow"; // Shared folders
private static final String SHARED_FOLDER_COL_SPEC = "left:pref, left:pref, pref, pref, pref, pref, 0:grow";
private static final String SHARED_FOLDER_ROW_SPEC = "p, 3dlu, p, 3dlu, fill:default:grow";
public JComponent build() {
// Apply the orientation for the locale
ComponentOrientation orientation = ComponentOrientation.getOrientation(PMS.getLocale());
String colSpec = FormLayoutUtil.getColSpec(PANEL_COL_SPEC, orientation);
// Set basic layout
FormLayout layout = new FormLayout(colSpec, PANEL_ROW_SPEC);
PanelBuilder builder = new PanelBuilder(layout);
builder.border(Borders.DLU4);
builder.opaque(true);
CellConstraints cc = new CellConstraints();
// Init all gui components
initSimpleComponents(cc);
PanelBuilder builderSharedFolder = initSharedFoldersGuiComponents(cc);
// Build gui with initialized components
if (!configuration.isHideAdvancedOptions()) {
JComponent cmp = builder.addSeparator(Messages.getString("FoldTab.13"), FormLayoutUtil.flip(cc.xyw(1, 1, 12), colSpec, orientation));
cmp = (JComponent) cmp.getComponent(0);
cmp.setFont(cmp.getFont().deriveFont(Font.BOLD));
builder.add(GuiUtil.getPreferredSizeComponent(thumbgenCheckBox), FormLayoutUtil.flip(cc.xyw(1, 3, 3), colSpec, orientation));
builder.addLabel(Messages.getString("NetworkTab.16"), FormLayoutUtil.flip(cc.xyw(4, 3, 2), colSpec, orientation));
builder.add(seekpos, FormLayoutUtil.flip(cc.xy(6, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(image_thumb), FormLayoutUtil.flip(cc.xyw(9, 3, 4), colSpec, orientation));
builder.addLabel(Messages.getString("FoldTab.26"), FormLayoutUtil.flip(cc.xyw(1, 5, 3), colSpec, orientation));
builder.add(audiothumbnail, FormLayoutUtil.flip(cc.xyw(4, 5, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(mplayer_thumb), FormLayoutUtil.flip(cc.xyw(9, 5, 4), colSpec, orientation));
builder.addLabel(Messages.getString("FoldTab.27"), FormLayoutUtil.flip(cc.xy(1, 7), colSpec, orientation));
builder.add(defaultThumbFolder, FormLayoutUtil.flip(cc.xyw(4, 7, 2), colSpec, orientation));
builder.add(select, FormLayoutUtil.flip(cc.xy(6, 7), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(dvdiso_thumb), FormLayoutUtil.flip(cc.xyw(9, 7, 4), colSpec, orientation));
cmp = builder.addSeparator(Messages.getString("NetworkTab.59"), FormLayoutUtil.flip(cc.xyw(1, 9, 12), colSpec, orientation));
cmp = (JComponent) cmp.getComponent(0);
cmp.setFont(cmp.getFont().deriveFont(Font.BOLD));
builder.addLabel(Messages.getString("FoldTab.18"), FormLayoutUtil.flip(cc.xyw(1, 11, 3), colSpec, orientation));
builder.add(sortmethod, FormLayoutUtil.flip(cc.xyw(4, 11, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(ignorethewordthe), FormLayoutUtil.flip(cc.xyw(9, 11, 4), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(prettifyfilenames), FormLayoutUtil.flip(cc.xyw(1, 13, 5), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(episodeTitles), FormLayoutUtil.flip(cc.xyw(9, 13, 4), colSpec, orientation));
cmp = builder.addSeparator(Messages.getString("NetworkTab.60"), FormLayoutUtil.flip(cc.xyw(1, 15, 12), colSpec, orientation));
cmp = (JComponent) cmp.getComponent(0);
cmp.setFont(cmp.getFont().deriveFont(Font.BOLD));
builder.add(GuiUtil.getPreferredSizeComponent(hideextensions), FormLayoutUtil.flip(cc.xyw(1, 17, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(hideengines), FormLayoutUtil.flip(cc.xyw(4, 17, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(hideemptyfolders), FormLayoutUtil.flip(cc.xyw(9, 17, 4), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(itunes), FormLayoutUtil.flip(cc.xy(1, 19), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(iphoto), FormLayoutUtil.flip(cc.xyw(4, 19, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(aperture), FormLayoutUtil.flip(cc.xyw(9, 19, 4), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(cacheenable), FormLayoutUtil.flip(cc.xy(1, 21), colSpec, orientation));
builder.add(cachereset, FormLayoutUtil.flip(cc.xyw(4, 21, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(hidemedialibraryfolder), FormLayoutUtil.flip(cc.xyw(9, 21, 4), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(archive), FormLayoutUtil.flip(cc.xyw(1, 23, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(hidevideosettings), FormLayoutUtil.flip(cc.xyw(4, 23, 3), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(hidetranscode), FormLayoutUtil.flip(cc.xyw(9, 23, 4), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(liveSubtitles), FormLayoutUtil.flip(cc.xyw(1, 25, 3), colSpec, orientation));
builder.addLabel(Messages.getString("FoldTab.37"), FormLayoutUtil.flip(cc.xyw(4, 25, 2), colSpec, orientation));
builder.add(atzLimit, FormLayoutUtil.flip(cc.xy(6, 25), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(newmediafolder), FormLayoutUtil.flip(cc.xyw(9, 25, 4), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(resume), FormLayoutUtil.flip(cc.xy(1, 27), colSpec, orientation));
builder.add(GuiUtil.getPreferredSizeComponent(recentlyplayedfolder), FormLayoutUtil.flip(cc.xyw(4, 27, 3), colSpec, orientation));
builder.addLabel(Messages.getString("FoldTab.72"), FormLayoutUtil.flip(cc.xy (1, 29 ), colSpec, orientation));
builder.add(fullyPlayedAction, FormLayoutUtil.flip(cc.xyw(4, 29, 3), colSpec, orientation));
builder.add(fullyPlayedOutputDirectory, FormLayoutUtil.flip(cc.xyw(9, 29, 2), colSpec, orientation));
builder.add(selectFullyPlayedOutputDirectory, FormLayoutUtil.flip(cc.xyw(11, 29, 2), colSpec, orientation));
builder.add(builderSharedFolder.getPanel(), FormLayoutUtil.flip(cc.xyw(1, 31, 12), colSpec, orientation));
} else {
builder.add(builderSharedFolder.getPanel(), FormLayoutUtil.flip(cc.xyw(1, 1, 12), colSpec, orientation));
}
builder.add(builderSharedFolder.getPanel(), FormLayoutUtil.flip(cc.xyw(1, 31, 12), colSpec, orientation));
JPanel panel = builder.getPanel();
// Apply the orientation to the panel and all components in it
panel.applyComponentOrientation(orientation);
JScrollPane scrollPane = new JScrollPane(
panel,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
return scrollPane;
}
private void initSimpleComponents(CellConstraints cc) {
// Thumbnail seeking position
seekpos = new JTextField("" + configuration.getThumbnailSeekPos());
seekpos.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
try {
int ab = Integer.parseInt(seekpos.getText());
configuration.setThumbnailSeekPos(ab);
if (configuration.getUseCache()) {
PMS.get().getDatabase().init(true);
}
} catch (NumberFormatException nfe) {
LOGGER.debug("Could not parse thumbnail seek position from \"" + seekpos.getText() + "\"");
}
}
});
if (configuration.isThumbnailGenerationEnabled()) {
seekpos.setEnabled(true);
} else {
seekpos.setEnabled(false);
}
// Generate thumbnails
thumbgenCheckBox = new JCheckBox(Messages.getString("NetworkTab.2"), configuration.isThumbnailGenerationEnabled());
thumbgenCheckBox.setContentAreaFilled(false);
thumbgenCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setThumbnailGenerationEnabled((e.getStateChange() == ItemEvent.SELECTED));
seekpos.setEnabled(configuration.isThumbnailGenerationEnabled());
mplayer_thumb.setEnabled(configuration.isThumbnailGenerationEnabled());
}
});
// Use MPlayer for video thumbnails
mplayer_thumb = new JCheckBox(Messages.getString("FoldTab.14"), configuration.isUseMplayerForVideoThumbs());
mplayer_thumb.setToolTipText(Messages.getString("FoldTab.61"));
mplayer_thumb.setContentAreaFilled(false);
mplayer_thumb.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setUseMplayerForVideoThumbs((e.getStateChange() == ItemEvent.SELECTED));
}
});
if (configuration.isThumbnailGenerationEnabled()) {
mplayer_thumb.setEnabled(true);
} else {
mplayer_thumb.setEnabled(false);
}
// DVD ISO thumbnails
dvdiso_thumb = new JCheckBox(Messages.getString("FoldTab.19"), configuration.isDvdIsoThumbnails());
dvdiso_thumb.setContentAreaFilled(false);
dvdiso_thumb.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setDvdIsoThumbnails((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Image thumbnails
image_thumb = new JCheckBox(Messages.getString("FoldTab.21"), configuration.getImageThumbnailsEnabled());
image_thumb.setContentAreaFilled(false);
image_thumb.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setImageThumbnailsEnabled((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Audio thumbnails import
final KeyedComboBoxModel<CoverSupplier, String> thumbKCBM = new KeyedComboBoxModel<>(
new CoverSupplier[]{CoverSupplier.NONE, CoverSupplier.COVER_ART_ARCHIVE},
new String[]{Messages.getString("FoldTab.35"), Messages.getString("FoldTab.73")}
);
audiothumbnail = new JComboBox<>(thumbKCBM);
audiothumbnail.setEditable(false);
thumbKCBM.setSelectedKey(configuration.getAudioThumbnailMethod());
audiothumbnail.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
configuration.setAudioThumbnailMethod(thumbKCBM.getSelectedKey());
LOGGER.info("Setting {} {}", Messages.getRootString("FoldTab.26"), thumbKCBM.getSelectedValue());
}
}
});
// Alternate video cover art folder
defaultThumbFolder = new JTextField(configuration.getAlternateThumbFolder());
defaultThumbFolder.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
configuration.setAlternateThumbFolder(defaultThumbFolder.getText());
}
});
// Alternate video cover art folder button
select = new CustomJButton("...");
select.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser;
try {
chooser = new JFileChooser();
} catch (Exception ee) {
chooser = new JFileChooser(new RestrictedFileSystemView());
}
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = chooser.showDialog((Component) e.getSource(), Messages.getString("FoldTab.28"));
if (returnVal == JFileChooser.APPROVE_OPTION) {
defaultThumbFolder.setText(chooser.getSelectedFile().getAbsolutePath());
configuration.setAlternateThumbFolder(chooser.getSelectedFile().getAbsolutePath());
}
}
});
// Hide Server Settings folder
hidevideosettings = new JCheckBox(Messages.getString("FoldTab.38"), configuration.getHideVideoSettings());
hidevideosettings.setContentAreaFilled(false);
hidevideosettings.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideVideoSettings((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Hide #--TRANSCODE--# folder
hidetranscode = new JCheckBox(Messages.getString("FoldTab.33"), configuration.getHideTranscodeEnabled());
hidetranscode.setContentAreaFilled(false);
hidetranscode.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideTranscodeEnabled((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Hide cache folder
hidemedialibraryfolder = new JCheckBox(Messages.getString("FoldTab.32"), configuration.isHideMediaLibraryFolder());
hidemedialibraryfolder.setContentAreaFilled(false);
hidemedialibraryfolder.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideMediaLibraryFolder((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Browse compressed archives
archive = new JCheckBox(Messages.getString("NetworkTab.1"), configuration.isArchiveBrowsing());
archive.setContentAreaFilled(false);
archive.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setArchiveBrowsing(e.getStateChange() == ItemEvent.SELECTED);
}
});
// Enable the cache
cacheenable = new JCheckBox(Messages.getString("NetworkTab.17"), configuration.getUseCache());
cacheenable.setToolTipText(Messages.getString("FoldTab.48"));
cacheenable.setContentAreaFilled(false);
cacheenable.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setUseCache((e.getStateChange() == ItemEvent.SELECTED));
cachereset.setEnabled(configuration.getUseCache());
setScanLibraryEnabled(configuration.getUseCache());
}
});
// Reset cache
cachereset = new CustomJButton(Messages.getString("NetworkTab.18"));
cachereset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int option = JOptionPane.showConfirmDialog(
looksFrame,
Messages.getString("NetworkTab.13") + Messages.getString("NetworkTab.19"),
Messages.getString("Dialog.Question"),
JOptionPane.YES_NO_OPTION);
if (option == JOptionPane.YES_OPTION) {
PMS.get().getDatabase().init(true);
}
}
});
cachereset.setEnabled(configuration.getUseCache());
// Hide file extensions
hideextensions = new JCheckBox(Messages.getString("FoldTab.5"), configuration.isHideExtensions());
hideextensions.setContentAreaFilled(false);
if (configuration.isPrettifyFilenames()) {
hideextensions.setEnabled(false);
}
hideextensions.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideExtensions((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Hide transcoding engine names
hideengines = new JCheckBox(Messages.getString("FoldTab.8"), configuration.isHideEngineNames());
hideengines.setToolTipText(Messages.getString("FoldTab.46"));
hideengines.setContentAreaFilled(false);
hideengines.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideEngineNames((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Hide empty folders
hideemptyfolders = new JCheckBox(Messages.getString("FoldTab.31"), configuration.isHideEmptyFolders());
hideemptyfolders.setToolTipText(Messages.getString("FoldTab.59"));
hideemptyfolders.setContentAreaFilled(false);
hideemptyfolders.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideEmptyFolders((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Show iTunes library
itunes = new JCheckBox(Messages.getString("FoldTab.30"), configuration.isShowItunesLibrary());
itunes.setToolTipText(Messages.getString("FoldTab.47"));
itunes.setContentAreaFilled(false);
if (!(Platform.isMac() || Platform.isWindows())) {
itunes.setEnabled(false);
}
itunes.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setShowItunesLibrary((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Show iPhoto library
iphoto = new JCheckBox(Messages.getString("FoldTab.29"), configuration.isShowIphotoLibrary());
iphoto.setContentAreaFilled(false);
if (!Platform.isMac()) {
iphoto.setEnabled(false);
}
iphoto.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setShowIphotoLibrary((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Show aperture library
aperture = new JCheckBox(Messages.getString("FoldTab.34"), configuration.isShowApertureLibrary());
aperture.setContentAreaFilled(false);
if (!Platform.isMac()) {
aperture.setEnabled(false);
}
aperture.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setShowApertureLibrary((e.getStateChange() == ItemEvent.SELECTED));
}
});
// File order
final KeyedComboBoxModel<Integer, String> kcbm = new KeyedComboBoxModel<>(
new Integer[]{
UMSUtils.SORT_LOC_SENS, // alphabetical
UMSUtils.SORT_LOC_NAT, // natural sort
UMSUtils.SORT_INS_ASCII, // ASCIIbetical
UMSUtils.SORT_MOD_NEW, // newest first
UMSUtils.SORT_MOD_OLD, // oldest first
UMSUtils.SORT_RANDOM, // random
UMSUtils.SORT_NO_SORT // no sorting
},
new String[]{
Messages.getString("FoldTab.15"),
Messages.getString("FoldTab.22"),
Messages.getString("FoldTab.20"),
Messages.getString("FoldTab.16"),
Messages.getString("FoldTab.17"),
Messages.getString("FoldTab.58"),
Messages.getString("FoldTab.62")
}
);
sortmethod = new JComboBox<>(kcbm);
sortmethod.setEditable(false);
kcbm.setSelectedKey(configuration.getSortMethod(null));
sortmethod.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
configuration.setSortMethod(kcbm.getSelectedKey());
LOGGER.info("Setting {} {}", Messages.getRootString("FoldTab.18"), kcbm.getSelectedValue());
}
}
});
// Ignore the word "the" while sorting
ignorethewordthe = new JCheckBox(Messages.getString("FoldTab.39"), configuration.isIgnoreTheWordAandThe());
ignorethewordthe.setToolTipText(Messages.getString("FoldTab.44"));
ignorethewordthe.setContentAreaFilled(false);
ignorethewordthe.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setIgnoreTheWordAandThe((e.getStateChange() == ItemEvent.SELECTED));
}
});
atzLimit = new JTextField("" + configuration.getATZLimit());
atzLimit.setToolTipText(Messages.getString("FoldTab.49"));
atzLimit.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
try {
int ab = Integer.parseInt(atzLimit.getText());
configuration.setATZLimit(ab);
} catch (NumberFormatException nfe) {
LOGGER.debug("Could not parse ATZ limit from \"" + atzLimit.getText() + "\"");
LOGGER.debug("The full error was: " + nfe);
}
}
});
liveSubtitles = new JCheckBox(Messages.getString("FoldTab.42"), configuration.isHideLiveSubtitlesFolder());
liveSubtitles.setContentAreaFilled(false);
liveSubtitles.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideLiveSubtitlesFolder((e.getStateChange() == ItemEvent.SELECTED));
}
});
prettifyfilenames = new JCheckBox(Messages.getString("FoldTab.43"), configuration.isPrettifyFilenames());
prettifyfilenames.setToolTipText(Messages.getString("FoldTab.45"));
prettifyfilenames.setContentAreaFilled(false);
prettifyfilenames.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setPrettifyFilenames((e.getStateChange() == ItemEvent.SELECTED));
hideextensions.setEnabled((e.getStateChange() != ItemEvent.SELECTED));
episodeTitles.setEnabled((e.getStateChange() == ItemEvent.SELECTED));
}
});
episodeTitles = new JCheckBox(Messages.getString("FoldTab.74"), configuration.isUseInfoFromIMDb());
episodeTitles.setToolTipText(Messages.getString("FoldTab.64"));
episodeTitles.setContentAreaFilled(false);
if (!configuration.isPrettifyFilenames()) {
episodeTitles.setEnabled(false);
}
episodeTitles.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setUseInfoFromIMDb((e.getStateChange() == ItemEvent.SELECTED));
}
});
newmediafolder = new JCheckBox(Messages.getString("FoldTab.54"), configuration.isHideNewMediaFolder());
newmediafolder.setToolTipText(Messages.getString("FoldTab.66"));
newmediafolder.setContentAreaFilled(false);
newmediafolder.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideNewMediaFolder((e.getStateChange() == ItemEvent.SELECTED));
}
});
resume = new JCheckBox(Messages.getString("NetworkTab.68"), configuration.isResumeEnabled());
resume.setToolTipText(Messages.getString("NetworkTab.69"));
resume.setContentAreaFilled(false);
resume.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setResume((e.getStateChange() == ItemEvent.SELECTED));
}
});
recentlyplayedfolder = new JCheckBox(Messages.getString("FoldTab.55"), configuration.isHideRecentlyPlayedFolder());
recentlyplayedfolder.setContentAreaFilled(false);
recentlyplayedfolder.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
configuration.setHideRecentlyPlayedFolder((e.getStateChange() == ItemEvent.SELECTED));
}
});
// Fully played action
final KeyedComboBoxModel<FullyPlayedAction, String> fullyPlayedActionModel = new KeyedComboBoxModel<>(
new FullyPlayedAction[]{
FullyPlayedAction.NO_ACTION,
FullyPlayedAction.MARK,
FullyPlayedAction.HIDE_VIDEO,
FullyPlayedAction.MOVE_FOLDER,
FullyPlayedAction.MOVE_TRASH
},
new String[]{
Messages.getString("FoldTab.67"),
Messages.getString("FoldTab.68"),
Messages.getString("FoldTab.69"),
Messages.getString("FoldTab.70"),
Messages.getString("FoldTab.71")
}
);
fullyPlayedAction = new JComboBox<>(fullyPlayedActionModel);
fullyPlayedAction.setEditable(false);
fullyPlayedActionModel.setSelectedKey(configuration.getFullyPlayedAction());
fullyPlayedAction.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
configuration.setFullyPlayedAction(fullyPlayedActionModel.getSelectedKey());
fullyPlayedOutputDirectory.setEnabled(fullyPlayedActionModel.getSelectedKey() == FullyPlayedAction.MOVE_FOLDER);
selectFullyPlayedOutputDirectory.setEnabled(fullyPlayedActionModel.getSelectedKey() == FullyPlayedAction.MOVE_FOLDER);
if (configuration.getUseCache() && fullyPlayedActionModel.getSelectedKey() == FullyPlayedAction.NO_ACTION) {
PMS.get().getDatabase().init(true);
}
}
}
});
// Watched video output directory
fullyPlayedOutputDirectory = new JTextField(configuration.getFullyPlayedOutputDirectory());
fullyPlayedOutputDirectory.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
configuration.setFullyPlayedOutputDirectory(fullyPlayedOutputDirectory.getText());
}
});
fullyPlayedOutputDirectory.setEnabled(configuration.getFullyPlayedAction() == FullyPlayedAction.MOVE_FOLDER);
// Watched video output directory selection button
selectFullyPlayedOutputDirectory = new CustomJButton("...");
selectFullyPlayedOutputDirectory.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser;
try {
chooser = new JFileChooser();
} catch (Exception ee) {
chooser = new JFileChooser(new RestrictedFileSystemView());
}
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = chooser.showDialog((Component) e.getSource(), Messages.getString("FoldTab.28"));
if (returnVal == JFileChooser.APPROVE_OPTION) {
fullyPlayedOutputDirectory.setText(chooser.getSelectedFile().getAbsolutePath());
configuration.setFullyPlayedOutputDirectory(chooser.getSelectedFile().getAbsolutePath());
}
}
});
selectFullyPlayedOutputDirectory.setEnabled(configuration.getFullyPlayedAction() == FullyPlayedAction.MOVE_FOLDER);
}
private PanelBuilder initSharedFoldersGuiComponents(CellConstraints cc) {
// Apply the orientation for the locale
ComponentOrientation orientation = ComponentOrientation.getOrientation(PMS.getLocale());
String colSpec = FormLayoutUtil.getColSpec(SHARED_FOLDER_COL_SPEC, orientation);
FormLayout layoutFolders = new FormLayout(colSpec, SHARED_FOLDER_ROW_SPEC);
PanelBuilder builderFolder = new PanelBuilder(layoutFolders);
builderFolder.opaque(true);
JComponent cmp = builderFolder.addSeparator(Messages.getString("FoldTab.7"), FormLayoutUtil.flip(cc.xyw(1, 1, 7), colSpec, orientation));
cmp = (JComponent) cmp.getComponent(0);
cmp.setFont(cmp.getFont().deriveFont(Font.BOLD));
folderTableModel = new SharedFoldersTableModel();
FList = new JTable(folderTableModel);
TableColumn column = FList.getColumnModel().getColumn(0);
column.setMinWidth(650);
/* An attempt to set the correct row height adjusted for font scaling.
* It sets all rows based on the font size of cell (0, 0). The + 4 is
* to allow 2 pixels above and below the text. */
DefaultTableCellRenderer cellRenderer = (DefaultTableCellRenderer) FList.getCellRenderer(0,0);
FontMetrics metrics = cellRenderer.getFontMetrics(cellRenderer.getFont());
FList.setRowHeight(metrics.getLeading() + metrics.getMaxAscent() + metrics.getMaxDescent() + 4);
FList.setIntercellSpacing(new Dimension(8, 2));
CustomJButton but = new CustomJButton(LooksFrame.readImageIcon("button-adddirectory.png"));
but.setToolTipText(Messages.getString("FoldTab.9"));
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser;
try {
chooser = new JFileChooser();
} catch (Exception ee) {
chooser = new JFileChooser(new RestrictedFileSystemView());
}
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = chooser.showOpenDialog((Component) e.getSource());
if (returnVal == JFileChooser.APPROVE_OPTION) {
((SharedFoldersTableModel) FList.getModel()).addRow(new Object[]{chooser.getSelectedFile().getAbsolutePath(), true});
if (FList.getModel().getValueAt(0, 0).equals(ALL_DRIVES)) {
((SharedFoldersTableModel) FList.getModel()).removeRow(0);
}
updateModel();
}
}
});
builderFolder.add(but, FormLayoutUtil.flip(cc.xy(1, 3), colSpec, orientation));
CustomJButton but2 = new CustomJButton(LooksFrame.readImageIcon("button-remove.png"));
but2.setToolTipText(Messages.getString("FoldTab.36"));
but2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (FList.getSelectedRow() > -1) {
((SharedFoldersTableModel) FList.getModel()).removeRow(FList.getSelectedRow());
if (FList.getModel().getRowCount() == 0) {
folderTableModel.addRow(new Object[]{ALL_DRIVES, false});
}
updateModel();
}
}
});
builderFolder.add(but2, FormLayoutUtil.flip(cc.xy(2, 3), colSpec, orientation));
CustomJButton but3 = new CustomJButton(LooksFrame.readImageIcon("button-arrow-down.png"));
but3.setToolTipText(Messages.getString("FoldTab.12"));
but3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < FList.getRowCount() - 1; i++) {
if (FList.isRowSelected(i)) {
Object value1 = FList.getValueAt(i, 0);
boolean value2 = (boolean) FList.getValueAt(i, 1);
FList.setValueAt(FList.getValueAt(i + 1, 0), i , 0);
FList.setValueAt(value1 , i + 1, 0);
FList.setValueAt(FList.getValueAt(i + 1, 1), i , 1);
FList.setValueAt(value2 , i + 1, 1);
FList.changeSelection(i + 1, 1, false, false);
break;
}
}
}
});
builderFolder.add(but3, FormLayoutUtil.flip(cc.xy(3, 3), colSpec, orientation));
CustomJButton but4 = new CustomJButton(LooksFrame.readImageIcon("button-arrow-up.png"));
but4.setToolTipText(Messages.getString("FoldTab.12"));
but4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 1; i < FList.getRowCount(); i++) {
if (FList.isRowSelected(i)) {
Object value1 = FList.getValueAt(i, 0);
boolean value2 = (boolean) FList.getValueAt(i, 1);
FList.setValueAt(FList.getValueAt(i - 1, 0), i , 0);
FList.setValueAt(value1 , i - 1, 0);
FList.setValueAt(FList.getValueAt(i - 1, 1), i , 1);
FList.setValueAt(value2 , i - 1, 1);
FList.changeSelection(i - 1, 1, false, false);
break;
}
}
}
});
builderFolder.add(but4, FormLayoutUtil.flip(cc.xy(4, 3), colSpec, orientation));
but5 = new CustomJButton(LooksFrame.readImageIcon("button-scan.png"));
but5.setToolTipText(Messages.getString("FoldTab.2"));
but5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (configuration.getUseCache()) {
DLNAMediaDatabase database = PMS.get().getDatabase();
if (database != null) {
if (!database.isScanLibraryRunning()) {
int option = JOptionPane.showConfirmDialog(
looksFrame,
Messages.getString("FoldTab.3") + Messages.getString("FoldTab.4"),
Messages.getString("Dialog.Question"),
JOptionPane.YES_NO_OPTION);
if (option == JOptionPane.YES_OPTION) {
database.scanLibrary();
but5.setIcon(LooksFrame.readImageIcon("button-scan-busy.gif"));
but5.setRolloverIcon(LooksFrame.readImageIcon("button-scan-cancel.png"));
but5.setToolTipText(Messages.getString("FoldTab.40"));
}
} else {
int option = JOptionPane.showConfirmDialog(
looksFrame,
Messages.getString("FoldTab.10"),
Messages.getString("Dialog.Question"),
JOptionPane.YES_NO_OPTION);
if (option == JOptionPane.YES_OPTION) {
database.stopScanLibrary();
looksFrame.setStatusLine(Messages.getString("FoldTab.41"));
setScanLibraryEnabled(false);
but5.setToolTipText(Messages.getString("FoldTab.41"));
}
}
}
}
}
});
/**
* Hide the scan button in basic mode since it's better to let it be done in
* realtime.
*/
if (!configuration.isHideAdvancedOptions()) {
builderFolder.add(but5, FormLayoutUtil.flip(cc.xy(5, 3), colSpec, orientation));
}
but5.setEnabled(configuration.getUseCache());
File[] folders = PMS.get().getSharedFoldersArray(false);
if (folders != null && folders.length > 0) {
File[] foldersMonitored = PMS.get().getSharedFoldersArray(true);
for (File folder : folders) {
boolean isMonitored = false;
if (foldersMonitored != null && foldersMonitored.length > 0) {
for (File folderMonitored : foldersMonitored) {
if (folderMonitored.getAbsolutePath().equals(folder.getAbsolutePath())) {
isMonitored = true;
}
}
}
folderTableModel.addRow(new Object[]{folder.getAbsolutePath(), isMonitored});
}
} else {
folderTableModel.addRow(new Object[]{ALL_DRIVES, false});
}
JScrollPane pane = new JScrollPane(FList);
Dimension d = FList.getPreferredSize();
pane.setPreferredSize(new Dimension(d.width, FList.getRowHeight() * 2));
builderFolder.add(pane, FormLayoutUtil.flip(cc.xyw(1, 5, 7), colSpec, orientation));
return builderFolder;
}
public void setScanLibraryEnabled(boolean enabled) {
but5.setEnabled(enabled);
but5.setIcon(LooksFrame.readImageIcon("button-scan.png"));
but5.setRolloverIcon(LooksFrame.readImageIcon("button-scan.png"));
but5.setToolTipText(Messages.getString("FoldTab.2"));
}
public class SharedFoldersTableModel extends DefaultTableModel {
private static final long serialVersionUID = -4247839506937958655L;
public SharedFoldersTableModel() {
super(new String[]{Messages.getString("FoldTab.56"), Messages.getString("FoldTab.65")}, 0);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
Class clazz = String.class;
switch (columnIndex) {
case 1:
clazz = Boolean.class;
break;
default:
break;
}
return clazz;
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 1;
}
@Override
public void setValueAt(Object aValue, int row, int column) {
Vector rowVector = (Vector) dataVector.elementAt(row);
if (aValue instanceof Boolean && column == 1) {
rowVector.setElementAt((boolean) aValue, 1);
} else {
rowVector.setElementAt(aValue, column);
}
fireTableCellUpdated(row, column);
updateModel();
}
}
}