/* * MP3FilesApplet. * * 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.playlist.ui; import java.applet.Applet; import java.awt.AWTEvent; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.MenuItem; import java.awt.Panel; import java.awt.Point; import java.awt.PopupMenu; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStreamReader; import java.util.StringTokenizer; import java.util.Vector; import javazoom.jlgui.player.amp.PlayerApplet; import javazoom.jlgui.player.amp.playlist.Playlist; import javazoom.jlgui.player.amp.playlist.PlaylistItem; import javazoom.jlgui.player.amp.skin.ActiveComponent; import javazoom.jlgui.player.amp.skin.SkinLoader; import javazoom.jlgui.player.amp.skin.UrlDialog; import javazoom.jlgui.player.amp.tag.TagInfo; import javazoom.jlgui.player.amp.tag.TagInfoFactory; import javazoom.jlgui.player.amp.tag.ui.TagInfoDialog; import javazoom.jlgui.player.amp.util.Config; import javazoom.jlgui.player.amp.util.FileSelector; /** * MP3FilesApplet. * This class implements a playlist UI WinAmp javazoom.jlgui.player.amp.skins compliant. * * @author: JOHN YANG * @date: 02/11/2002 */ public class MP3FilesApplet extends Panel implements ActionListener { //private FileDialog FD = null ; // use for add music to playlist private String pledit = "pledit.txt"; private Color current = new Color(102, 204, 255); private Color normal = new Color(0xb2, 0xe4, 0xf6); private Color selBg = Color.black; private Color bgcolor = Color.black; private int topIndex = 0; private int currentSelection = -1; // private Vector names ; // private Vector dirs ; // private byte [] selected = new byte [100] ; private Image imWinamp; private Image listBack; private int WinWidth, WinHeight; private int listarea [] = {12, 24 - 4, 256, 78}; //172} ; private Image offScreenImage; private Graphics offScreenGraphics; private Graphics gG = null; private Image scrollBarNormal; private Image scrollBarClicked; private boolean FirstBarDrag = true; private int[] scrollBarRange = {20, 75 - 15}; private int scrollBarX = -1; private int scrollBarLocation = scrollBarRange[0]; private int XBarDrag = 0; private Image titleCenter; private Image titleLeft; private Image titleRight; private Image titleStretch; private Image btmLeft; private Image btmRight; private Image bodyLeft; private Image bodyRight; private Image downScrollButton; private Image upScrollButton; private ActiveComponent acUpScrollButton; private ActiveComponent acDownScrollButton; private ActiveComponent acScrollBar; //private Window addFileWnd = null; //private Window subFileWnd = null; //private Window selFileWnd = null; //private Window optFileWnd = null; private Panel addFileWnd = null; private Panel subFileWnd = null; private Panel selFileWnd = null; private Panel optFileWnd = null; private final int gapsInButtons = 29; private int[] addarea = {14, 116 - 38 + 6, 14 + 22, 116 - 38 + 6 + 18}; private Playlist playlist = null; private Config config = null; private PlayerApplet player = null; // add by John Yang: for add Dir functions private Vector exts = null; public static int MAXDEPTH = 4; private boolean isSearching; private PopupMenu fipopup = null; /** * Constructor. */ public MP3FilesApplet(Applet parent, PlayerApplet player, Playlist playlist, SkinLoader skl, int xPos, int yPos, boolean showit) { //super(parent); setLayout(null); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { handleMouseClick(e); } }); this.playlist = playlist; this.player = player; // Config feature. config = Config.getInstance(); //for ( int i = 0 ; i < 100 ; i ++ ) selected [i] = 0 ; //names = new Vector () ; //dirs = new Vector () ; getPleditInfo(skl); imWinamp = skl.getImage("pledit.bmp"); WinWidth = 275; WinHeight = 116; // E.B Fix : WinWidth - 15 not WinWidth - 13 scrollBarX = WinWidth - 15; // added 07/02/2002 // E.B Fix : Size=8*18 not 5*15 scrollBarNormal = parent.createImage(8, 18); Graphics g = scrollBarNormal.getGraphics(); g.drawImage(imWinamp, 0, 0, 8, 18, 52, 53, 52 + 8, 53 + 18, null); scrollBarClicked = parent.createImage(8, 18); g = scrollBarClicked.getGraphics(); g.drawImage(imWinamp, 0, 0, 8, 18, 61, 53, 61 + 8, 53 + 18, null); acScrollBar = new ActiveComponent(scrollBarNormal, scrollBarClicked, AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK); acScrollBar.setLocation(scrollBarX, scrollBarLocation); add(acScrollBar); acScrollBar.setActionCommand("Scroll"); acScrollBar.addActionListener(this); titleCenter = parent.createImage(100, 20); g = titleCenter.getGraphics(); g.drawImage(imWinamp, 0, 0, 100, 20, 26, 0, 126, 20, null); titleLeft = parent.createImage(25, 20); g = titleLeft.getGraphics(); g.drawImage(imWinamp, 0, 0, 25, 20, 0, 0, 25, 20, null); titleStretch = parent.createImage(25, 20); g = titleStretch.getGraphics(); g.drawImage(imWinamp, 0, 0, 25, 20, 127, 0, 152, 20, null); titleRight = parent.createImage(25, 20); g = titleRight.getGraphics(); g.drawImage(imWinamp, 0, 0, 25, 20, 153, 0, 178, 20, null); btmLeft = parent.createImage(125, 38); g = btmLeft.getGraphics(); g.drawImage(imWinamp, 0, 0, 125, 38, 0, 72, 125, 110, null); btmRight = parent.createImage(150, 38); g = btmRight.getGraphics(); // E.B Fix : 127 -> 126, 277 -> 276 g.drawImage(imWinamp, 0, 0, 150, 38, 126, 72, 276, 110, null); bodyLeft = parent.createImage(12, 28); g = bodyLeft.getGraphics(); g.drawImage(imWinamp, 0, 0, 12, 28, 0, 42, 12, 70, null); bodyRight = parent.createImage(20, 28); g = bodyRight.getGraphics(); g.drawImage(imWinamp, 0, 0, 20, 28, 31, 42, 51, 70, null); upScrollButton = parent.createImage(8, 4); g = upScrollButton.getGraphics(); g.drawImage(imWinamp, 0, 0, 8, 4, 261, 75, 269, 79, null); acUpScrollButton = new ActiveComponent(upScrollButton, upScrollButton, AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK); acUpScrollButton.setLocation(WinWidth - 15, WinHeight - 35); add(acUpScrollButton); acUpScrollButton.setActionCommand("ScrollUp"); acUpScrollButton.addActionListener(this); downScrollButton = parent.createImage(8, 4); g = downScrollButton.getGraphics(); g.drawImage(imWinamp, 0, 0, 8, 4, 261, 80, 269, 84, null); acDownScrollButton = new ActiveComponent(downScrollButton, downScrollButton, AWTEvent.MOUSE_EVENT_MASK); acDownScrollButton.setLocation(WinWidth - 15, WinHeight - 30); add(acDownScrollButton); acDownScrollButton.setActionCommand("ScrollDown"); acDownScrollButton.addActionListener(this); // Popup menu on TitleBar fipopup = new PopupMenu("FileInfo"); Font fnt = new Font("Dialog", Font.PLAIN, 11); fipopup.setFont(fnt); MenuItem mi = new MenuItem("File Info"); mi.addActionListener(this); fipopup.add(mi); fipopup.addSeparator(); mi = new MenuItem("Play Item"); mi.addActionListener(this); fipopup.add(mi); fipopup.addSeparator(); mi = new MenuItem("Remove Item(s)"); mi.addActionListener(this); fipopup.add(mi); this.add(fipopup); setSize(WinWidth, WinHeight); setLocation(xPos, yPos); //setBackground(Color.black); show(showit); // changed to non-deprecated code (was show()) //pack(); } /** * @function: initialize the pledit display * @date: 02/11/2002 */ public void initPlayList() { //for ( int i = 0 ; i < 100 ; i ++ ) selected [i] = 0 ; topIndex = 0; nextCursor(); } /** * @function: Repaint the file list area and scroll it if necessary * @date: 02/07/2002 */ public void nextCursor() { currentSelection = playlist.getSelectedIndex(); int n = playlist.getPlaylistSize(); int nlines = (listarea[3] - listarea[1]) / 12; while (currentSelection - topIndex > nlines - 1) topIndex += 2; if (topIndex >= n) topIndex = n - 1; while (currentSelection < topIndex) topIndex -= 2; if (topIndex < 0) topIndex = 0; // reset the vertical scroll bar position resetScrollBar(); repaint(); } private void getPleditInfo(SkinLoader skl) { String tmp = (String) skl.getContent(pledit); tmp = tmp.toLowerCase(); ByteArrayInputStream in = new ByteArrayInputStream(tmp.getBytes()); // changed deprecated code (Scott Pennell) BufferedReader lin = new BufferedReader(new InputStreamReader(in)); try { for (; ;) { String aa = lin.readLine(); if (aa == null) break; if ((aa.toLowerCase()).startsWith("normalbg")) bgcolor = parseColor(aa); else if ((aa.toLowerCase()).startsWith("normal")) normal = parseColor(aa); else if ((aa.toLowerCase()).startsWith("current")) current = parseColor(aa); else if ((aa.toLowerCase()).startsWith("selectedbg")) selBg = parseColor(aa); } } catch (Exception e9) { } try { in.close(); } catch (Exception ex) { } } private Color parseColor(String aa) throws Exception { int pos = aa.indexOf("#"); if (pos == -1) { // Some javazoom.jlgui.player.amp.skins are buggy :-) pos = aa.indexOf("="); if (pos == -1) throw new Exception("Can not parse color!"); } aa = aa.substring(pos + 1); int r = Integer.parseInt(aa.substring(0, 2), 16); int g = Integer.parseInt(aa.substring(2, 4), 16); int b = Integer.parseInt(aa.substring(4), 16); return new Color(r, g, b); } public void paint(Graphics g) { if (offScreenImage == null) { offScreenImage = createImage(WinWidth, WinHeight); offScreenGraphics = offScreenImage.getGraphics(); offScreenGraphics.drawImage(titleLeft, 0, 0, this); offScreenGraphics.drawImage(titleStretch, 25, 0, this); offScreenGraphics.drawImage(titleStretch, 50, 0, this); offScreenGraphics.drawImage(titleStretch, 62, 0, this); offScreenGraphics.drawImage(titleCenter, 87, 0, this); offScreenGraphics.drawImage(titleStretch, 187, 0, this); offScreenGraphics.drawImage(titleStretch, 200, 0, this); offScreenGraphics.drawImage(titleStretch, 225, 0, this); offScreenGraphics.drawImage(titleRight, 250, 0, this); offScreenGraphics.drawImage(bodyLeft, 0, 20, this); offScreenGraphics.drawImage(bodyLeft, 0, 48, this); offScreenGraphics.drawImage(bodyLeft, 0, 50, this); offScreenGraphics.drawImage(btmLeft, 0, WinHeight - 38, this); // E.B Fix : 126 -> 125 offScreenGraphics.drawImage(btmRight, 125, WinHeight - 38, this); titleCenter = null; titleLeft = null; titleRight = null; titleStretch = null; btmLeft = null; bodyLeft = null; btmRight = null; System.gc(); } // E.B Fix : Draw list in offScreenGraphics now to make // long text fit to playlist UI. offScreenGraphics.setFont(new Font("Dialog", Font.PLAIN, 10)); paintList(offScreenGraphics); offScreenGraphics.drawImage(bodyRight, WinWidth - 20, 20, this); offScreenGraphics.drawImage(bodyRight, WinWidth - 20, 48, this); offScreenGraphics.drawImage(bodyRight, WinWidth - 20, 50, this); // bodyRight = null ; // End Fix if (offScreenImage != null) g.drawImage(offScreenImage, 0, 0, this); } public void update(Graphics g) { paint(g); } public void paintList() { if (!isVisible()) return; else repaint(); // E.B Fix : Draw list in offScreenGraphics. /* if ( gG == null ) { gG = getGraphics () ; gG.setFont (new Font("Dialog", Font.PLAIN, 10)) ; } paintList (gG); */ } private void paintList(Graphics g) { g.setColor(bgcolor); g.fillRect(listarea[0], listarea[1], listarea[2] - listarea[0], listarea[3] - listarea[1]); currentSelection = playlist.getSelectedIndex(); int offset = currentSelection - topIndex; g.setColor(normal); int n = playlist.getPlaylistSize(); /* int nlines = (listarea[3] - listarea[1]) / 12 ; while ( currentSelection - topIndex > nlines-1 ) topIndex += 2 ; if ( topIndex > n ) topIndex = n - 1 ; while ( currentSelection < topIndex ) topIndex -= 2 ; if ( topIndex < 0 ) topIndex = 0 ; */ for (int i = 0; i < n; i++) { if (i < topIndex) continue; int k = i - topIndex; if (listarea[1] + 12 + k * 12 > listarea[3]) break; PlaylistItem pli = playlist.getItemAt(i); String name = pli.getFormattedName(); // if ( selected [i] == 1 ) // draw selected item's background if (pli.isSelected()) { g.setColor(selBg); g.fillRect(listarea[0] + 4, listarea[1] + 12 - 10 + k * 12, listarea[2] - listarea[0] - 4, 14); } if (i == currentSelection) g.setColor(current); else g.setColor(normal); if (i + 1 >= 10) g.drawString((i + 1) + ". " + name, listarea[0] + 12, listarea[1] + 12 + k * 12); else g.drawString("0" + (i + 1) + ". " + name, listarea[0] + 12, listarea[1] + 12 + k * 12); /* if ( selected [i] == 1 ) g.drawString ("+", listarea[0] + 4, listarea[1] + 12 + k*12) ; */ if (i == currentSelection) g.setColor(normal); } } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); int n = playlist.getPlaylistSize(); if (cmd.equals("Scroll")) { if (acScrollBar.isMousePressed() == false) { FirstBarDrag = true; } else { int DeltaY = 0; if (FirstBarDrag == false) { DeltaY = acScrollBar.getMouseY() - XBarDrag; XBarDrag = acScrollBar.getMouseY() - DeltaY; scrollBarLocation += DeltaY; if (scrollBarLocation < scrollBarRange[0]) scrollBarLocation = scrollBarRange[0]; if (scrollBarLocation > scrollBarRange[1]) scrollBarLocation = scrollBarRange[1]; acScrollBar.setLocation(scrollBarX, scrollBarLocation); float dx = ((float) scrollBarLocation - scrollBarRange[0]) / (scrollBarRange[1] - scrollBarRange[0]); int index = (int) (dx * (n - 1)); if (index != topIndex) { topIndex = index; paintList(); } } else { FirstBarDrag = false; XBarDrag = acScrollBar.getMouseY(); } } } else if (cmd.equals("ScrollUp")) { topIndex--; if(topIndex<0) topIndex=0; resetScrollBar(); paintList(); } else if (cmd.equals("ScrollDown")) { topIndex++; if(topIndex>n-1) topIndex=n-1; resetScrollBar(); paintList(); } // Add File event // E.B : FileSelector added as M.S did. else if (cmd.equals("Add File")) { addFileWnd.setVisible(false); Frame f = new Frame(); f.setLocation(this.getBounds().x, this.getBounds().y + 10); FileSelector.setWindow(f); String fsFile = FileSelector.selectFile(FileSelector.OPEN, config.getExtensions(), config.getLastDir()); fsFile = FileSelector.getFile(); if (fsFile != null) { config.setLastDir(FileSelector.getDirectory()); if ((!fsFile.toLowerCase().endsWith(".wsz")) && (!fsFile.toLowerCase().endsWith(".m3u")) && (!fsFile.toLowerCase().endsWith(".pls"))) { PlaylistItem pli = new PlaylistItem(fsFile, config.getLastDir() + fsFile, -1, true); playlist.appendItem(pli); resetScrollBar(); repaint(); } } } // E.B : Added URL dialog. else if (cmd.equals("Add Url")) { addFileWnd.setVisible(false); UrlDialog UD = new UrlDialog("Open location", this.getBounds().x, this.getBounds().y + 10, 280, 120, null); UD.show(); if (UD.getFile() != null) { displayAll(); if (player != null) player.displayAll(); if (player.getEqualizerUI()!= null) player.getEqualizerUI().displayAll(); PlaylistItem pli = new PlaylistItem(UD.getFile(), UD.getURL(), -1, false); playlist.appendItem(pli); resetScrollBar(); repaint(); } } // John.Yang : add 02/12/2002 else if (cmd.equals("Add Dir")) { addFileWnd.setVisible(false); Frame f = new Frame(); f.setLocation(this.getBounds().x, this.getBounds().y + 10); FileSelector.setWindow(f); String fsFile = FileSelector.selectFile(FileSelector.OPEN, "*", config.getLastDir()); fsFile = FileSelector.getDirectory(); if (fsFile.endsWith(File.separator)) fsFile = fsFile.substring(0, fsFile.length() - 1); try { File dir = new File(fsFile); if (dir == null || !dir.isDirectory()) return; // we need directory! addDir(dir); } catch (Exception ex) { System.out.println(ex.getMessage()); } } else if (cmd.equals("Del File")) { subFileWnd.setVisible(false); delSelectedItems(); } else if (cmd.equals("Del All")) { subFileWnd.setVisible(false); delAllItems(); } else if (cmd.equals("Inv Sel")) selFunctions(-1); else if (cmd.equals("Sel 0")) selFunctions(0); else if (cmd.equals("Sel All")) selFunctions(1); else if (cmd.equals("Remove Item(s)")) delSelectedItems(); else if (cmd.equals("Play Item")) { int n0 = playlist.getPlaylistSize(); PlaylistItem pli = null; for (int i = n0 - 1; i >= 0; i--) { pli = playlist.getItemAt(i); if (pli.isSelected()) break; } // Play. if ( (pli != null) && (pli.getTagInfo() != null)) { player.pressStop(); player.setCurrentSong(pli); playlist.setCursor(playlist.getIndex(pli)); player.pressStart(); } } else if (cmd.equals("File Info")) { int n0 = playlist.getPlaylistSize(); PlaylistItem pli = null; for (int i = n0 - 1; i >= 0; i--) { pli = playlist.getItemAt(i); if (pli.isSelected()) break; } // Display Tag Info. if ( (pli != null) && (pli.getTagInfo() != null)) { TagInfo taginfo = pli.getTagInfo(); if (taginfo != null) { TagInfoFactory factory = TagInfoFactory.getInstance(); TagInfoDialog dialog = factory.getTagInfoDialog(taginfo); dialog.setLocation(this.getBounds().x, this.getBounds().y); dialog.show(); } } } } protected void handleMouseClick(MouseEvent evt) { if (addFileWnd != null && addFileWnd.isVisible()) addFileWnd.setVisible(false); if (subFileWnd != null && subFileWnd.isVisible()) subFileWnd.setVisible(false); if (selFileWnd != null && selFileWnd.isVisible()) selFileWnd.setVisible(false); if (optFileWnd != null && optFileWnd.isVisible()) optFileWnd.setVisible(false); int x = evt.getX(); int y = evt.getY(); if (x >= addarea[0] && x <= addarea[2] && y >= addarea[1] && y <= addarea[3]) { handleAddEvent(); return; } if (x >= addarea[0] + gapsInButtons && x <= addarea[2] + gapsInButtons && y >= addarea[1] && y <= addarea[3]) { handleSubEvent(); return; } if (x >= addarea[0] + 2 * gapsInButtons && x <= addarea[2] + 2 * gapsInButtons && y >= addarea[1] && y <= addarea[3]) { handleSelEvent(); return; } if (x >= addarea[0] + 3 * gapsInButtons && x <= addarea[2] + 3 * gapsInButtons && y >= addarea[1] && y <= addarea[3]) { handleOptEvent(); return; } // check select action if (x >= listarea[0] && x <= listarea[2] && y >= listarea[1] && y <= listarea[3]) { int index = getIndex(y); if (index != -1) { // PopUp if (evt.getModifiers() == MouseEvent.BUTTON3_MASK) { if (fipopup != null) { fipopup.show(evt.getComponent(), evt.getX(), evt.getY()); } } else { PlaylistItem pli = playlist.getItemAt(index); if (pli != null) { pli.setSelected(!pli.isSelected()); // CK 02/25/2002: add play on double-click if ( (evt.getClickCount() == 2) && (evt.getModifiers() == MouseEvent.BUTTON1_MASK)) { player.pressStop(); player.setCurrentSong(pli); playlist.setCursor(index); player.pressStart(); } } // selected [index] = (byte) (1 - selected [index]) ; } repaint(); } } } private void handleSelEvent() { if (selFileWnd == null) createSelFileWnd(); if (selFileWnd != null && selFileWnd.isVisible()) selFileWnd.setVisible(false); else { // display it Point pt = getLocation(); selFileWnd.setLocation(pt.x + addarea[0] + 2 * gapsInButtons, pt.y + (addarea[1] - (18 * 3)) + 20); // we got 3 rows each 18 high // E.B Fix : setSize for avoid narrow pack. selFileWnd.setSize(22, 18 * 3); selFileWnd.setVisible(true); } } private void handleOptEvent() { if (optFileWnd == null) createOptFileWnd(); if (optFileWnd != null && optFileWnd.isVisible()) optFileWnd.setVisible(false); else { // display it Point pt = getLocation(); optFileWnd.setLocation(pt.x + addarea[0] + 3 * gapsInButtons, pt.y + (addarea[1] - (18 * 3)) + 20); // we got 3 rows each 18 high // E.B Fix : setSize for avoid narrow pack. optFileWnd.setSize(22, 18 * 3); optFileWnd.setVisible(true); } } private void handleSubEvent() { if (subFileWnd == null) createSubFileWnd(); if (subFileWnd != null && subFileWnd.isVisible()) subFileWnd.setVisible(false); else { // display it Point pt = getLocation(); subFileWnd.setLocation(pt.x + addarea[0] + gapsInButtons, pt.y + (addarea[1] - (18 * 4)) + 20); // we got 3 rows each 18 high // E.B Fix : setSize for avoid narrow pack. subFileWnd.setSize(22, 18 * 4); subFileWnd.setVisible(true); } } private void handleAddEvent() { if (addFileWnd == null) createAddFileWnd(); if (addFileWnd != null && addFileWnd.isVisible()) addFileWnd.setVisible(false); else { // display it Point pt = getLocation(); addFileWnd.setLocation(pt.x + addarea[0], pt.y + (addarea[1] - (18 * 3)) + 20); // we got 3 rows each 18 high // E.B Fix : setSize for avoid narrow pack. addFileWnd.setSize(22, 18 * 3); addFileWnd.setVisible(true); } } private void createOptFileWnd() { //TODO //optFileWnd = new Window(this); optFileWnd = new Panel(); optFileWnd.setLayout(new GridLayout(3, 1, 0, 0)); // 3 rows ActiveComponent comp = createPLButton(154, 111); // 153 -> 154 optFileWnd.add(comp); comp = createPLButton(154, 130); optFileWnd.add(comp); comp = createPLButton(154, 149); optFileWnd.add(comp); optFileWnd.setSize(22, 18 * 3); //optFileWnd.pack(); optFileWnd.setVisible(false); } private void createSelFileWnd() { // TODO //selFileWnd = new Window(this); selFileWnd = new Panel(); selFileWnd.setLayout(new GridLayout(3, 1, 0, 0)); // 3 rows ActiveComponent comp = createPLButton(104, 111); // 103 -> 104 comp.setActionCommand("Inv Sel"); comp.addActionListener(this); selFileWnd.add(comp); comp = createPLButton(104, 130); comp.setActionCommand("Sel 0"); comp.addActionListener(this); selFileWnd.add(comp); comp = createPLButton(104, 149); comp.setActionCommand("Sel All"); comp.addActionListener(this); selFileWnd.add(comp); selFileWnd.setSize(22, 18 * 3); //selFileWnd.pack(); selFileWnd.setVisible(false); } private void createSubFileWnd() { // TODO //subFileWnd = new Window(this); subFileWnd = new Panel(); subFileWnd.setLayout(new GridLayout(4, 1, 0, 0)); // 4 rows ActiveComponent comp = createPLButton(54, 111); comp.setActionCommand("Del All"); comp.addActionListener(this); subFileWnd.add(comp); comp = createPLButton(54, 130); subFileWnd.add(comp); comp = createPLButton(54, 149); comp.setActionCommand("Del File"); comp.addActionListener(this); subFileWnd.add(comp); comp = createPLButton(54, 168); subFileWnd.add(comp); subFileWnd.setSize(22, 18 * 4); //subFileWnd.pack(); subFileWnd.setVisible(false); } private void createAddFileWnd() { //TODO //addFileWnd = new Window(this); addFileWnd = new Panel(); addFileWnd.setLayout(new GridLayout(3, 1, 0, 0)); // 3 rows // + FILE button ActiveComponent comp = createPLButton(0, 149); comp.setActionCommand("Add File"); comp.addActionListener(this); // + DIR button ActiveComponent comp1 = createPLButton(0, 130); comp1.setActionCommand("Add Dir"); comp1.addActionListener(this); // + URL button ActiveComponent comp2 = createPLButton(0, 111); comp2.setActionCommand("Add Url"); comp2.addActionListener(this); addFileWnd.add(comp2); addFileWnd.add(comp1); addFileWnd.add(comp); // E.B Fix : setSize for avoid narrow pack. addFileWnd.setSize(22, 18 * 3); //addFileWnd.pack(); addFileWnd.setVisible(false); } /** * @function: create a button in pledit window */ private ActiveComponent createPLButton(int sx, int sy) { Image normal = this.createImage(22, 18); Image clicked = this.createImage(22, 18); Graphics g = normal.getGraphics(); g.drawImage(imWinamp, 0, 0, 22, 18, sx, sy, sx + 22, sy + 18, null); sx += 23; g = clicked.getGraphics(); g.drawImage(imWinamp, 0, 0, 22, 18, sx, sy, sx + 22, sy + 18, null); ActiveComponent comp = new ActiveComponent(normal, clicked, AWTEvent.MOUSE_EVENT_MASK); return comp; } /** * @function: add all Music files under this directory to play list * @param: * @author: John Yang * @date: 02/12/2002 */ private void addDir(File fsFile) { /** * put all music file extension in a Vector */ String ext = config.getExtensions(); StringTokenizer st = new StringTokenizer(ext, ","); if (exts == null) { exts = new Vector(); while (st.hasMoreTokens()) exts.add("." + st.nextElement()); } /** * recursive */ Thread addThread = new AddThread(fsFile); addThread.start(); /** * Refresh thread */ Thread refresh = new Thread("Refresh") { public void run() { while (isSearching) { resetScrollBar(); repaint(); try { Thread.sleep(4000); } catch (Exception ex) { } } } }; refresh.start(); } class AddThread extends Thread { private File fsFile; public AddThread(File fsFile) { super("Add"); this.fsFile = fsFile; } public void run() { isSearching = true; addMusicRecursive(fsFile, 0); isSearching = false; resetScrollBar(); repaint(); } } private void addMusicRecursive(File rootDir, int depth) { if (rootDir == null || depth > MAXDEPTH) return; // we do not want waste time String[] lists = rootDir.list(); if (lists == null) return; for (int i = 0; i < lists.length; i++) { File ff = new File(rootDir + File.separator + lists[i]); if (ff.isDirectory()) addMusicRecursive(ff, depth + 1); else { if (isMusicFile(lists[i])) { //System.out.println("Add " + rootDir+File.separator+lists[i]) ; PlaylistItem pli = new PlaylistItem(lists[i], rootDir + File.separator + lists[i], -1, true); playlist.appendItem(pli); } } } } private boolean isMusicFile(String ff) { int sz = exts.size(); for (int i = 0; i < sz; i++) { String ext = exts.elementAt(i).toString().toLowerCase(); if (ext.equalsIgnoreCase(".wsz") || ext.equalsIgnoreCase(".m3u") || ext.equalsIgnoreCase(".pls")) continue; if (ff.toLowerCase().endsWith(exts.elementAt(i).toString().toLowerCase())) return true; } return false; } /** * @function: selection operation in pledit window * @param: mode: -1 --- inverse selected items * 0 --- select none * 1 --- select all */ private void selFunctions(int mode) { selFileWnd.setVisible(false); int n0 = playlist.getPlaylistSize(); if (n0 == 0) return; for (int i = 0; i < n0; i++) { PlaylistItem pli = playlist.getItemAt(i); if (pli == null) break; if (mode == -1) { // inverse selection pli.setSelected(!pli.isSelected()); } else if (mode == 0) { // select none pli.setSelected(false); } else if (mode == 1) { // select all pli.setSelected(true); } } /* if ( mode == -1 ) // inverse selection { for ( int i = 0 ; i < n0 ; i ++ ) { selected [i] = (byte) (1 - selected [i]) ; } } if ( mode == 0 ) { for ( int i = 0 ; i < n0 ; i ++ ) selected [i] = (byte) 0 ; } if ( mode == 1 ) { for ( int i = 0 ; i < n0 ; i ++ ) selected [i] = (byte) 1 ; } */ repaint(); } /** * @function: remove all items in playlist */ private void delAllItems() { int n0 = playlist.getPlaylistSize(); if (n0 == 0) return; // for ( int i = 0 ; i < n0 ; i ++ ) selected [i] = 0 ; // unset flag playlist.removeAllItems(); topIndex = 0; acScrollBar.setLocation(scrollBarX, scrollBarRange[0]); repaint(); } /** * @function: remove selected items in playlist */ private void delSelectedItems() { int n0 = playlist.getPlaylistSize(); boolean brepaint = false; for (int i = n0 - 1; i >= 0; i--) { // if ( selected [i] == 1 ) // selected item if (playlist.getItemAt(i).isSelected()) { playlist.removeItemAt(i); // selected [i] = 0 ; brepaint = true; } } if (brepaint) { int n = playlist.getPlaylistSize(); if (topIndex >= n) topIndex = n - 1; if (topIndex < 0) topIndex = 0; // reset the vertical scroll bar position resetScrollBar(); repaint(); } } /** * @function: get the item index according to the mouse y position * @date: 02/11/2002 */ protected int getIndex(int y) { int n0 = playlist.getPlaylistSize(); if (n0 == 0) return -1; for (int n = 0; n < 100; n++) { if (y >= listarea[1] + 12 - 10 + n * 12 && y < listarea[1] + 12 - 10 + n * 12 + 14) { if (topIndex + n > n0 - 1) return -1; return topIndex + n; } } return -1; } private void resetScrollBar() { int n = playlist.getPlaylistSize(); // reset the vertical scroll bar position float dx = (n < 1) ? 0 : ((float) topIndex / (n - 1)) * (scrollBarRange[1] - scrollBarRange[0]); scrollBarLocation = scrollBarRange[0] + (int) dx; acScrollBar.setLocation(scrollBarX, scrollBarLocation); } /** * Force display of all components. */ public void displayAll() { acDownScrollButton.display(); acScrollBar.display(); acUpScrollButton.display(); paintAll(getGraphics()); } }