blob: 65224e5431ac2d3b4fb202a3dec6b163af5997b9 [file] [log] [blame]
// 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_PROPS_H_
#define MEDIA_TOOLS_PLAYER_WTL_PROPS_H_
#include "media/tools/player_wtl/movie.h"
#include "resource.h"
// Movie properties dialog
class CFileName : public CWindowImpl<CFileName> {
public:
CFileName() : file_name_(NULL) {
}
void Init(HWND hwnd, wchar_t* str_name) {
ATLASSERT(::IsWindow(hwnd));
SubclassWindow(hwnd);
// Set tooltip.
tooltip_.Create(m_hWnd);
ATLASSERT(tooltip_.IsWindow());
RECT rect;
GetClientRect(&rect);
CToolInfo ti(0, m_hWnd, tooltip_id_, &rect, NULL);
tooltip_.AddTool(&ti);
// Set text.
file_name_ = str_name;
if (file_name_ == NULL)
return;
CClientDC dc(m_hWnd); // will not really paint
HFONT old_font = dc.SelectFont(AtlGetDefaultGuiFont());
RECT rect_text = rect;
dc.DrawText(file_name_, -1, &rect_text,
DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX |
DT_CALCRECT);
BOOL is_too_long = (rect_text.right > rect.right);
if (is_too_long)
tooltip_.UpdateTipText(file_name_, m_hWnd, tooltip_id_);
tooltip_.Activate(is_too_long);
dc.SelectFont(old_font);
Invalidate();
UpdateWindow();
}
BEGIN_MSG_MAP(CFileName)
MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnMouseMessage(UINT message, WPARAM wparam, LPARAM lparam,
BOOL& handled) {
if (tooltip_.IsWindow()) {
MSG msg = { m_hWnd, message, wparam, lparam };
tooltip_.RelayEvent(&msg);
}
handled = FALSE;
return 1;
}
LRESULT OnPaint(UINT /*message*/, WPARAM /*wparam*/, LPARAM /*lparam*/,
BOOL& /*handled*/) {
CPaintDC dc(m_hWnd);
if (file_name_ != NULL) {
RECT rect;
GetClientRect(&rect);
dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
dc.SetBkMode(TRANSPARENT);
HFONT old_font = dc.SelectFont(AtlGetDefaultGuiFont());
dc.DrawText(file_name_, -1, &rect, DT_SINGLELINE | DT_LEFT |
DT_VCENTER | DT_NOPREFIX | DT_PATH_ELLIPSIS);
dc.SelectFont(old_font);
}
return 0;
}
DECLARE_WND_CLASS_EX(NULL, 0, COLOR_3DFACE)
wchar_t* file_name_;
enum { tooltip_id_ = 1313 };
CToolTipCtrl tooltip_;
};
// Movie properties.
// TODO(fbarchard): Add movie duration in seconds.
class CPageOne : public CPropertyPageImpl<CPageOne> {
public:
enum { IDD = IDD_PROP_PAGE1 };
CPageOne() : file_name_(NULL) {
}
BEGIN_MSG_MAP(CPageOne)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
CHAIN_MSG_MAP(CPropertyPageImpl<CPageOne>)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*message*/, WPARAM /*wparam*/, LPARAM /*lparam*/,
BOOL& /*handled*/) {
if (file_name_ != NULL) {
file_location_.Init(GetDlgItem(IDC_FILELOCATION), file_name_);
WIN32_FIND_DATA find_data;
HANDLE find_handle = ::FindFirstFile(file_name_, &find_data);
if (find_handle != INVALID_HANDLE_VALUE) {
// TODO(fbarchard): Support files larger than 2 GB
int size_k = (find_data.nFileSizeLow / 1024);
if (size_k == 0 && find_data.nFileSizeLow != 0)
size_k = 1;
wchar_t szBuff[100];
wsprintf(szBuff, L"%i KB", size_k);
SetDlgItemText(IDC_FILESIZE, szBuff);
// TODO(fbarchard): We need a pipeline property for frame rate.
float duration = media::Movie::get()->GetDuration();
float fps = 29.97f;
wsprintf(szBuff, L"%i.%2i Seconds, %i Frames",
static_cast<int>(duration),
static_cast<int>(duration * 100) % 100,
static_cast<int>(duration * fps));
SetDlgItemText(IDC_FILEDURATION, szBuff);
SYSTEMTIME st;
::FileTimeToSystemTime(&find_data.ftCreationTime, &st);
::GetDateFormat(LOCALE_USER_DEFAULT, 0, &st,
L"dddd, MMMM dd',' yyyy',' ",
szBuff, sizeof(szBuff) / sizeof(szBuff[0]));
wchar_t szBuff1[50];
::GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st,
L"hh':'mm':'ss tt", szBuff1,
sizeof(szBuff1) / sizeof(szBuff1[0]));
lstrcat(szBuff, szBuff1);
SetDlgItemText(IDC_FILEDATE, szBuff);
szBuff[0] = 0;
if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) != 0)
lstrcat(szBuff, L"Archive, ");
if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0)
lstrcat(szBuff, L"Read-only, ");
if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0)
lstrcat(szBuff, L"Hidden, ");
if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) != 0)
lstrcat(szBuff, L"System");
int length = lstrlen(szBuff);
if (length >= 2 && szBuff[length - 2] == L',')
szBuff[length - 2] = 0;
SetDlgItemText(IDC_FILEATTRIB, szBuff);
::FindClose(find_handle);
}
} else {
SetDlgItemText(IDC_FILELOCATION, L"(Clipboard)");
SetDlgItemText(IDC_FILESIZE, L"N/A");
SetDlgItemText(IDC_FILEDATE, L"N/A");
SetDlgItemText(IDC_FILEATTRIB, L"N/A");
}
return TRUE;
}
CFileName file_location_;
wchar_t* file_name_;
};
// Frame properties.
// TODO(fbarchard): This is not implemented for movies yet.
class CPageTwo : public CPropertyPageImpl<CPageTwo> {
public:
enum { IDD = IDD_PROP_PAGE2 };
CPageTwo() : file_name_(NULL) {
}
BEGIN_MSG_MAP(CPageTwo)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
CHAIN_MSG_MAP(CPropertyPageImpl<CPageTwo>)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*message*/, WPARAM /*wparam*/, LPARAM /*lparam*/,
BOOL& /*handled*/) {
// Special - remove unused buttons, move Close button, center wizard
CPropertySheetWindow sheet = GetPropertySheet();
#if !defined(_AYGSHELL_H_) && !defined(__AYGSHELL_H__) // PPC specific.
sheet.CancelToClose();
RECT rect;
CButton btn_cancel = sheet.GetDlgItem(IDCANCEL);
btn_cancel.GetWindowRect(&rect);
sheet.ScreenToClient(&rect);
btn_cancel.ShowWindow(SW_HIDE);
CButton btn_close = sheet.GetDlgItem(IDOK);
btn_close.SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOSIZE);
sheet.CenterWindow(GetPropertySheet().GetParent());
sheet.ModifyStyleEx(WS_EX_CONTEXTHELP, 0);
#endif // (_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific.
// Get and display movie prperties.
SetDlgItemText(IDC_TYPE, L"MP4 Movie");
wchar_t* compression_text = L"H.264";
if (file_name_ != NULL) {
HANDLE file_handle = ::CreateFile(file_name_, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
ATLASSERT(file_handle != INVALID_HANDLE_VALUE);
if (file_handle != INVALID_HANDLE_VALUE) {
DWORD dwRead = 0;
BITMAPFILEHEADER bfh;
::ReadFile(file_handle, &bfh, sizeof(bfh), &dwRead, NULL);
BITMAPINFOHEADER bih;
::ReadFile(file_handle, &bih, sizeof(bih), &dwRead, NULL);
::CloseHandle(file_handle);
SetDlgItemInt(IDC_WIDTH, bih.biWidth);
SetDlgItemInt(IDC_HEIGHT, bih.biHeight);
SetDlgItemInt(IDC_HORRES, ::MulDiv(bih.biXPelsPerMeter, 254, 10000));
SetDlgItemInt(IDC_VERTRES, ::MulDiv(bih.biYPelsPerMeter, 254, 10000));
SetDlgItemInt(IDC_BITDEPTH, bih.biBitCount);
switch (bih.biCompression) {
case BI_RLE4:
case BI_RLE8:
compression_text = L"RLE";
break;
case BI_BITFIELDS:
compression_text = L"Uncompressed with bitfields";
break;
case BI_JPEG:
case BI_PNG:
compression_text = L"Unknown";
break;
}
SetDlgItemText(IDC_COMPRESSION, compression_text);
}
} else { // Must be pasted from the clipboard.
ATLASSERT(!bmp_.IsNull());
BITMAP bitmap = { 0 };
bool result = bmp_.GetBitmap(bitmap);
ATLASSERT(result);
if (result) {
CClientDC dc(NULL);
SetDlgItemInt(IDC_WIDTH, bitmap.bmWidth);
SetDlgItemInt(IDC_HEIGHT, bitmap.bmHeight);
// Should we use screen resolution here???
SetDlgItemInt(IDC_HORRES, dc.GetDeviceCaps(LOGPIXELSX));
SetDlgItemInt(IDC_VERTRES, dc.GetDeviceCaps(LOGPIXELSX));
SetDlgItemInt(IDC_BITDEPTH, bitmap.bmBitsPixel);
SetDlgItemText(IDC_COMPRESSION, compression_text);
}
}
return TRUE;
}
CBitmapHandle bmp_;
wchar_t* file_name_;
};
// Screen properties.
class CPageThree : public CPropertyPageImpl<CPageThree> {
public:
enum { IDD = IDD_PROP_PAGE3 };
BEGIN_MSG_MAP(CPageThree)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
CHAIN_MSG_MAP(CPropertyPageImpl<CPageThree>)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*message*/, WPARAM /*wparam*/, LPARAM /*lparam*/,
BOOL& /*handled*/) {
// Get and set screen properties.
CClientDC dc(NULL);
SetDlgItemInt(IDC_WIDTH, dc.GetDeviceCaps(HORZRES));
SetDlgItemInt(IDC_HEIGHT, dc.GetDeviceCaps(VERTRES));
SetDlgItemInt(IDC_HORRES, dc.GetDeviceCaps(LOGPIXELSX));
SetDlgItemInt(IDC_VERTRES, dc.GetDeviceCaps(LOGPIXELSY));
SetDlgItemInt(IDC_BITDEPTH, dc.GetDeviceCaps(BITSPIXEL));
return TRUE;
}
};
// TODO(fbachard): Frame properties only work for images, so
// this tab is removed until movie frame properties can be
// added.
class CBmpProperties : public CPropertySheetImpl<CBmpProperties> {
public:
CBmpProperties() {
m_psh.dwFlags |= PSH_NOAPPLYNOW;
AddPage(page1_);
// AddPage(page2_); // Not implemented for movies yet.
AddPage(page3_);
SetActivePage(0);
SetTitle(L"Movie Properties");
}
void SetFileInfo(wchar_t* file_path, HBITMAP bitmap) {
page1_.file_name_ = file_path;
page2_.file_name_ = file_path;
page2_.bmp_ = bitmap;
}
BEGIN_MSG_MAP(CBmpProperties)
CHAIN_MSG_MAP(CPropertySheetImpl<CBmpProperties>)
END_MSG_MAP()
CPageOne page1_;
CPageTwo page2_;
CPageThree page3_;
};
#endif // MEDIA_TOOLS_PLAYER_WTL_PROPS_H_