📄 playerui.java
字号:
/*
* PlayerUI.
*
* JavaZOOM : jlgui@javazoom.net
* http://www.javazoom.net
*
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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 Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package javazoom.jlgui.player.amp;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.StringTokenizer;
import javax.sound.sampled.SourceDataLine;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javazoom.jlgui.basicplayer.BasicController;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerEvent;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import javazoom.jlgui.basicplayer.BasicPlayerListener;
import javazoom.jlgui.player.amp.equalizer.ui.EqualizerUI;
import javazoom.jlgui.player.amp.playlist.Playlist;
import javazoom.jlgui.player.amp.playlist.PlaylistFactory;
import javazoom.jlgui.player.amp.playlist.PlaylistItem;
import javazoom.jlgui.player.amp.playlist.ui.PlaylistUI;
import javazoom.jlgui.player.amp.skin.AbsoluteLayout;
import javazoom.jlgui.player.amp.skin.DropTargetAdapter;
import javazoom.jlgui.player.amp.skin.ImageBorder;
import javazoom.jlgui.player.amp.skin.PopupAdapter;
import javazoom.jlgui.player.amp.skin.Skin;
import javazoom.jlgui.player.amp.skin.UrlDialog;
import javazoom.jlgui.player.amp.tag.ui.TagSearch;
import javazoom.jlgui.player.amp.util.Config;
import javazoom.jlgui.player.amp.util.FileSelector;
import javazoom.jlgui.player.amp.util.ui.Preferences;
import javazoom.jlgui.player.amp.visual.ui.SpectrumTimeAnalyzer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class PlayerUI extends JPanel implements ActionListener, ChangeListener, BasicPlayerListener
{
private static Log log = LogFactory.getLog(PlayerUI.class);
public static final int INIT = 0;
public static final int OPEN = 1;
public static final int PLAY = 2;
public static final int PAUSE = 3;
public static final int STOP = 4;
public static final int TEXT_LENGTH_MAX = 30;
public static final long SCROLL_PERIOD = 250;
private Skin ui = null;
private Loader loader = null;
private Config config = null;
/*-- Pop up menus --*/
private JPopupMenu mainpopup = null;
private JPopupMenu ejectpopup = null;
private JCheckBoxMenuItem miPlaylist = null;
private JCheckBoxMenuItem miEqualizer = null;
private JMenuItem miPlayFile = null;
private JMenuItem miPlayLocation = null;
private PopupAdapter popupAdapter = null;
private PopupAdapter ejectpopupAdapter = null;
/*-- Sound player --*/
private BasicController theSoundPlayer = null;
private Map audioInfo = null;
private int playerState = INIT;
/*-- Title text --*/
private String titleText = Skin.TITLETEXT.toUpperCase();
private String currentTitle = Skin.TITLETEXT.toUpperCase();
private String[] titleScrollLabel = null;
private int scrollIndex = 0;
private long lastScrollTime = 0L;
private boolean scrollRight = true;
private long secondsAmount = 0;
/*-- Playlist --*/
private Playlist playlist = null;
private PlaylistUI playlistUI = null;
private String currentFileOrURL = null;
private String currentSongName = null;
private PlaylistItem currentPlaylistItem = null;
private boolean currentIsFile;
/*-- PosBar members --*/
private boolean posValueJump = false;
private boolean posDragging = false;
private double posValue = 0.0;
/*-- EqualizerUI --*/
private EqualizerUI equalizerUI = null;
public PlayerUI()
{
super();
setDoubleBuffered(true);
ui = new Skin();
}
public void setEqualizerUI(EqualizerUI eq)
{
equalizerUI = eq;
}
public EqualizerUI getEqualizerUI()
{
return equalizerUI;
}
public PlaylistUI getPlaylistUI()
{
return playlistUI;
}
public void setPlaylistUI(PlaylistUI playlistUI)
{
this.playlistUI = playlistUI;
}
public Playlist getPlaylist()
{
return playlist;
}
/**
* Return config.
* @return
*/
public Config getConfig()
{
return config;
}
/**
* Return skin.
* @return
*/
public Skin getSkin()
{
return ui;
}
/**
* Return parent loader.
* @return
*/
public Loader getLoader()
{
return loader;
}
/**
* A handle to the BasicPlayer, plugins may control the player through
* the controller (play, stop, ...)
* @param controller
*/
public void setController(BasicController controller)
{
theSoundPlayer = controller;
}
/**
* Return player controller.
* @return
*/
public BasicController getController()
{
return theSoundPlayer;
}
/**
* Load main player.
* @param loader
*/
public void loadUI(Loader loader)
{
this.loader = loader;
setLayout(new AbsoluteLayout());
config = Config.getInstance();
ui.setConfig(config);
playlistUI = new PlaylistUI();
playlistUI.setSkin(ui);
playlistUI.setPlayer(this);
equalizerUI = new EqualizerUI();
equalizerUI.setSkin(ui);
loadSkin();
// DnD support.
DropTargetAdapter dnd = new DropTargetAdapter()
{
public void processDrop(Object data)
{
processDnD(data);
}
};
DropTarget dt = new DropTarget(this, DnDConstants.ACTION_COPY, dnd, true);
}
public void loadSkin()
{
log.info("Load PlayerUI (EDT=" + SwingUtilities.isEventDispatchThread() + ")");
removeAll();
// Load skin specified in args
if (ui.getPath() != null)
{
log.info("Load default skin from " + ui.getPath());
ui.loadSkin(ui.getPath());
config.setDefaultSkin(ui.getPath());
}
// Load skin specified in jlgui.ini
else if ((config.getDefaultSkin() != null) && (!config.getDefaultSkin().trim().equals("")))
{
log.info("Load default skin from " + config.getDefaultSkin());
ui.loadSkin(config.getDefaultSkin());
}
// Default included skin
else
{
ClassLoader cl = getClass().getClassLoader();
InputStream sis = cl.getResourceAsStream("javazoom/jlgui/player/amp/metrix.wsz");
log.info("Load default skin for JAR");
ui.loadSkin(sis);
}
// Background
ImageBorder border = new ImageBorder();
border.setImage(ui.getMainImage());
setBorder(border);
// Buttons
add(ui.getAcPrevious(), ui.getAcPrevious().getConstraints());
ui.getAcPrevious().removeActionListener(this);
ui.getAcPrevious().addActionListener(this);
add(ui.getAcPlay(), ui.getAcPlay().getConstraints());
ui.getAcPlay().removeActionListener(this);
ui.getAcPlay().addActionListener(this);
add(ui.getAcPause(), ui.getAcPause().getConstraints());
ui.getAcPause().removeActionListener(this);
ui.getAcPause().addActionListener(this);
add(ui.getAcStop(), ui.getAcStop().getConstraints());
ui.getAcStop().removeActionListener(this);
ui.getAcStop().addActionListener(this);
add(ui.getAcNext(), ui.getAcNext().getConstraints());
ui.getAcNext().removeActionListener(this);
ui.getAcNext().addActionListener(this);
add(ui.getAcEject(), ui.getAcEject().getConstraints());
ui.getAcEject().removeActionListener(this);
ui.getAcEject().addActionListener(this);
// EqualizerUI toggle
add(ui.getAcEqualizer(), ui.getAcEqualizer().getConstraints());
ui.getAcEqualizer().removeActionListener(this);
ui.getAcEqualizer().addActionListener(this);
// Playlist toggle
add(ui.getAcPlaylist(), ui.getAcPlaylist().getConstraints());
ui.getAcPlaylist().removeActionListener(this);
ui.getAcPlaylist().addActionListener(this);
// Shuffle toggle
add(ui.getAcShuffle(), ui.getAcShuffle().getConstraints());
ui.getAcShuffle().removeActionListener(this);
ui.getAcShuffle().addActionListener(this);
// Repeat toggle
add(ui.getAcRepeat(), ui.getAcRepeat().getConstraints());
ui.getAcRepeat().removeActionListener(this);
ui.getAcRepeat().addActionListener(this);
// Volume
add(ui.getAcVolume(), ui.getAcVolume().getConstraints());
ui.getAcVolume().removeChangeListener(this);
ui.getAcVolume().addChangeListener(this);
// Balance
add(ui.getAcBalance(), ui.getAcBalance().getConstraints());
ui.getAcBalance().removeChangeListener(this);
ui.getAcBalance().addChangeListener(this);
// Seek bar
add(ui.getAcPosBar(), ui.getAcPosBar().getConstraints());
ui.getAcPosBar().removeChangeListener(this);
ui.getAcPosBar().addChangeListener(this);
// Mono
add(ui.getAcMonoIcon(), ui.getAcMonoIcon().getConstraints());
// Stereo
add(ui.getAcStereoIcon(), ui.getAcStereoIcon().getConstraints());
// Title label
add(ui.getAcTitleLabel(), ui.getAcTitleLabel().getConstraints());
// Sample rate label
add(ui.getAcSampleRateLabel(), ui.getAcSampleRateLabel().getConstraints());
// Bit rate label
add(ui.getAcBitRateLabel(), ui.getAcBitRateLabel().getConstraints());
// Play icon
add(ui.getAcPlayIcon(), ui.getAcPlayIcon().getConstraints());
// Time icon
add(ui.getAcTimeIcon(), ui.getAcTimeIcon().getConstraints());
// MinuteH number
add(ui.getAcMinuteH(), ui.getAcMinuteH().getConstraints());
// MinuteL number
add(ui.getAcMinuteL(), ui.getAcMinuteL().getConstraints());
// SecondH number
add(ui.getAcSecondH(), ui.getAcSecondH().getConstraints());
// SecondL number
add(ui.getAcSecondL(), ui.getAcSecondL().getConstraints());
// TitleBar
add(ui.getAcTitleBar(), ui.getAcTitleBar().getConstraints());
add(ui.getAcMinimize(), ui.getAcMinimize().getConstraints());
ui.getAcMinimize().removeActionListener(this);
ui.getAcMinimize().addActionListener(this);
add(ui.getAcExit(), ui.getAcExit().getConstraints());
ui.getAcExit().removeActionListener(this);
ui.getAcExit().addActionListener(this);
// DSP
if (ui.getAcAnalyzer() != null)
{
add(ui.getAcAnalyzer(), ui.getAcAnalyzer().getConstraints());
}
// Popup menu
mainpopup = new JPopupMenu(ui.getResource("popup.title"));
JMenuItem mi = new JMenuItem(Skin.TITLETEXT + "- JavaZOOM");
//mi.removeActionListener(this);
//mi.addActionListener(this);
mainpopup.add(mi);
mainpopup.addSeparator();
JMenu playSubMenu = new JMenu(ui.getResource("popup.play"));
miPlayFile = new JMenuItem(ui.getResource("popup.play.file"));
miPlayFile.setActionCommand(PlayerActionEvent.MIPLAYFILE);
miPlayFile.removeActionListener(this);
miPlayFile.addActionListener(this);
miPlayLocation = new JMenuItem(ui.getResource("popup.play.location"));
miPlayLocation.setActionCommand(PlayerActionEvent.MIPLAYLOCATION);
miPlayLocation.removeActionListener(this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -