| // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this |
| // source code is governed by a BSD-style license that can be found in the |
| // LICENSE file. |
| |
| #ifndef MEDIA_TOOLS_PLAYER_WTL_MAINFRM_H_ |
| #define MEDIA_TOOLS_PLAYER_WTL_MAINFRM_H_ |
| |
| #include "media/tools/player_wtl/list.h" |
| #include "media/tools/player_wtl/props.h" |
| #include "media/tools/player_wtl/seek.h" |
| #include "media/tools/player_wtl/view.h" |
| |
| const int POPUP_MENU_POSITION = 0; |
| const int FILE_MENU_POSITION = 0; |
| const int RECENT_MENU_POSITION = 6; |
| |
| const wchar_t* const g_lpcstrMRURegKey = |
| L"Software\\Google\\Video\\MediaPlayer"; |
| const wchar_t* const g_lpcstrApp = L"MediaPlayer"; |
| |
| // Interface of the CMainFrame class |
| // TODO(fbarchard): Remove hungarian notation. |
| class CMainFrame : public CFrameWindowImpl<CMainFrame>, |
| public CUpdateUI<CMainFrame>, |
| public CMessageFilter, public CIdleHandler, |
| public CPrintJobInfo { |
| public: |
| DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME) |
| |
| CCommandBarCtrl m_CmdBar; |
| CRecentDocumentList m_mru; |
| CMruList m_list; |
| WtlVideoWindow m_view; |
| |
| wchar_t m_szFilePath[MAX_PATH]; |
| bool enable_exit; |
| |
| // printing support |
| CPrinter m_printer; |
| CDevMode m_devmode; |
| CPrintPreviewWindow m_wndPreview; |
| CEnhMetaFile m_enhmetafile; |
| RECT m_rcMargin; |
| bool m_bPrintPreview; |
| |
| CMainFrame() |
| : m_bPrintPreview(false) { |
| ::SetRect(&m_rcMargin, 1000, 1000, 1000, 1000); |
| m_printer.OpenDefaultPrinter(); |
| m_devmode.CopyFromPrinter(m_printer); |
| m_szFilePath[0] = 0; |
| enable_exit = false; |
| } |
| |
| virtual BOOL PreTranslateMessage(MSG* pMsg) { |
| if (CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg)) |
| return TRUE; |
| |
| return m_view.PreTranslateMessage(pMsg); |
| } |
| |
| virtual BOOL OnIdle() { |
| BOOL bEnable = !m_view.bmp_.IsNull(); |
| BOOL bMovieOpen = media::Movie::get()->IsOpen() ? true : false; |
| |
| float current_position = media::Movie::get()->GetPosition(); |
| float duration = media::Movie::get()->GetDuration(); |
| if (enable_exit && bEnable && |
| duration > 0.0f && current_position >= duration) { |
| OnFileExit(0, 0, 0); |
| } |
| |
| UIEnable(ID_FILE_PRINT, bEnable); |
| UIEnable(ID_FILE_PRINT_PREVIEW, bEnable); |
| UISetCheck(ID_FILE_PRINT_PREVIEW, m_bPrintPreview); |
| UIEnable(ID_EDIT_COPY, bEnable); |
| UIEnable(ID_EDIT_PASTE, ::IsClipboardFormatAvailable(CF_BITMAP)); |
| UIEnable(ID_EDIT_CLEAR, bEnable); |
| UIEnable(ID_VIEW_QUARTERSIZE, true); |
| UIEnable(ID_VIEW_HALFSIZE, true); |
| UIEnable(ID_VIEW_NORMALSIZE, true); |
| UIEnable(ID_VIEW_DOUBLESIZE, true); |
| UIEnable(ID_VIEW_TRIPLESIZE, true); |
| UIEnable(ID_VIEW_QUADRUPLESIZE, true); |
| UIEnable(ID_VIEW_FITTOSCREEN, false); // Not currently implemented. |
| UIEnable(ID_VIEW_FULLSCREEN, false); // Not currently implemented. |
| UIEnable(ID_VIEW_PROPERTIES, bEnable); |
| UIEnable(ID_VIEW_ROTATE0, true); |
| UIEnable(ID_VIEW_ROTATE90, true); |
| UIEnable(ID_VIEW_ROTATE180, true); |
| UIEnable(ID_VIEW_ROTATE270, true); |
| UIEnable(ID_VIEW_MIRROR_HORIZONTAL, true); |
| UIEnable(ID_VIEW_MIRROR_VERTICAL, true); |
| UIEnable(ID_PLAY_PLAY_PAUSE, bMovieOpen); // If no movie open. |
| UIEnable(ID_PLAY_STEP_FORWARD, bMovieOpen); |
| UIEnable(ID_PLAY_STEP_BACKWARD, bMovieOpen); |
| UIEnable(ID_PLAY_GOTO_START, bMovieOpen); |
| UIEnable(ID_PLAY_GOTO_END, bMovieOpen); |
| UIEnable(ID_PLAY_GOTO_FRAME, false); // Not working yet. |
| UIEnable(ID_PLAY_HALFSPEED, true); |
| UIEnable(ID_PLAY_NORMALSPEED, true); |
| UIEnable(ID_PLAY_DOUBLESPEED, true); |
| UIEnable(ID_PLAY_TRIPLESPEED, true); |
| UIEnable(ID_PLAY_QUADRUPLESPEED, true); |
| UIEnable(ID_PLAY_EIGHTSPEED, true); |
| UIEnable(ID_PLAY_SIXTEENSPEED, true); |
| UIEnable(ID_OPTIONS_EXIT, true); // Not currently implemented. |
| UIEnable(ID_OPTIONS_DRAW, true); |
| UIEnable(ID_OPTIONS_AUDIO, !bMovieOpen); // Disable while playing. |
| UIEnable(ID_OPTIONS_DUMPYUVFILE, true); |
| |
| UISetCheck(ID_RECENT_BTN, m_list.IsWindowVisible()); |
| UIUpdateToolBar(); |
| |
| return FALSE; |
| } |
| |
| void TogglePrintPreview() { |
| if (m_bPrintPreview) { // Close it. |
| ATLASSERT(m_hWndClient == m_wndPreview.m_hWnd); |
| |
| m_hWndClient = m_view; |
| m_view.ShowWindow(SW_SHOW); |
| m_wndPreview.DestroyWindow(); |
| } else { // display it |
| ATLASSERT(m_hWndClient == m_view.m_hWnd); |
| |
| m_wndPreview.SetPrintPreviewInfo(m_printer, m_devmode.m_pDevMode, |
| this, 0, 0); |
| m_wndPreview.SetPage(0); |
| |
| m_wndPreview.Create(m_hWnd, rcDefault, NULL, 0, WS_EX_CLIENTEDGE); |
| m_view.ShowWindow(SW_HIDE); |
| m_hWndClient = m_wndPreview; |
| } |
| |
| m_bPrintPreview = !m_bPrintPreview; |
| UpdateLayout(); |
| } |
| |
| void UpdateTitleBar(const wchar_t* lpstrTitle) { |
| CString strDefault; |
| strDefault.LoadString(IDR_MAINFRAME); |
| CString strTitle = strDefault; |
| if (lpstrTitle != NULL) { |
| strTitle = lpstrTitle; |
| strTitle += L" - "; |
| strTitle += strDefault; |
| } |
| SetWindowText(strTitle); |
| } |
| |
| // Print job info callbacks. |
| virtual bool IsValidPage(UINT nPage) { |
| return (nPage == 0); // We have only one page. |
| } |
| |
| virtual bool PrintPage(UINT nPage, HDC hDC) { |
| if (nPage >= 1) // We have only one page. |
| return false; |
| |
| if (m_view.bmp_.IsNull()) // We do not have an image. |
| return false; |
| |
| RECT rcPage = |
| { 0, 0, |
| ::GetDeviceCaps(hDC, PHYSICALWIDTH) - 2 * |
| ::GetDeviceCaps(hDC, PHYSICALOFFSETX), |
| ::GetDeviceCaps(hDC, PHYSICALHEIGHT) - 2 * |
| ::GetDeviceCaps(hDC, PHYSICALOFFSETY) }; |
| |
| CDCHandle dc = hDC; |
| CClientDC dcScreen(m_hWnd); |
| CDC dcMem; |
| dcMem.CreateCompatibleDC(dcScreen); |
| HBITMAP hBmpOld = dcMem.SelectBitmap(m_view.bmp_); |
| int cx = m_view.size_.cx; |
| int cy = m_view.size_.cy; |
| |
| // Calc scaling factor, so that bitmap is not too small |
| // based on the width only, max 3/4 width. |
| int nScale = ::MulDiv(rcPage.right, 3, 4) / cx; |
| if (nScale == 0) // too big already |
| nScale = 1; |
| // Calc margines to center bitmap. |
| int xOff = (rcPage.right - nScale * cx) / 2; |
| if (xOff < 0) |
| xOff = 0; |
| int yOff = (rcPage.bottom - nScale * cy) / 2; |
| if (yOff < 0) |
| yOff = 0; |
| // Ensure that preview doesn't go outside of the page. |
| int cxBlt = nScale * cx; |
| if (xOff + cxBlt > rcPage.right) |
| cxBlt = rcPage.right - xOff; |
| int cyBlt = nScale * cy; |
| if (yOff + cyBlt > rcPage.bottom) |
| cyBlt = rcPage.bottom - yOff; |
| |
| // Now paint bitmap. |
| dc.StretchBlt(xOff, yOff, cxBlt, cyBlt, dcMem, 0, 0, cx, cy, SRCCOPY); |
| |
| dcMem.SelectBitmap(hBmpOld); |
| |
| return true; |
| } |
| |
| BEGIN_MSG_MAP_EX(CMainFrame) |
| MSG_WM_CREATE(OnCreate) |
| MSG_WM_CONTEXTMENU(OnContextMenu) |
| |
| COMMAND_ID_HANDLER_EX(ID_FILE_OPEN, OnFileOpen) |
| COMMAND_ID_HANDLER_EX(ID_FILE_LAST, OnFileLast) |
| COMMAND_RANGE_HANDLER_EX(ID_FILE_MRU_FIRST, ID_FILE_MRU_LAST, OnFileRecent) |
| COMMAND_ID_HANDLER_EX(ID_RECENT_BTN, OnRecentButton) |
| COMMAND_ID_HANDLER_EX(ID_FILE_PRINT, OnFilePrint); |
| COMMAND_ID_HANDLER_EX(ID_FILE_PAGE_SETUP, OnFilePageSetup) |
| COMMAND_ID_HANDLER_EX(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview); |
| COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnFileExit) |
| COMMAND_ID_HANDLER_EX(ID_EDIT_COPY, OnEditCopy) |
| COMMAND_ID_HANDLER_EX(ID_EDIT_PASTE, OnEditPaste) |
| COMMAND_ID_HANDLER_EX(ID_EDIT_CLEAR, OnEditClear) |
| COMMAND_RANGE_HANDLER_EX(ID_VIEW_QUARTERSIZE, ID_VIEW_FULLSCREEN, |
| OnViewSize) |
| COMMAND_ID_HANDLER_EX(ID_VIEW_TOOLBAR, OnViewToolBar) |
| COMMAND_ID_HANDLER_EX(ID_VIEW_STATUS_BAR, OnViewStatusBar) |
| COMMAND_RANGE_HANDLER_EX(ID_VIEW_ROTATE0, ID_VIEW_MIRROR_VERTICAL, |
| OnViewRotate) |
| COMMAND_ID_HANDLER_EX(ID_VIEW_PROPERTIES, OnViewProperties) |
| COMMAND_ID_HANDLER_EX(ID_PLAY_PLAY_PAUSE, OnPlayPlayPause) |
| COMMAND_ID_HANDLER_EX(ID_PLAY_STEP_FORWARD, OnPlayStepForward) |
| COMMAND_ID_HANDLER_EX(ID_PLAY_STEP_BACKWARD, OnPlayStepBackward) |
| COMMAND_ID_HANDLER_EX(ID_PLAY_GOTO_START, OnPlayGotoStart) |
| COMMAND_ID_HANDLER_EX(ID_PLAY_GOTO_END, OnPlayGotoEnd) |
| COMMAND_ID_HANDLER_EX(ID_PLAY_GOTO_FRAME, OnPlayGotoFrame) |
| COMMAND_RANGE_HANDLER_EX(ID_PLAY_HALFSPEED, ID_PLAY_SIXTEENSPEED, |
| OnPlaySpeed) |
| COMMAND_ID_HANDLER_EX(ID_APP_ABOUT, OnAppAbout) |
| COMMAND_ID_HANDLER_EX(ID_OPTIONS_EXIT, OnOptionsExit) |
| COMMAND_ID_HANDLER_EX(ID_OPTIONS_DRAW, OnOptionsDraw) |
| COMMAND_ID_HANDLER_EX(ID_OPTIONS_AUDIO, OnOptionsAudio) |
| COMMAND_ID_HANDLER_EX(ID_OPTIONS_DUMPYUVFILE, OnOptionsDumpYUVFile) |
| |
| CHAIN_MSG_MAP(CUpdateUI<CMainFrame>) |
| CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>) |
| END_MSG_MAP() |
| |
| BEGIN_UPDATE_UI_MAP(CMainFrame) |
| UPDATE_ELEMENT(ID_FILE_PRINT, UPDUI_MENUPOPUP | UPDUI_TOOLBAR) |
| UPDATE_ELEMENT(ID_FILE_PRINT_PREVIEW, UPDUI_MENUPOPUP | UPDUI_TOOLBAR) |
| UPDATE_ELEMENT(ID_EDIT_COPY, UPDUI_MENUPOPUP | UPDUI_TOOLBAR) |
| UPDATE_ELEMENT(ID_EDIT_PASTE, UPDUI_MENUPOPUP | UPDUI_TOOLBAR) |
| UPDATE_ELEMENT(ID_EDIT_CLEAR, UPDUI_MENUPOPUP | UPDUI_TOOLBAR) |
| UPDATE_ELEMENT(ID_VIEW_QUARTERSIZE, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_HALFSIZE, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_NORMALSIZE, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_DOUBLESIZE, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_TRIPLESIZE, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_QUADRUPLESIZE, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_FITTOSCREEN, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_FULLSCREEN, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_ROTATE0, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_ROTATE90, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_ROTATE180, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_ROTATE270, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_MIRROR_HORIZONTAL, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_MIRROR_VERTICAL, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_VIEW_PROPERTIES, UPDUI_MENUPOPUP | UPDUI_TOOLBAR) |
| UPDATE_ELEMENT(ID_PLAY_PLAY_PAUSE, UPDUI_MENUPOPUP | UPDUI_TOOLBAR) |
| UPDATE_ELEMENT(ID_PLAY_STEP_FORWARD, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_STEP_BACKWARD, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_GOTO_START, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_GOTO_END, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_GOTO_FRAME, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_HALFSPEED, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_NORMALSPEED, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_DOUBLESPEED, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_TRIPLESPEED, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_QUADRUPLESPEED, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_EIGHTSPEED, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_PLAY_SIXTEENSPEED, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_OPTIONS_EXIT, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_OPTIONS_DRAW, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_OPTIONS_AUDIO, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_OPTIONS_DUMPYUVFILE, UPDUI_MENUPOPUP) |
| UPDATE_ELEMENT(ID_RECENT_BTN, UPDUI_TOOLBAR) |
| END_UPDATE_UI_MAP() |
| |
| void UpdateSizeUICheck() { |
| int view_size = m_view.GetViewSize(); |
| UISetCheck(ID_VIEW_QUARTERSIZE, (view_size == 0)); |
| UISetCheck(ID_VIEW_HALFSIZE, (view_size == 1)); |
| UISetCheck(ID_VIEW_NORMALSIZE, (view_size == 2)); |
| UISetCheck(ID_VIEW_DOUBLESIZE, (view_size == 3)); |
| UISetCheck(ID_VIEW_TRIPLESIZE, (view_size == 4)); |
| UISetCheck(ID_VIEW_QUADRUPLESIZE, (view_size == 5)); |
| UISetCheck(ID_VIEW_FITTOSCREEN, (view_size == 6)); |
| UISetCheck(ID_VIEW_FULLSCREEN, (view_size == 7)); |
| } |
| |
| void UpdateSpeedUICheck() { |
| if (media::Movie::get()) { |
| float play_rate = media::Movie::get()->GetPlayRate(); |
| UISetCheck(ID_PLAY_HALFSPEED, (play_rate == 0.5f)); |
| UISetCheck(ID_PLAY_NORMALSPEED, (play_rate == 1.0f)); |
| UISetCheck(ID_PLAY_DOUBLESPEED, (play_rate == 2.0f)); |
| UISetCheck(ID_PLAY_TRIPLESPEED, (play_rate == 3.0f)); |
| UISetCheck(ID_PLAY_QUADRUPLESPEED, (play_rate == 4.0f)); |
| UISetCheck(ID_PLAY_EIGHTSPEED, (play_rate == 8.0f)); |
| UISetCheck(ID_PLAY_SIXTEENSPEED, (play_rate == 16.0f)); |
| } |
| } |
| |
| void UpdateRotateUICheck() { |
| int view_rotate = m_view.GetViewRotate(); |
| UISetCheck(ID_VIEW_ROTATE0, (view_rotate == 0)); |
| UISetCheck(ID_VIEW_ROTATE90, (view_rotate == 1)); |
| UISetCheck(ID_VIEW_ROTATE180, (view_rotate == 2)); |
| UISetCheck(ID_VIEW_ROTATE270, (view_rotate == 3)); |
| UISetCheck(ID_VIEW_MIRROR_HORIZONTAL, (view_rotate == 4)); |
| UISetCheck(ID_VIEW_MIRROR_VERTICAL, (view_rotate == 5)); |
| } |
| |
| int OnCreate(LPCREATESTRUCT /*lpCreateStruct*/) { |
| // create command bar window |
| HWND hWndCmdBar = m_CmdBar.Create(m_hWnd, rcDefault, NULL, |
| ATL_SIMPLE_CMDBAR_PANE_STYLE); |
| // atach menu |
| m_CmdBar.AttachMenu(GetMenu()); |
| // load command bar images |
| m_CmdBar.LoadImages(IDR_MAINFRAME); |
| // remove old menu |
| SetMenu(NULL); |
| |
| // create toolbar and rebar |
| HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd, IDR_MAINFRAME, |
| FALSE, |
| ATL_SIMPLE_TOOLBAR_PANE_STYLE); |
| |
| CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE); |
| AddSimpleReBarBand(hWndCmdBar); |
| AddSimpleReBarBand(hWndToolBar, NULL, TRUE); |
| |
| // create status bar |
| CreateSimpleStatusBar(); |
| |
| // create view window |
| m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL, |
| WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | |
| WS_CLIPCHILDREN, WS_EX_CLIENTEDGE); |
| |
| // set up MRU stuff |
| CMenuHandle menu = m_CmdBar.GetMenu(); |
| CMenuHandle menuFile = menu.GetSubMenu(FILE_MENU_POSITION); |
| CMenuHandle menuMru = menuFile.GetSubMenu(RECENT_MENU_POSITION); |
| m_mru.SetMenuHandle(menuMru); |
| m_mru.SetMaxEntries(12); |
| |
| m_mru.ReadFromRegistry(g_lpcstrMRURegKey); |
| |
| // create MRU list |
| m_list.Create(m_hWnd); |
| |
| // set up update UI |
| UIAddToolBar(hWndToolBar); |
| UISetCheck(ID_VIEW_NORMALSIZE, 1); |
| UISetCheck(ID_PLAY_NORMALSPEED, 1); |
| UISetCheck(ID_VIEW_TOOLBAR, 1); |
| UISetCheck(ID_VIEW_STATUS_BAR, 1); |
| UISetCheck(ID_VIEW_ROTATE0, 1); |
| UISetCheck(ID_OPTIONS_EXIT, 0); |
| UISetCheck(ID_OPTIONS_DRAW, 1); |
| UISetCheck(ID_OPTIONS_AUDIO, 1); |
| UpdateSizeUICheck(); |
| UpdateSpeedUICheck(); |
| |
| CMessageLoop* pLoop = g_module.GetMessageLoop(); |
| ATLASSERT(pLoop != NULL); |
| pLoop->AddMessageFilter(this); |
| pLoop->AddIdleHandler(this); |
| |
| return 0; |
| } |
| |
| void OnContextMenu(CWindow wnd, POINT point) { |
| if (wnd.m_hWnd == m_view.m_hWnd) { |
| CMenu menu; |
| menu.LoadMenu(IDR_CONTEXTMENU); |
| CMenuHandle menuPopup = menu.GetSubMenu(POPUP_MENU_POSITION); |
| m_CmdBar.TrackPopupMenu(menuPopup, TPM_RIGHTBUTTON | TPM_VERTICAL, |
| point.x, point.y); |
| } else { |
| SetMsgHandled(FALSE); |
| } |
| } |
| |
| void OnFileExit(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| PostMessage(WM_CLOSE); |
| } |
| |
| bool IsMovie(const wchar_t* file_name) { |
| if (_tcsstr(file_name, L".bmp")) |
| return false; |
| return true; |
| } |
| |
| bool MovieOpenFile(const wchar_t* file_name) { |
| bool success = false; |
| |
| if (m_bPrintPreview) |
| TogglePrintPreview(); |
| |
| // If a movie is open, close it. |
| media::Movie::get()->Close(); |
| |
| if (IsMovie(file_name)) { |
| success = media::Movie::get()->Open(file_name, m_view.renderer_); |
| } else { |
| HBITMAP hbmp = NULL; |
| hbmp = (HBITMAP)::LoadImage(NULL, file_name, IMAGE_BITMAP, 0, 0, |
| LR_CREATEDIBSECTION | LR_DEFAULTCOLOR | |
| LR_LOADFROMFILE); |
| if (hbmp) { |
| m_view.SetBitmap(hbmp); |
| success = true; |
| } |
| } |
| |
| if (success) { |
| m_mru.AddToList(file_name); |
| m_mru.WriteToRegistry(g_lpcstrMRURegKey); |
| UpdateTitleBar(file_name); |
| // TODO(fbarchard): Move name into view class. |
| lstrcpy(m_szFilePath, file_name); |
| } else { |
| CString strMsg = L"Can't open movie from:\n"; |
| strMsg += file_name; |
| ::MessageBeep(MB_ICONERROR); |
| MessageBox(strMsg, g_lpcstrApp, MB_OK | MB_ICONERROR); |
| } |
| return success; |
| } |
| |
| void OnFileOpen(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| CFileDialog dlg(TRUE, L"bmp", NULL, |
| OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, |
| L"Movie Files (*.mp4;*.ogg;*.ogv)\0" |
| L"*.mp4;*.ogg;*.ogv\0" |
| L"Audio Files (*.mp3;*.m4a)\0*.mp3;*.m4a\0All Files (*.*)\0*.*\0", |
| m_hWnd); |
| if (dlg.DoModal() == IDOK) { |
| MovieOpenFile(dlg.m_szFileName); |
| } |
| } |
| |
| void OnFileRecent(UINT /*uNotifyCode*/, int nID, CWindow /*wnd*/) { |
| // Get file name from the MRU list |
| wchar_t file_name[MAX_PATH]; |
| if (m_mru.GetFromList(nID, file_name, MAX_PATH)) { |
| MovieOpenFile(file_name); |
| } |
| } |
| |
| void OnFileLast(UINT uNotifyCode, int /*nID*/, CWindow wnd) { |
| OnFileRecent(uNotifyCode, ID_FILE_MRU_FIRST, wnd); |
| } |
| |
| void OnRecentButton(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| UINT uBandID = ATL_IDW_BAND_FIRST + 1; // toolbar is second added band |
| CReBarCtrl rebar = m_hWndToolBar; |
| int nBandIndex = rebar.IdToIndex(uBandID); |
| REBARBANDINFO rbbi = { 0 }; |
| rbbi.cbSize = RunTimeHelper::SizeOf_REBARBANDINFO(); |
| rbbi.fMask = RBBIM_CHILD; |
| rebar.GetBandInfo(nBandIndex, &rbbi); |
| CToolBarCtrl wndToolBar = rbbi.hwndChild; |
| |
| int nIndex = wndToolBar.CommandToIndex(ID_RECENT_BTN); |
| CRect rect; |
| wndToolBar.GetItemRect(nIndex, rect); |
| wndToolBar.ClientToScreen(rect); |
| |
| // Build and display MRU list in a popup |
| m_list.BuildList(m_mru); |
| m_list.ShowList(rect.left, rect.bottom); |
| } |
| |
| void OnFilePrint(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| CPrintDialog dlg(FALSE); |
| dlg.m_pd.hDevMode = m_devmode.CopyToHDEVMODE(); |
| dlg.m_pd.hDevNames = m_printer.CopyToHDEVNAMES(); |
| dlg.m_pd.nMinPage = 1; |
| dlg.m_pd.nMaxPage = 1; |
| |
| if (dlg.DoModal() == IDOK) { |
| m_devmode.CopyFromHDEVMODE(dlg.m_pd.hDevMode); |
| m_printer.ClosePrinter(); |
| m_printer.OpenPrinter(dlg.m_pd.hDevNames, m_devmode.m_pDevMode); |
| |
| CPrintJob job; |
| job.StartPrintJob(false, m_printer, m_devmode.m_pDevMode, this, |
| L"MediaPlayer Document", 0, 0, |
| (dlg.PrintToFile() != FALSE)); |
| } |
| |
| ::GlobalFree(dlg.m_pd.hDevMode); |
| ::GlobalFree(dlg.m_pd.hDevNames); |
| } |
| |
| void OnFilePageSetup(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| CPageSetupDialog dlg; |
| dlg.m_psd.hDevMode = m_devmode.CopyToHDEVMODE(); |
| dlg.m_psd.hDevNames = m_printer.CopyToHDEVNAMES(); |
| dlg.m_psd.rtMargin = m_rcMargin; |
| |
| if (dlg.DoModal() == IDOK) { |
| if (m_bPrintPreview) |
| TogglePrintPreview(); |
| |
| m_devmode.CopyFromHDEVMODE(dlg.m_psd.hDevMode); |
| m_printer.ClosePrinter(); |
| m_printer.OpenPrinter(dlg.m_psd.hDevNames, m_devmode.m_pDevMode); |
| m_rcMargin = dlg.m_psd.rtMargin; |
| } |
| |
| ::GlobalFree(dlg.m_psd.hDevMode); |
| ::GlobalFree(dlg.m_psd.hDevNames); |
| } |
| |
| void OnFilePrintPreview(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| TogglePrintPreview(); |
| } |
| |
| void OnEditCopy(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| if (::OpenClipboard(NULL)) { |
| HBITMAP hBitmapCopy = (HBITMAP)::CopyImage(m_view.bmp_.m_hBitmap, |
| IMAGE_BITMAP, 0, 0, 0); |
| if (hBitmapCopy != NULL) |
| ::SetClipboardData(CF_BITMAP, hBitmapCopy); |
| else |
| MessageBox(L"Can't copy frame", g_lpcstrApp, MB_OK | MB_ICONERROR); |
| |
| ::CloseClipboard(); |
| } else { |
| MessageBox(L"Can't open clipboard to copy", |
| g_lpcstrApp, MB_OK | MB_ICONERROR); |
| } |
| } |
| |
| void OnEditPaste(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| if (m_bPrintPreview) |
| TogglePrintPreview(); |
| |
| if (::OpenClipboard(NULL)) { |
| HBITMAP hBitmap = (HBITMAP)::GetClipboardData(CF_BITMAP); |
| ::CloseClipboard(); |
| if (hBitmap != NULL) { |
| HBITMAP hBitmapCopy = (HBITMAP)::CopyImage(hBitmap, IMAGE_BITMAP, |
| 0, 0, 0); |
| if (hBitmapCopy != NULL) { |
| m_view.SetBitmap(hBitmapCopy); |
| UpdateTitleBar(L"(Clipboard)"); |
| m_szFilePath[0] = 0; |
| } else { |
| MessageBox(L"Can't paste frame", |
| g_lpcstrApp, MB_OK | MB_ICONERROR); |
| } |
| } else { |
| MessageBox(L"Can't open frame from the clipboard", |
| g_lpcstrApp, MB_OK | MB_ICONERROR); |
| } |
| } else { |
| MessageBox(L"Can't open clipboard to paste", |
| g_lpcstrApp, MB_OK | MB_ICONERROR); |
| } |
| } |
| |
| void OnEditClear(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| if (m_bPrintPreview) |
| TogglePrintPreview(); |
| |
| media::Movie::get()->Close(); |
| m_view.Reset(); |
| UpdateTitleBar(NULL); |
| m_szFilePath[0] = 0; |
| } |
| |
| void OnViewSize(UINT /*uNotifyCode*/, int nID, CWindow /*wnd*/) { |
| m_view.SetViewSize(nID - ID_VIEW_QUARTERSIZE); |
| UpdateSizeUICheck(); |
| UpdateLayout(); |
| } |
| |
| void OnViewRotate(UINT /*uNotifyCode*/, int nID, CWindow /*wnd*/) { |
| m_view.SetViewRotate(nID - ID_VIEW_ROTATE0); |
| UpdateRotateUICheck(); |
| UpdateLayout(); |
| } |
| |
| void OnViewToolBar(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| static BOOL bNew = TRUE; // initially visible |
| bNew = !bNew; |
| UINT uBandID = ATL_IDW_BAND_FIRST + 1; // toolbar is second added band |
| CReBarCtrl rebar = m_hWndToolBar; |
| int nBandIndex = rebar.IdToIndex(uBandID); |
| rebar.ShowBand(nBandIndex, bNew); |
| UISetCheck(ID_VIEW_TOOLBAR, bNew); |
| UpdateLayout(); |
| } |
| |
| void OnViewStatusBar(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| BOOL bNew = !::IsWindowVisible(m_hWndStatusBar); |
| ::ShowWindow(m_hWndStatusBar, bNew ? SW_SHOWNOACTIVATE : SW_HIDE); |
| UISetCheck(ID_VIEW_STATUS_BAR, bNew); |
| UpdateLayout(); |
| } |
| |
| void OnViewProperties(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| CBmpProperties prop; |
| if (lstrlen(m_szFilePath) > 0) // we have a file name |
| prop.SetFileInfo(m_szFilePath, NULL); |
| else // must be clipboard then |
| prop.SetFileInfo(NULL, m_view.bmp_.m_hBitmap); |
| prop.DoModal(); |
| } |
| |
| void OnPlayPlayPause(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| bool paused = !media::Movie::get()->GetPause(); |
| media::Movie::get()->SetPause(paused); |
| } |
| |
| void OnPlayStepForward(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| float current_position = media::Movie::get()->GetPosition(); |
| media::Movie::get()->SetPosition(current_position + 10.0f); |
| } |
| |
| void OnPlayStepBackward(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| float current_position = media::Movie::get()->GetPosition(); |
| media::Movie::get()->SetPosition(current_position - 10.0f); |
| } |
| |
| void OnPlayGotoStart(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| media::Movie::get()->SetPosition(0.0); |
| } |
| |
| void OnPlayGotoEnd(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| float current_position = media::Movie::get()->GetDuration(); |
| media::Movie::get()->SetPosition(current_position - 30.0f); |
| } |
| |
| void SetPlayRate(int play_speed) { |
| if (play_speed == 0) { |
| media::Movie::get()->Play(0.5f); |
| } else if (play_speed == 2) { |
| media::Movie::get()->Play(2.0f); |
| } else if (play_speed == 3) { |
| media::Movie::get()->Play(3.0f); |
| } else if (play_speed == 4) { |
| media::Movie::get()->Play(4.0f); |
| } else if (play_speed == 5) { |
| media::Movie::get()->Play(8.0f); |
| } else if (play_speed == 6) { |
| media::Movie::get()->Play(16.0f); |
| } else { |
| media::Movie::get()->Play(1.0f); |
| } |
| } |
| |
| void OnPlaySpeed(UINT /*uNotifyCode*/, int nID, CWindow /*wnd*/) { |
| int play_speed = nID - ID_PLAY_HALFSPEED; |
| SetPlayRate(play_speed); |
| UpdateSpeedUICheck(); |
| UpdateLayout(); |
| } |
| |
| void OnOptionsExit(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| // TODO(fbarchard): Implement when pipeline exposes properties. |
| enable_exit = !enable_exit; |
| UISetCheck(ID_OPTIONS_EXIT, enable_exit); |
| UpdateLayout(); |
| } |
| |
| void OnOptionsDraw(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| bool enable_draw = !media::Movie::get()->GetDrawEnable(); |
| media::Movie::get()->SetDrawEnable(enable_draw); |
| UISetCheck(ID_OPTIONS_DRAW, enable_draw); |
| UpdateLayout(); |
| } |
| |
| void OnOptionsAudio(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| bool enable_audio = !media::Movie::get()->GetAudioEnable(); |
| media::Movie::get()->SetAudioEnable(enable_audio); |
| UISetCheck(ID_OPTIONS_AUDIO, enable_audio); |
| UpdateLayout(); |
| } |
| |
| void OnOptionsDumpYUVFile(UINT /*uNotify*/, int /*nID*/, CWindow /*wnd*/) { |
| bool enable_dump_yuv_file = !media::Movie::get()->GetDumpYuvFileEnable(); |
| media::Movie::get()->SetDumpYuvFileEnable(enable_dump_yuv_file); |
| UISetCheck(ID_OPTIONS_DUMPYUVFILE, enable_dump_yuv_file); |
| UpdateLayout(); |
| } |
| |
| void OnAppAbout(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| CSimpleDialog<IDD_ABOUTBOX> dlg; |
| dlg.DoModal(); |
| } |
| |
| |
| void OnPlayGotoFrame(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/) { |
| CSeek seek; |
| seek.DoModal(); |
| } |
| }; |
| |
| #endif // MEDIA_TOOLS_PLAYER_WTL_MAINFRM_H_ |