📄 mmview.cpp
字号:
dummy->stop(); delete dummy; } // Heuristic check to see whether it's a URL: // - Contains a \, or // - second char is :, or // - contains neither : nor / bool is_local_filename = false; if (_tcschr(lpszPathName, _T('\\'))) is_local_filename = true; if (lpszPathName[0] && lpszPathName[1] == _T(':')) is_local_filename = true; if (_tcschr(lpszPathName, _T(':')) == NULL && _tcschr(lpszPathName, _T('/')) == NULL) is_local_filename = true; net::url u; TCHAR path[_MAX_PATH]; if (is_local_filename) { TCHAR *pFilePart = 0; GetFullPathName(lpszPathName, MAX_PATH, path, &pFilePart); u = net::url::from_filename(T2CA(path)); } else { _tcscpy(path, lpszPathName); u = net::url::from_url(T2CA(path)); } if (!u.is_absolute()) { lib::logger::get_logger()->error("Cannot play from non-absolute pathname: %s", lpszPathName); return; } dummy = create_player_instance(u, &s_player_feedback); m_curDocFilename = u.get_url().c_str(); player = dummy; set_status_line("Ready"); if(autostart || m_autoplay) PostMessage(WM_COMMAND, ID_FILE_PLAY);}void MmView::OnFilePlay(){ if(player) { player->play(); needs_done_redraw = true; InvalidateRect(NULL); }}void MmView::OnUpdateFilePlay(CCmdUI *pCmdUI){ pCmdUI->Enable((int)(player && player->is_play_enabled())); pCmdUI->SetCheck((int)(player && player->is_play_active()));}void MmView::OnFilePause(){ if(player) player->pause();}void MmView::OnUpdateFilePause(CCmdUI *pCmdUI){ pCmdUI->Enable((int)(player && player->is_pause_enabled())); pCmdUI->SetCheck((int)(player && player->is_pause_active()));}void MmView::OnFileStop(){ if(player) { net::url u = player->get_url(); dg_or_dx_player *dummy = player; player = 0; if(dummy) { dummy->stop(); delete dummy; } dummy = create_player_instance(u, &s_player_feedback); player = dummy; PostMessage(WM_INITMENUPOPUP,0, 0); InvalidateRect(NULL); needs_done_redraw = false; }}void MmView::OnUpdateFileStop(CCmdUI *pCmdUI){ pCmdUI->Enable((int)(player && player->is_stop_enabled())); pCmdUI->SetCheck((int)(player && player->is_stop_active()));}void MmView::OnTimer(UINT nIDEvent){ // XXXX Jack: This seems a very funny way to get a final redraw... CView::OnTimer(nIDEvent); if(player && needs_done_redraw && player->is_stop_active()) { player->on_done(); InvalidateRect(NULL); PostMessage(WM_INITMENUPOPUP,0, 0); needs_done_redraw = false; }}void MmView::OnLButtonDown(UINT nFlags, CPoint point){ if(player) player->on_click(point.x, point.y, GetSafeHwnd()); CView::OnLButtonDown(nFlags, point);}void MmView::OnMouseMove(UINT nFlags, CPoint point){ if(player) { int new_cursor_id = player->get_cursor(point.x, point.y, GetSafeHwnd()); if(new_cursor_id>0) EnableToolTips(TRUE); else CancelToolTips(); if(new_cursor_id != m_cursor_id) { HCURSOR new_cursor = 0; if(new_cursor_id == 0) { new_cursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW); } else { new_cursor = AfxGetApp()->LoadCursor(IDC_CURSOR_HAND); } SetClassLongPtr(GetSafeHwnd(), GCLP_HCURSOR, HandleToLong(new_cursor)); m_cursor_id = new_cursor_id; } } CView::OnMouseMove(nFlags, point);}void MmView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if(player) player->on_char(nChar); CView::OnChar(nChar, nRepCnt, nFlags);}void MmView::OnFocusAdvance(){ if (player) player->on_focus_advance();}void MmView::OnFocusActivate(){ if (player) player->on_focus_activate();}void MmView::OnViewSource() { USES_CONVERSION; CString cmd = TEXT("Notepad.exe "); std::string ustr = T2CA(LPCTSTR(m_curDocFilename)); net::url u = net::url::from_url(ustr); if (!u.is_local_file()) { lib::logger::get_logger()->error("View Source: only for local files..."); return; } assert(u.is_local_file()); // XXXX Also check OnUpdateViewSource cmd += u.get_file().c_str(); // XXXX Incorrect WinExec(T2CA(cmd), SW_SHOW); }void MmView::OnUpdateViewSource(CCmdUI *pCmdUI) { USES_CONVERSION; bool b = player && !m_curDocFilename.IsEmpty() && net::url::from_url(T2CA(LPCTSTR(m_curDocFilename))).is_local_file(); pCmdUI->Enable(b?TRUE:FALSE);}void MmView::OnViewLog() {#ifdef WITHOUT_LOG_WINDOW // Logging to file: open the file in notepad. TCHAR buf[_MAX_PATH]; GetModuleFileName(NULL, buf, _MAX_PATH); TCHAR *p1 = text_strrchr(buf,TCHAR('\\')); if(p1 != NULL) *p1= TCHAR('\0'); text_strcat(buf, TEXT("\\")); text_strcat(buf, log_name); CString cmd = TEXT("Notepad.exe "); cmd += buf; WinExec((LPCSTR)(LPCTSTR)cmd, SW_SHOW);#else // Logging to a window: show the window. if (m_logwindow == NULL) { m_logwindow = CLogWindow::GetLogWindowSingleton(); } m_logwindow->ShowWindow(SW_SHOW);#endif}void MmView::OnUpdateViewLog(CCmdUI *pCmdUI) { //pCmdUI->Enable((player && !m_curDocFilename.IsEmpty())?TRUE:FALSE); pCmdUI->Enable(TRUE);}LPARAM MmView::OnSetClientRect(WPARAM wParam, LPARAM lParam) { CFrameWnd *mainWnd = (CFrameWnd*) AfxGetMainWnd(); POINT pt = {0, 0}; // margins CRect rc1; mainWnd->GetWindowRect(&rc1); CRect rc2; GetWindowRect(&rc2); int dx = rc1.Width() - rc2.Width(); int dy = rc1.Height() - rc2.Height(); CSize size(int(wParam) + (2*pt.x + 4) + dx, int(lParam) + (2*pt.y+4) + dy); UINT flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE; mainWnd->SetWindowPos(&wndTop, 0, 0, size.cx, size.cy, flags); return 0;}LPARAM MmView::OnReplaceDoc(WPARAM wParam, LPARAM lParam) { USES_CONVERSION; if(lParam == 0) return 0; std::string *purlstr = (std::string *)lParam; SetMMDocument(A2CT(purlstr->c_str()), wParam?true:false); delete purlstr; return 0;}void MmView::OnOpenFilter() { USES_CONVERSION; BOOL bOpenFileDialog = TRUE; TCHAR lpszDefExt[] = TEXT("*.xml"); LPCTSTR lpszFileName = NULL; // no initial fn DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; TCHAR lpszFilter[] = TEXT("Settings Files (*.xml)|*.xml|All Files (*.*)|*.*||"); CWnd* pParentWnd = this; CFileDialog dlg(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd); dlg.m_ofn.lpstrTitle = TEXT("Select settings file"); if(!m_curDocFilename.IsEmpty()) { // XXXX Is this correct? (URL vs. filename) net::url u = net::url::from_url( T2CA((LPCTSTR) m_curDocFilename)); if(u.is_local_file()) dlg.m_ofn.lpstrInitialDir = get_directory(A2CT(u.get_file().c_str())); } if(dlg.DoModal()==IDOK) { CString str = dlg.GetPathName(); m_curFilter = str; smil2::test_attrs::load_test_attrs(lib::textptr(LPCTSTR(str)).c_str());#ifndef AM_PLAYER_DG if(player) player->restart();#endif }}void MmView::OnUpdateOpenFilter(CCmdUI *pCmdUI){ pCmdUI->Enable(TRUE);}void MmView::OnViewFilter(){ USES_CONVERSION; if(!m_curFilter.IsEmpty()) { CString cmd = TEXT("Notepad.exe "); cmd += m_curFilter; WinExec(T2CA((LPCTSTR)cmd), SW_SHOW); }}void MmView::OnUpdateViewFilter(CCmdUI *pCmdUI){ pCmdUI->Enable(!m_curFilter.IsEmpty());}void MmView::OnViewAutoplay(){ m_autoplay = !m_autoplay;}void MmView::OnUpdateViewAutoplay(CCmdUI *pCmdUI){ pCmdUI->Enable(TRUE); pCmdUI->SetCheck(m_autoplay?1:0);}BOOL MmView::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult){ if(!player) return false; TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; UINT_PTR nID = pNMHDR->idFrom; CString strTipText; if(pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) { std::string str = player->get_pointed_node_str(); strTipText.Format(_T("Anchor: %s"), str.c_str()); if(pNMHDR->code == TTN_NEEDTEXTA) strncpy(pTTTA->szText, str.c_str(), sizeof(pTTTA->szText)); else ::MultiByteToWideChar( CP_ACP , 0, str.c_str(), -1, pTTTW->szText, sizeof(pTTTW->szText) ); *pResult = 0; return TRUE; } return FALSE;}INT_PTR MmView::OnToolHitTest(CPoint point, TOOLINFO* pTI) const { if(player) { int new_cursor_id = player->get_cursor(point.x, point.y, GetSafeHwnd()); if(new_cursor_id > 0) { INT_PTR nHit = 1; // node id if (pTI != NULL) { pTI->hwnd = m_hWnd; pTI->uId = (UINT_PTR)m_hWnd; // hWndChild; pTI->uFlags |= TTF_IDISHWND; pTI->lpszText = LPSTR_TEXTCALLBACK; pTI->uFlags |= TTF_NOTBUTTON; //|TTF_CENTERTIP; } return nHit; } } return -1; // not found}bool MmView::LocateWelcomeDoc(LPCTSTR rpath) { TCHAR buf[_MAX_PATH]; GetModuleFileName(NULL, buf, _MAX_PATH); TCHAR *p1 = text_strrchr(buf,'\\'); if(p1) *++p1='\0'; text_strcat(buf, rpath); TCHAR path[_MAX_PATH]; TCHAR *pFilePart = 0; GetFullPathName(buf, MAX_PATH, path, &pFilePart); WIN32_FIND_DATA fd; memset(&fd, 0, sizeof(WIN32_FIND_DATA)); HANDLE hFind = FindFirstFile(path, &fd); if(hFind != INVALID_HANDLE_VALUE){ FindClose(hFind); m_welcomeDocFilename = path; return true; } return false;}void MmView::OnHelpWelcome(){ if(!m_welcomeDocFilename.IsEmpty()) SetMMDocument(m_welcomeDocFilename, true);}void MmView::OnUpdateHelpWelcome(CCmdUI *pCmdUI){ pCmdUI->Enable(!m_welcomeDocFilename.IsEmpty());}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -