/*
* Universal Media Server, for streaming any media to DLNA
* compatible renderers based on the http://www.ps3mediaserver.org.
* Copyright (C) 2012 UMS developers.
*
* This program is a 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 java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.*;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import net.pms.Messages;
import net.pms.PMS;
import net.pms.configuration.PmsConfiguration;
import net.pms.configuration.RendererConfiguration;
import net.pms.newgui.components.IllegalChildException;
import net.pms.newgui.components.SearchableMutableTreeNode;
import net.pms.util.tree.CheckTreeManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SelectRenderers extends JPanel {
private static final Logger LOGGER = LoggerFactory.getLogger(SelectRenderers.class);
private static final long serialVersionUID = -2724796596060834064L;
private static PmsConfiguration configuration = PMS.getConfiguration();
private static List<String> selectedRenderers = configuration.getSelectedRenderers();
private CheckTreeManager checkTreeManager;
private JTree SrvTree;
private SearchableMutableTreeNode allRenderers;
private static final String allRenderersTreeName = configuration.ALL_RENDERERS;
private boolean init = false;
public SelectRenderers() {
super(new BorderLayout());
}
public void build() {
JPanel checkPanel = new JPanel();
checkPanel.applyComponentOrientation(ComponentOrientation.getOrientation(PMS.getLocale()));
add(checkPanel, BorderLayout.LINE_START);
allRenderers = new SearchableMutableTreeNode(Messages.getString("GeneralTab.13"));
Pattern pattern = Pattern.compile("^\\s*([^\\s]*) ?([^\\s].*?)?\\s*$");
for (String renderer : RendererConfiguration.getAllRenderersNames()) {
Matcher match = pattern.matcher(renderer);
if (match.find()) {
// Find or create group or single name renderer
SearchableMutableTreeNode node = null;
try {
node = allRenderers.findChild(match.group(1));
} catch (IllegalChildException e) {}
if (node == null) {
node = new SearchableMutableTreeNode(match.group(1));
allRenderers.add(node);
}
// Find or create subgroup/name
if (match.groupCount() > 1 && match.group(2) != null) {
SearchableMutableTreeNode subNode = null;
try {
subNode = node.findChild(match.group(2));
} catch (IllegalChildException e) {}
if (subNode != null) {
LOGGER.warn("Renderer {} found twice, ignoring repeated entry", renderer);
} else {
subNode = new SearchableMutableTreeNode(match.group(2));
node.add(subNode);
}
}
} else {
LOGGER.warn("Can't parse renderer name \"{}\"", renderer);
}
}
SrvTree = new JTree(new DefaultTreeModel(allRenderers));
checkTreeManager = new CheckTreeManager(SrvTree);
checkPanel.add(new JScrollPane(SrvTree));
checkPanel.setSize(400, 500);
}
/**
* Create the GUI and show it.
*/
public void showDialog() {
if (!init) {
// Initial call
build();
init = true;
}
SrvTree.validate();
// Refresh setting if modified
selectedRenderers = configuration.getSelectedRenderers();
TreePath root = new TreePath(allRenderers);
if (selectedRenderers.isEmpty() || (selectedRenderers.size() == 1 && selectedRenderers.get(0) == null)) {
checkTreeManager.getSelectionModel().clearSelection();
} else if (selectedRenderers.size() == 1 && selectedRenderers.get(0).equals(allRenderersTreeName)) {
checkTreeManager.getSelectionModel().setSelectionPath(root);
} else {
if (root.getLastPathComponent() instanceof SearchableMutableTreeNode) {
SearchableMutableTreeNode rootNode = (SearchableMutableTreeNode) root.getLastPathComponent();
SearchableMutableTreeNode node = null;
List<TreePath> selectedRenderersPath = new ArrayList<>(selectedRenderers.size());
for (String selectedRenderer : selectedRenderers) {
try {
node = rootNode.findInBranch(selectedRenderer, true);
} catch (IllegalChildException e) {}
if (node != null) {
selectedRenderersPath.add(new TreePath(node.getPath()));
}
}
checkTreeManager.getSelectionModel().setSelectionPaths(selectedRenderersPath.toArray(new TreePath[selectedRenderersPath.size()]));
} else {
LOGGER.error("Illegal node class in SelectRenderers.showDialog(): {}", root.getLastPathComponent().getClass().getSimpleName());
}
}
int selectRenderers = JOptionPane.showOptionDialog(
(Component) PMS.get().getFrame(),
this,
Messages.getString("GeneralTab.5"),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE,
null,
null,
null
);
if (selectRenderers == JOptionPane.OK_OPTION) {
TreePath[] selected = checkTreeManager.getSelectionModel().getSelectionPaths();
if (selected.length == 0) {
configuration.setSelectedRenderers("");
} else if (
selected.length == 1 && selected[0].getLastPathComponent() instanceof SearchableMutableTreeNode &&
((SearchableMutableTreeNode) selected[0].getLastPathComponent()).getNodeName().equals(allRenderers.getNodeName())
) {
configuration.setSelectedRenderers(allRenderersTreeName);
} else {
List<String> selectedRenderers = new ArrayList<>();
for (TreePath path : selected) {
String rendererName = "";
if (path.getPathComponent(0).equals(allRenderers)) {
for (int i = 1; i < path.getPathCount(); i++) {
if (path.getPathComponent(i) instanceof SearchableMutableTreeNode) {
if (!rendererName.isEmpty()) {
rendererName += " ";
}
rendererName += ((SearchableMutableTreeNode) path.getPathComponent(i)).getNodeName();
} else {
LOGGER.error("Invalid tree node component class {}", path.getPathComponent(i).getClass().getSimpleName());
}
}
if (!rendererName.isEmpty()) {
selectedRenderers.add(rendererName);
}
} else {
LOGGER.warn("Invalid renderer treepath encountered: {}", path.toString());
}
}
configuration.setSelectedRenderers(selectedRenderers);
}
}
}
}