playlistui.java

来自「java平台的图形音乐播放器」· Java 代码 · 共 883 行 · 第 1/2 页

JAVA
883
字号
        else if (cmd.equals(PlayerActionEvent.ACPLSELINV))
        {
            ui.getAcPlSelectPopup().setVisible(false);
            ui.getAcPlSelect().setVisible(true);
            selFunctions(-1);
        }
        else if (cmd.equals(PlayerActionEvent.ACPLSELZERO))
        {
            ui.getAcPlSelectPopup().setVisible(false);
            ui.getAcPlSelect().setVisible(true);
            selFunctions(0);
        }
        else if (cmd.equals(PlayerActionEvent.ACPLMISCOPTS))
        {
            ui.getAcPlMiscPopup().setVisible(false);
            ui.getAcPlMisc().setVisible(true);
            // TODO
        }
        else if (cmd.equals(PlayerActionEvent.ACPLMISCFILE))
        {
            ui.getAcPlMiscPopup().setVisible(false);
            ui.getAcPlMisc().setVisible(true);
            popupFileInfo();
        }
        else if (cmd.equals(PlayerActionEvent.ACPLMISCSORT))
        {
            ui.getAcPlMiscPopup().setVisible(false);
            ui.getAcPlMisc().setVisible(true);
            // TODO
        }
        else if (cmd.equals(PlayerActionEvent.ACPLLISTLOAD))
        {
            ui.getAcPlListPopup().setVisible(false);
            ui.getAcPlList().setVisible(true);
            File[] file = FileSelector.selectFile(player.getLoader(), FileSelector.OPEN, true, config.getExtensions(), ui.getResource("playlist.popup.list.load"), new File(config.getLastDir()));
            if (FileSelector.getInstance().getDirectory() != null) config.setLastDir(FileSelector.getInstance().getDirectory().getPath());
            if ((file != null) && (file[0] != null))
            {
                String fsFile = file[0].getName();
                if ((fsFile.toLowerCase().endsWith(ui.getResource("playlist.extension.m3u"))) || (fsFile.toLowerCase().endsWith(ui.getResource("playlist.extension.pls"))))
                {
                    if (player.loadPlaylist(config.getLastDir() + fsFile))
                    {
                        config.setPlaylistFilename(config.getLastDir() + fsFile);
                        playlist.begin();
                        playlist.setCursor(-1);
                        // TODO
                        topIndex = 0;
                    }
                    resetScrollBar();
                    repaint();
                }
            }
        }
        else if (cmd.equals(PlayerActionEvent.ACPLLISTSAVE))
        {
            ui.getAcPlListPopup().setVisible(false);
            ui.getAcPlList().setVisible(true);
            // TODO
        }
        else if (cmd.equals(PlayerActionEvent.ACPLLISTNEW))
        {
            ui.getAcPlListPopup().setVisible(false);
            ui.getAcPlList().setVisible(true);
            // TODO
        }
    }

    /**
     * Display file info.
     */
    public void popupFileInfo()
    {
        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)
        {
            TagInfo taginfo = pli.getTagInfo();
            TagInfoFactory factory = TagInfoFactory.getInstance();
            TagInfoDialog dialog = factory.getTagInfoDialog(taginfo);
            dialog.setLocation(player.getLoader().getLocation().x, player.getLoader().getLocation().y + player.getHeight());
            dialog.show();            
        }
    }

    /**
     * Selection operation in pledit window
     * @param mode -1 : inverse selected items, 0 : select none, 1 : select all 
     */
    private void selFunctions(int mode)
    {
        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);
            }
        }
        repaint();
    }

    /**
     * Remove all items in playlist.
     */
    private void delAllItems()
    {
        int n0 = playlist.getPlaylistSize();
        if (n0 == 0) return;
        playlist.removeAllItems();
        topIndex = 0;
        ui.getAcPlSlider().setValue(100);
        repaint();
    }

    /**
     * Remove selected items in playlist.
     */
    private void delSelectedItems()
    {
        int n0 = playlist.getPlaylistSize();
        boolean brepaint = false;
        for (int i = n0 - 1; i >= 0; i--)
        {
            if (playlist.getItemAt(i).isSelected())
            {
                playlist.removeItemAt(i);
                brepaint = true;
            }
        }
        if (brepaint)
        {
            int n = playlist.getPlaylistSize();
            if (topIndex >= n) topIndex = n - 1;
            if (topIndex < 0) topIndex = 0;
            resetScrollBar();
            repaint();
        }
    }

    /**
     * Add file(s) to playlist.
     * @param file
     */
    public void addFiles(File[] file)
    {
        if (file != null)
        {
            for (int i = 0; i < file.length; i++)
            {
                String fsFile = file[i].getName();
                if ((!fsFile.toLowerCase().endsWith(ui.getResource("skin.extension"))) && (!fsFile.toLowerCase().endsWith(ui.getResource("playlist.extension.m3u"))) && (!fsFile.toLowerCase().endsWith(ui.getResource("playlist.extension.pls"))))
                {
                    PlaylistItem pli = new PlaylistItem(fsFile, file[i].getAbsolutePath(), -1, true);
                    playlist.appendItem(pli);
                    resetScrollBar();
                    repaint();
                }
            }
        }
    }

    /**
     * Handle mouse clicks on playlist.
     * @param evt
     */
    protected void handleMouseClick(MouseEvent evt)
    {
        int x = evt.getX();
        int y = evt.getY();
        ui.getAcPlAddPopup().setVisible(false);
        ui.getAcPlAdd().setVisible(true);
        ui.getAcPlRemovePopup().setVisible(false);
        ui.getAcPlRemove().setVisible(true);
        ui.getAcPlSelectPopup().setVisible(false);
        ui.getAcPlSelect().setVisible(true);
        ui.getAcPlMiscPopup().setVisible(false);
        ui.getAcPlMisc().setVisible(true);
        ui.getAcPlListPopup().setVisible(false);
        ui.getAcPlList().setVisible(true);
        // Check select action
        if (ui.getPlaylistPanel().isInSelectArea(x, y))
        {
            int index = getIndex(y);
            if (index != -1)
            {
                // PopUp
                if (javax.swing.SwingUtilities.isRightMouseButton(evt))
                {
                    if (fipopup != null) fipopup.show(this, x, y);
                }
                else
                {
                    PlaylistItem pli = playlist.getItemAt(index);
                    if (pli != null)
                    {
                        pli.setSelected(!pli.isSelected());
                        if ((evt.getClickCount() == 2) && (evt.getModifiers() == MouseEvent.BUTTON1_MASK))
                        {
                            player.pressStop();
                            player.setCurrentSong(pli);
                            playlist.setCursor(index);
                            player.pressStart();
                        }
                    }
                }
                repaint();
            }
        }
    }

    /**
     * Process Drag&Drop
     * @param data
     */
    public void processDnD(Object data)
    {
        log.debug("Playlist DnD");
        // Looking for files to drop.
        if (data instanceof List)
        {
            List al = (List) data;
            if ((al != null) && (al.size() > 0))
            {
                ArrayList fileList = new ArrayList();
                ArrayList folderList = new ArrayList();
                ListIterator li = al.listIterator();
                while (li.hasNext())
                {
                    File f = (File) li.next();
                    if ((f.exists()) && (f.canRead()))
                    {
                        if (f.isFile()) fileList.add(f);
                        else if (f.isDirectory()) folderList.add(f);
                    }
                }
                addFiles(fileList);
                addDirs(folderList);
            }
        }
        else if (data instanceof String)
        {
            String files = (String) data;
            if ((files.length() > 0))
            {
                ArrayList fileList = new ArrayList();
                ArrayList folderList = new ArrayList();
                StringTokenizer st = new StringTokenizer(files, System.getProperty("line.separator"));
                // Transfer files dropped.
                while (st.hasMoreTokens())
                {
                    String path = st.nextToken();
                    if (path.startsWith("file://"))
                    {
                        path = path.substring(7, path.length());
                        if (path.endsWith("\r")) path = path.substring(0, (path.length() - 1));
                    }
                    File f = new File(path);
                    if ((f.exists()) && (f.canRead()))
                    {
                        if (f.isFile()) fileList.add(f);
                        else if (f.isDirectory()) folderList.add(f);
                    }
                }
                addFiles(fileList);
                addDirs(folderList);
            }
        }
        else
        {
            log.info("Unknown dropped objects");
        }
    }

    /**
     * Add files to playlistUI.
     * @param fileList
     */
    public void addFiles(List fileList)
    {
        if (fileList.size() > 0)
        {
            File[] file = (File[]) fileList.toArray(new File[fileList.size()]);
            addFiles(file);
        }
    }

    /**
     * Add directories to playlistUI.
     * @param folderList
     */
    public void addDirs(List folderList)
    {
        if (folderList.size() > 0)
        {
            ListIterator it = folderList.listIterator();
            while (it.hasNext())
            {
                addDir((File) it.next());
            }
        }
    }

    /**
     * Compute slider value.
     */
    private void resetScrollBar()
    {
        int n = playlist.getPlaylistSize();
        float dx = (n < 1) ? 0 : ((float) topIndex / (n - 1)) * (100);
        ui.getAcPlSlider().setValue(100 - (int) dx);
    }

    public void paintList()
    {
        if (!isVisible()) return;
        else repaint();
    }

    /* (non-Javadoc)
     * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
     */
    public void paintComponent(Graphics g)
    {
        ui.getPlaylistPanel().paintBackground(g);
        ui.getPlaylistPanel().paintList(g);
    }

    /**
     * Add all files under this directory to play list.
     * @param fsFile
     */
    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)
    {
        // We do not want waste time
        if (rootDir == null || depth > MAXDEPTH) return;
        String[] list = rootDir.list();
        if (list == null) return;
        for (int i = 0; i < list.length; i++)
        {
            File ff = new File(rootDir, list[i]);
            if (ff.isDirectory()) addMusicRecursive(ff, depth + 1);
            else
            {
                if (isMusicFile(list[i]))
                {
                    PlaylistItem pli = new PlaylistItem(list[i], rootDir + File.separator + list[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();
            // TODO : Improve
            if (ext.equalsIgnoreCase(".wsz") || ext.equalsIgnoreCase(".m3u") || ext.equalsIgnoreCase(".pls")) continue;
            if (ff.toLowerCase().endsWith(exts.elementAt(i).toString().toLowerCase())) return true;
        }
        return false;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?