bool CPlayerPlaylistBar::SaveMPCPlayList(CString fn, CTextFile::enc e, bool fRemovePath) { CTextFile f; if (!f.Save(fn, e)) { return false; } f.WriteString(_T("MPCPLAYLIST\n")); POSITION pos = m_pl.GetHeadPosition(), pos2; for (int i = 1; pos; i++) { CPlaylistItem& pli = m_pl.GetNext(pos); CString idx; idx.Format(_T("%d"), i); CString str; str.Format(_T("%d,type,%d"), i, pli.m_type); f.WriteString(str + _T("\n")); if (!pli.m_label.IsEmpty()) { f.WriteString(idx + _T(",label,") + pli.m_label + _T("\n")); } if (pli.m_type == CPlaylistItem::file) { pos2 = pli.m_fns.GetHeadPosition(); while (pos2) { CString fn2 = pli.m_fns.GetNext(pos2); if (fRemovePath) { CPath p(fn2); p.StripPath(); fn2 = (LPCTSTR)p; } f.WriteString(idx + _T(",filename,") + fn2 + _T("\n")); } pos2 = pli.m_subs.GetHeadPosition(); while (pos2) { CString fn2 = pli.m_subs.GetNext(pos2); if (fRemovePath) { CPath p(fn2); p.StripPath(); fn2 = (LPCTSTR)p; } f.WriteString(idx + _T(",subtitle,") + fn2 + _T("\n")); } } else if (pli.m_type == CPlaylistItem::device && pli.m_fns.GetCount() == 2) { f.WriteString(idx + _T(",video,") + pli.m_fns.GetHead() + _T("\n")); f.WriteString(idx + _T(",audio,") + pli.m_fns.GetTail() + _T("\n")); str.Format(_T("%d,vinput,%d"), i, pli.m_vinput); f.WriteString(str + _T("\n")); str.Format(_T("%d,vchannel,%d"), i, pli.m_vchannel); f.WriteString(str + _T("\n")); str.Format(_T("%d,ainput,%d"), i, pli.m_ainput); f.WriteString(str + _T("\n")); str.Format(_T("%d,country,%d"), i, pli.m_country); f.WriteString(str + _T("\n")); } } return true; }
void CPlayerPlaylistBar::OnContextMenu(CWnd* /*pWnd*/, CPoint p) { LVHITTESTINFO lvhti; lvhti.pt = p; m_list.ScreenToClient(&lvhti.pt); m_list.SubItemHitTest(&lvhti); POSITION pos = FindPos(lvhti.iItem); //bool fSelected = (pos == m_pl.GetPos()); bool fOnItem = !!(lvhti.flags & LVHT_ONITEM); CMenu m; m.CreatePopupMenu(); enum { M_OPEN = 1, M_ADD, M_REMOVE, M_CLEAR, M_CLIPBOARD, M_SAVEAS, M_SORTBYNAME, M_SORTBYPATH, M_RANDOMIZE, M_SORTBYID, M_SHUFFLE, M_HIDEFULLSCREEN }; CAppSettings& s = AfxGetAppSettings(); m.AppendMenu(MF_STRING | (!fOnItem ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_OPEN, ResStr(IDS_PLAYLIST_OPEN)); if (((CMainFrame*)AfxGetMainWnd())->GetPlaybackMode() == PM_CAPTURE) { m.AppendMenu(MF_STRING | MF_ENABLED, M_ADD, ResStr(IDS_PLAYLIST_ADD)); } m.AppendMenu(MF_STRING | (/*fSelected||*/!fOnItem ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_REMOVE, ResStr(IDS_PLAYLIST_REMOVE)); m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | (!m_pl.GetCount() ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_CLEAR, ResStr(IDS_PLAYLIST_CLEAR)); m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | (!fOnItem ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_CLIPBOARD, ResStr(IDS_PLAYLIST_COPYTOCLIPBOARD)); m.AppendMenu(MF_STRING | (!m_pl.GetCount() ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_SAVEAS, ResStr(IDS_PLAYLIST_SAVEAS)); m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | (!m_pl.GetCount() ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_SORTBYNAME, ResStr(IDS_PLAYLIST_SORTBYLABEL)); m.AppendMenu(MF_STRING | (!m_pl.GetCount() ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_SORTBYPATH, ResStr(IDS_PLAYLIST_SORTBYPATH)); m.AppendMenu(MF_STRING | (!m_pl.GetCount() ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_RANDOMIZE, ResStr(IDS_PLAYLIST_RANDOMIZE)); m.AppendMenu(MF_STRING | (!m_pl.GetCount() ? (MF_DISABLED | MF_GRAYED) : MF_ENABLED), M_SORTBYID, ResStr(IDS_PLAYLIST_RESTORE)); m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED | (s.bShufflePlaylistItems ? MF_CHECKED : MF_UNCHECKED), M_SHUFFLE, ResStr(IDS_PLAYLIST_SHUFFLE)); m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED | (s.bHidePlaylistFullScreen ? MF_CHECKED : MF_UNCHECKED), M_HIDEFULLSCREEN, ResStr(IDS_PLAYLIST_HIDEFS)); CMainFrame* pMainFrm = (CMainFrame*)AfxGetMainWnd(); int nID = (int)m.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RETURNCMD, p.x, p.y, this); switch (nID) { case M_OPEN: m_pl.SetPos(pos); m_list.Invalidate(); pMainFrm->OpenCurPlaylistItem(); break; case M_ADD: pMainFrm->AddCurDevToPlaylist(); m_pl.SetPos(m_pl.GetTailPosition()); break; case M_REMOVE: if (m_pl.RemoveAt(pos)) { pMainFrm->CloseMedia(); } m_list.DeleteItem(lvhti.iItem); SavePlaylist(); break; case M_CLEAR: if (Empty()) { pMainFrm->CloseMedia(); } break; case M_SORTBYID: m_pl.SortById(); SetupList(); SavePlaylist(); break; case M_SORTBYNAME: m_pl.SortByName(); SetupList(); SavePlaylist(); break; case M_SORTBYPATH: m_pl.SortByPath(); SetupList(); SavePlaylist(); break; case M_RANDOMIZE: m_pl.Randomize(); SetupList(); SavePlaylist(); break; case M_CLIPBOARD: if (OpenClipboard() && EmptyClipboard()) { CString str; CPlaylistItem& pli = m_pl.GetAt(pos); POSITION pos2 = pli.m_fns.GetHeadPosition(); while (pos2) { str += _T("\r\n") + pli.m_fns.GetNext(pos2); } str.Trim(); if (HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, (str.GetLength() + 1) * sizeof(TCHAR))) { if (TCHAR* cp = (TCHAR*)GlobalLock(h)) { _tcscpy_s(cp, str.GetLength() + 1, str); GlobalUnlock(h); SetClipboardData(CF_UNICODETEXT, h); } } CloseClipboard(); } break; case M_SAVEAS: { CSaveTextFileDialog fd( CTextFile::ASCII, NULL, NULL, _T("Media Player Classic playlist (*.mpcpl)|*.mpcpl|Playlist (*.pls)|*.pls|Winamp playlist (*.m3u)|*.m3u|Windows Media playlist (*.asx)|*.asx||"), this); if (fd.DoModal() != IDOK) { break; } CTextFile::enc encoding = (CTextFile::enc)fd.GetEncoding(); if (encoding == CTextFile::ASCII) { encoding = CTextFile::ANSI; } int idx = fd.m_pOFN->nFilterIndex; CPath path(fd.GetPathName()); switch (idx) { case 1: path.AddExtension(_T(".mpcpl")); break; case 2: path.AddExtension(_T(".pls")); break; case 3: path.AddExtension(_T(".m3u")); break; case 4: path.AddExtension(_T(".asx")); break; default: break; } bool fRemovePath = true; CPath p(path); p.RemoveFileSpec(); CString base = (LPCTSTR)p; pos = m_pl.GetHeadPosition(); while (pos && fRemovePath) { CPlaylistItem& pli = m_pl.GetNext(pos); if (pli.m_type != CPlaylistItem::file) { fRemovePath = false; } else { POSITION pos; pos = pli.m_fns.GetHeadPosition(); while (pos && fRemovePath) { CString fn = pli.m_fns.GetNext(pos); CPath p(fn); p.RemoveFileSpec(); if (base != (LPCTSTR)p) { fRemovePath = false; } } pos = pli.m_subs.GetHeadPosition(); while (pos && fRemovePath) { CString fn = pli.m_subs.GetNext(pos); CPath p(fn); p.RemoveFileSpec(); if (base != (LPCTSTR)p) { fRemovePath = false; } } } } if (idx == 1) { SaveMPCPlayList(path, encoding, fRemovePath); break; } CTextFile f; if (!f.Save(path, encoding)) { break; } if (idx == 2) { f.WriteString(_T("[playlist]\n")); } else if (idx == 4) { f.WriteString(_T("<ASX version = \"3.0\">\n")); } pos = m_pl.GetHeadPosition(); CString str; int i; for (i = 0; pos; i++) { CPlaylistItem& pli = m_pl.GetNext(pos); if (pli.m_type != CPlaylistItem::file) { continue; } CString fn = pli.m_fns.GetHead(); /* if (fRemovePath) { CPath p(path); p.StripPath(); fn = (LPCTSTR)p; } */ switch (idx) { case 2: str.Format(_T("File%d=%s\n"), i + 1, fn); break; case 3: str.Format(_T("%s\n"), fn); break; case 4: str.Format(_T("<Entry><Ref href = \"%s\"/></Entry>\n"), fn); break; default: break; } f.WriteString(str); } if (idx == 2) { str.Format(_T("NumberOfEntries=%d\n"), i); f.WriteString(str); f.WriteString(_T("Version=2\n")); } else if (idx == 4) { f.WriteString(_T("</ASX>\n")); } } break; case M_SHUFFLE: s.bShufflePlaylistItems = !s.bShufflePlaylistItems; break; case M_HIDEFULLSCREEN: s.bHidePlaylistFullScreen = !s.bHidePlaylistFullScreen; break; default: break; } }