summaryrefslogtreecommitdiffstats
path: root/media/tools/player_wtl/mainfrm.h
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-25 18:43:53 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-25 18:43:53 +0000
commit6e7c24ee5cd7ce88266ceae158c31c62d7498d3f (patch)
tree7fe0d691192959f1a31095aa35dc5efb147f88c8 /media/tools/player_wtl/mainfrm.h
parenta999b0e58e1ca80435c7322df5cb229b64be113f (diff)
downloadchromium_src-6e7c24ee5cd7ce88266ceae158c31c62d7498d3f.zip
chromium_src-6e7c24ee5cd7ce88266ceae158c31c62d7498d3f.tar.gz
chromium_src-6e7c24ee5cd7ce88266ceae158c31c62d7498d3f.tar.bz2
Re-organizing all tools under /src/media to be consistent with the rest of the repository.
TEST=n/a BUG=n/a Review URL: http://codereview.chromium.org/431046 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33089 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/tools/player_wtl/mainfrm.h')
-rw-r--r--media/tools/player_wtl/mainfrm.h718
1 files changed, 718 insertions, 0 deletions
diff --git a/media/tools/player_wtl/mainfrm.h b/media/tools/player_wtl/mainfrm.h
new file mode 100644
index 0000000..7379f71
--- /dev/null
+++ b/media/tools/player_wtl/mainfrm.h
@@ -0,0 +1,718 @@
+// 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_