/**
* ======================== legal notice ======================
*
* File: ConfigDialog.java Created: 13. June 2012, 04:57 Author: Geronimo Project: cmpc - a java frontend
* (client) part of compound media player uses external players to play the
* media
*
* CMP - compound media player
*
* is a client/server mediaplayer intended to play any media from any
* workstation without the need to export or mount shares. cmps is an easy to
* use backend with a (ready to use) HTML-interface. Additionally the backend
* supports authentication via HTTP-digest authorization. cmpc is a client with
* vdr-like osd-menues.
*
* Copyright (c) 2012 Reinhard Mantey, some rights reserved! published under
* Creative Commons by-sa For details see
* http://creativecommons.org/licenses/by-sa/3.0/
*
* The cmp project's homepage is at
* http://projects.vdr-developer.org/projects/cmp
*
* --------------------------------------------------------------
*/
package de.schwarzrot.control.config;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import bibliothek.gui.dock.common.CControl;
import bibliothek.gui.dock.common.CGrid;
import bibliothek.gui.dock.common.theme.ThemeMap;
import bibliothek.gui.dock.util.WindowProvider;
import bibliothek.gui.dock.util.WindowProviderListener;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.swing.DefaultEventTableModel;
import de.schwarzrot.base.dock.BasicDockable;
import de.schwarzrot.base.util.AbstractDialog;
import de.schwarzrot.base.util.ApplicationServiceProvider;
import de.schwarzrot.control.table.PlayerDefinitionTableFormat;
import de.schwarzrot.control.table.ServerDefinitionTableFormat;
import de.schwarzrot.media.domain.AbstractMediaNode;
import de.schwarzrot.media.domain.Config;
import de.schwarzrot.media.domain.MediaServer;
import de.schwarzrot.media.domain.PlayerDefinition;
public class ConfigDialog extends AbstractDialog implements WindowProvider {
private static final long serialVersionUID = 713L;
public ConfigDialog(Window parent) {
super(parent, true, DialogMode.CANCEL_APPROVE, Orientation.Right);
config = ApplicationServiceProvider.getService(Config.class);
listeners = new ArrayList();
setFixedSize(new Dimension(520, 320));
}
@Override
public void addWindowProviderListener(WindowProviderListener windowproviderlistener) {
if (!listeners.contains(windowproviderlistener))
listeners.add(windowproviderlistener);
}
public JComponent create_Old_ContentPane() {
JTabbedPane rv = new JTabbedPane();
rv.addTab("server", createServerTable());
rv.addTab("player", createPlayerTable());
return rv;
}
@Override
public JComponent createContentPane() {
CControl docking = new CControl(this);
CGrid grid = new CGrid(docking);
docking.setTheme(ThemeMap.KEY_ECLIPSE_THEME);
BasicDockable servers = new BasicDockable("servers", msgBundle.getMessage(getClass().getSimpleName()
+ ".servers"), createServerTable());
BasicDockable players = new BasicDockable("players", msgBundle.getMessage(getClass().getSimpleName()
+ ".players"), createPlayerTable());
servers.setMinimizable(false);
servers.setExternalizable(false);
servers.setMaximizable(false);
players.setMinimizable(false);
players.setExternalizable(false);
players.setMaximizable(false);
grid.add(0, 0, 1, 1, players);
grid.add(0, 0, 1, 1, servers);
docking.getContentArea().deploy(grid);
return docking.getContentArea();
}
@Override
public void removeWindowProviderListener(WindowProviderListener windowproviderlistener) {
if (listeners.contains(windowproviderlistener))
listeners.remove(windowproviderlistener);
}
@Override
public Window searchWindow() {
return this;
}
protected JComponent createPlayerTable() {
playerDefinitions = new BasicEventList();
for (AbstractMediaNode.SupportedMediaType mt : AbstractMediaNode.SupportedMediaType.values()) {
if (mt == AbstractMediaNode.SupportedMediaType.Unknown)
break;
PlayerDefinition pd = (PlayerDefinition) config.getPlayerMap().get(mt).clone(); // so we can revert changes
pd.setMediaType(mt);
playerDefinitions.add(pd);
}
PlayerDefinitionTableFormat ptf = new PlayerDefinitionTableFormat();
DefaultEventTableModel tm = new DefaultEventTableModel(playerDefinitions,
ptf);
JTable playerTable = new JTable(tm);
JScrollPane playerTableScrollPane = new JScrollPane(playerTable);
int mx = playerTable.getColumnModel().getColumnCount();
for (int i = 0; i < mx; ++i) {
int cw = ptf.getColumnWidth(i);
if (cw > 0) {
playerTable.getColumnModel().getColumn(i).setPreferredWidth(cw);
playerTable.getColumnModel().getColumn(i).setMaxWidth(cw);
}
}
playerTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
return playerTableScrollPane;
}
protected void createServerDefinition() {
serverDefinitions.add(new MediaServer());
}
protected JComponent createServerTable() {
serverDefinitions = new BasicEventList();
for (MediaServer s : config.getKnownServers())
serverDefinitions.add((MediaServer) s.clone());
ServerDefinitionTableFormat stf = new ServerDefinitionTableFormat();
DefaultEventTableModel tm = new DefaultEventTableModel(serverDefinitions, stf);
JTable serverTable = new JTable(tm);
JScrollPane serverTableScrollPane = new JScrollPane(serverTable);
int mx = serverTable.getColumnModel().getColumnCount();
for (int i = 0; i < mx; ++i) {
int cw = stf.getColumnWidth(i);
if (cw > 0) {
serverTable.getColumnModel().getColumn(i).setPreferredWidth(cw);
serverTable.getColumnModel().getColumn(i).setMaxWidth(cw);
}
}
serverTable.getActionMap().put("createServerDefinition", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
createServerDefinition();
}
});
serverTable.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0), "createServerDefinition");
serverTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
return serverTableScrollPane;
}
@Override
protected void performApprove() {
System.out.println("should save config now!?!");
List cfgServers = config.getKnownServers();
AbstractMediaNode.SupportedMediaType[] allTypes = AbstractMediaNode.SupportedMediaType.values();
Map cfgPlayers = config.getPlayerMap();
int mx = allTypes.length - 1;
cfgServers.clear();
cfgServers.addAll(serverDefinitions);
for (int i = 0; i < mx; ++i)
cfgPlayers.put(allTypes[i], playerDefinitions.get(i));
}
private EventList serverDefinitions;
private EventList playerDefinitions;
private List listeners;
private Config config;
}