windows-nt/Source/XPSP1/NT/multimedia/media/mplayer2/dlgs.c
2020-09-26 16:20:57 +08:00

681 lines
19 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*-----------------------------------------------------------------------------+
| DLGS.C |
| |
| Routines to handle selection range display |
| |
| (C) Copyright Microsoft Corporation 1991. All rights reserved. |
| |
| Revision History |
| Oct-1992 MikeTri Ported to WIN32 / WIN16 common code |
| |
+-----------------------------------------------------------------------------*/
//#undef NOSCROLL // SB_* and scrolling routines
//#undef NOWINOFFSETS // GWL_*, GCL_*, associated routines
//#undef NOCOLOR // color stuff
//#include <string.h>
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include "mplayer.h"
#include "stdlib.h"
extern UINT gwCurScale;
TCHAR aszHelpFile[] = TEXT("MPLAYER.HLP");
/*
* FUNCTION PROTOTYPES
*/
INT_PTR FAR PASCAL _EXPORT setselDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
INT_PTR FAR PASCAL _EXPORT optionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
INT_PTR FAR PASCAL _EXPORT mciDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
/*--------------------------------------------------------------+
| ******************* PUBLIC FUNCTIONS ************************ |
+--------------------------------------------------------------*/
/*--------------------------------------------------------------+
| setselDialog - bring up the dialog for Set Selection |
| |
+--------------------------------------------------------------*/
BOOL FAR PASCAL setselDialog(HWND hwnd)
{
FARPROC fpfn;
frameboxInit(ghInst, ghInstPrev);
fpfn = MakeProcInstance((FARPROC)setselDlgProc, ghInst);
DialogBox(ghInst, TEXT("SetSelection"), hwnd, (DLGPROC)fpfn);
return TRUE; // should we check return value?
}
static BOOL sfNumLastChosen;
static BOOL sfInUpdate = FALSE;
/*--------------------------------------------------------------+
| setselDlgProc - dialog procedure for Set Selection dialog |
| |
+--------------------------------------------------------------*/
INT_PTR PASCAL _EXPORT setselDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
int iItem;
DWORD_PTR fr, fr2, frIn, frOut, frMarkIn, frMarkOut, frCurrent;
TCHAR ach[80];
LPTSTR lpsz = (LPTSTR)ach;
static int aKeyWordIds[] = {
IDC_EDITALL, IDH_SELECT_ALL,
IDC_EDITNONE, IDH_SELECT_NONE,
IDC_EDITSOME, IDH_SELECT_FROM,
IDC_EDITFROM, IDH_SELECT_FROM,
IDC_ETTEXT, IDH_SELECT_FROM,
IDC_EDITTO, IDH_SELECT_FROM,
IDC_ESTEXT, IDH_SELECT_FROM,
IDC_EDITNUM, IDH_SELECT_FROM,
0, 0
};
frMarkIn = frIn = SendMessage(ghwndTrackbar, TBM_GETSELSTART, 0, 0);
frMarkOut = frOut = SendMessage(ghwndTrackbar, TBM_GETSELEND, 0, 0);
frCurrent = SendMessage(ghwndTrackbar, TBM_GETPOS, 0, 0);
switch(msg){
case WM_INITDIALOG:
if (gwCurScale == ID_TIME) {
LOADSTRING(IDS_TIMEMODE, ach);
SetWindowText(hwnd, lpsz);
} else if (gwCurScale == ID_FRAMES) {
LOADSTRING(IDS_FRAMEMODE, ach);
SetWindowText(hwnd, lpsz);
} else {
LOADSTRING(IDS_TRACKMODE, ach);
SetWindowText(hwnd, lpsz);
}
/* Always put something here - if no selection, use the cur frame */
if (frMarkIn == -1 || frMarkOut == -1) {
SetDlgItemInt(hwnd, IDC_EDITFROM, (UINT)frCurrent, FALSE);
SetDlgItemInt(hwnd, IDC_EDITTO, (UINT)frCurrent, FALSE);
SetDlgItemInt(hwnd, IDC_EDITNUM, 0, FALSE);
} else {
SetDlgItemInt(hwnd, IDC_EDITFROM, (UINT)frMarkIn, FALSE);
SetDlgItemInt(hwnd, IDC_EDITTO, (UINT)frMarkOut, FALSE);
SetDlgItemInt(hwnd, IDC_EDITNUM, (UINT)(frMarkOut - frMarkIn), FALSE);
}
if (frMarkIn == -1 || frMarkOut == -1) {
/* turn on the NONE radio button */
CheckRadioButton(hwnd, IDC_EDITALL, IDC_EDITNONE, IDC_EDITNONE);
} else if(frMarkIn == gdwMediaStart &&
frMarkOut == gdwMediaStart + gdwMediaLength){
/* turn on the ALL button, it is all selected */
CheckRadioButton(hwnd, IDC_EDITALL, IDC_EDITNONE, IDC_EDITALL);
} else {
/* turn on the From/To portion */
CheckRadioButton(hwnd, IDC_EDITALL, IDC_EDITNONE, IDC_EDITSOME);
}
return TRUE;
case WM_CONTEXTMENU:
{
int i;
for (i = 0; aKeyWordIds[i]; i+=2)
if (aKeyWordIds[i] == GetDlgCtrlID((HWND)wParam))
break;
if (aKeyWordIds[i] == 0)
break;
WinHelp((HWND)wParam, aszHelpFile, HELP_CONTEXTMENU, (UINT_PTR)(LPVOID)aKeyWordIds);
return TRUE;
}
case WM_HELP:
{
int i;
for (i = 0; aKeyWordIds[i]; i+=2)
if (aKeyWordIds[i] == ((LPHELPINFO)lParam)->iCtrlId)
break;
if (aKeyWordIds[i] == 0)
break;
WinHelp(((LPHELPINFO)lParam)->hItemHandle, aszHelpFile,
HELP_WM_HELP, (UINT_PTR)(LPVOID)aKeyWordIds);
return TRUE;
}
case WM_COMMAND:
switch(LOWORD(wParam)){
WORD Code;
BOOL OK;
case IDOK:
/* We hit this AFTER we press OK on the selection box */
/* Make sure box we're editing loses focus before we */
/* execute, so values will be set properly. */
SetFocus(GetDlgItem(hwnd, IDOK));
if (IsDlgButtonChecked(hwnd, IDC_EDITALL)) {
/* this is the All: case */
frIn = gdwMediaStart;
frOut = gdwMediaStart + gdwMediaLength;
} else if (IsDlgButtonChecked(hwnd, IDC_EDITNONE)){
/* this is the None: case */
frIn = frOut = (DWORD)(-1);
} else {
/* this is the From: To: case */
iItem = 0;
frIn = GetDlgItemInt(hwnd, IDC_EDITFROM, &OK, FALSE);
if (!OK)
iItem = IDC_EDITFROM; // we misbehaved
else {
frOut = GetDlgItemInt(hwnd, IDC_EDITTO, &OK, FALSE);
if (!OK)
iItem = IDC_EDITTO;
}
if ((!OK)
|| (frOut < frIn)
|| ((long)frIn < (long)gdwMediaStart)
|| (frOut > gdwMediaStart + gdwMediaLength)) {
if (!iItem && (long)frIn < (long)gdwMediaStart)
iItem = IDC_EDITFROM; // who misbehaved?
else if (!iItem)
iItem = IDC_EDITTO;
// Don't beep -- Lose focus message already beeped
// MessageBeep(MB_ICONEXCLAMATION);
/* Illegal values, display msg box */
ErrorResBox(hwnd, ghInst,
MB_ICONEXCLAMATION | MB_OK,
IDS_APPNAME, IDS_FRAMERANGE);
/* Prevent box from ending */
/* select offending value */
SetFocus(GetDlgItem(hwnd, iItem));
SendMessage(GetDlgItem(hwnd, iItem),
EM_SETSEL, 0, (LPARAM)-1);
return TRUE;
}
}
SendMessage(ghwndTrackbar, TBM_SETSELSTART, (WPARAM)FALSE, frIn);
SendMessage(ghwndTrackbar, TBM_SETSELEND, (WPARAM)TRUE, frOut);
DirtyObject(TRUE);
EndDialog(hwnd, TRUE);
break;
case IDCANCEL:
EndDialog(hwnd, FALSE);
break;
case IDC_EDITALL:
CheckRadioButton(hwnd, IDC_EDITALL,
IDC_EDITNONE, IDC_EDITALL);
break;
case IDC_EDITNONE:
CheckRadioButton(hwnd, IDC_EDITALL,
IDC_EDITNONE, IDC_EDITNONE);
break;
case IDC_EDITSOME:
CheckRadioButton(hwnd, IDC_EDITALL,
IDC_EDITNONE, IDC_EDITSOME);
/* put the focus on the FROM box */
SetFocus(GetDlgItem(hwnd, IDC_EDITFROM));
break;
case IDC_EDITNUM:
/* turn on the FROM box if it isn't */
Code = GET_WM_COMMAND_CMD(wParam, lParam);
if (!IsDlgButtonChecked(hwnd, IDC_EDITSOME))
{
SetFocus(GetDlgItem(hwnd, IDC_EDITSOME));
CheckRadioButton(hwnd, IDC_EDITALL,
IDC_EDITNONE, IDC_EDITSOME);
}
if (!sfInUpdate && Code == EN_KILLFOCUS) {
sfNumLastChosen = TRUE;
goto AdjustSomething;
}
break;
case IDC_EDITTO:
/* turn on the FROM box if it isn't */
Code = GET_WM_COMMAND_CMD(wParam, lParam);
if (!IsDlgButtonChecked(hwnd, IDC_EDITSOME))
{
SetFocus(GetDlgItem(hwnd, IDC_EDITSOME));
CheckRadioButton(hwnd, IDC_EDITALL,
IDC_EDITNONE, IDC_EDITSOME);
}
if (!sfInUpdate && Code == EN_KILLFOCUS) {
sfNumLastChosen = FALSE;
goto AdjustSomething;
}
break;
case IDC_EDITFROM:
/* turn on the FROM box if it isn't */
Code = GET_WM_COMMAND_CMD(wParam, lParam);
if (!IsDlgButtonChecked(hwnd, IDC_EDITSOME))
{
CheckRadioButton(hwnd, IDC_EDITALL,
IDC_EDITNONE, IDC_EDITSOME);
if (GetFocus() != GetDlgItem(hwnd, IDC_EDITSOME))
SetFocus(GetDlgItem(hwnd, IDC_EDITSOME));
}
if (!sfInUpdate && Code == EN_KILLFOCUS) {
sfNumLastChosen = FALSE;
goto AdjustSomething;
}
break;
AdjustSomething:
sfInUpdate = TRUE;
fr = GetDlgItemInt(hwnd, IDC_EDITFROM, &OK, FALSE);
if (!OK)
MessageBeep(MB_ICONEXCLAMATION);
else {
if ((long)fr < (long)gdwMediaStart) {
MessageBeep(MB_ICONEXCLAMATION);
fr = gdwMediaStart;
}
if (fr > gdwMediaStart + gdwMediaLength) {
MessageBeep(MB_ICONEXCLAMATION);
fr = gdwMediaStart + gdwMediaLength;
}
// We have to do this in time format, or if fr changed
SetDlgItemInt(hwnd, IDC_EDITFROM, (UINT)fr, FALSE);
if (sfNumLastChosen) {
/* They changed the number of frames last, */
/* so keep it constant. */
AdjustTo:
fr2 = GetDlgItemInt(hwnd, IDC_EDITNUM, &OK, FALSE);
if (!OK)
MessageBeep(MB_ICONEXCLAMATION);
else {
if (fr + fr2 > gdwMediaStart + gdwMediaLength) {
MessageBeep(MB_ICONEXCLAMATION);
fr2 = gdwMediaStart + gdwMediaLength - fr;
}
// if (fr2 < 0)
// fr2 = 0;
// We have to do this in time format, or if fr changed
SetDlgItemInt(hwnd, IDC_EDITNUM, (UINT)fr2, FALSE);
SetDlgItemInt(hwnd, IDC_EDITTO, (UINT)(fr + fr2), FALSE);
}
} else {
/* They changed a frame number last, */
/* so vary the number of frames */
fr2 = GetDlgItemInt(hwnd, IDC_EDITTO, &OK, FALSE);
if (!OK)
MessageBeep(MB_ICONEXCLAMATION);
else {
if (fr2 < fr) {
/* Set TO = FROM */
SetDlgItemInt(hwnd, IDC_EDITNUM, 0, FALSE);
goto AdjustTo;
}
if (fr2 > gdwMediaStart + gdwMediaLength) {
MessageBeep(MB_ICONEXCLAMATION);
fr2 = gdwMediaStart + gdwMediaLength;
}
SetDlgItemInt(hwnd, IDC_EDITNUM, (UINT)(fr2 - fr), FALSE);
// must redraw for time mode or if fr2 changed
SetDlgItemInt(hwnd, IDC_EDITTO, (UINT)fr2, FALSE);
}
}
}
sfInUpdate = FALSE;
return TRUE;
break;
}
break;
}
return FALSE;
}
/*--------------------------------------------------------------+
| optionsDialog - bring up the dialog for Options |
| |
+--------------------------------------------------------------*/
BOOL FAR PASCAL optionsDialog(HWND hwnd)
{
FARPROC fpfn;
#if 0
DWORD ThreadId;
DWORD WindowThreadId;
#endif
fpfn = MakeProcInstance((FARPROC)optionsDlgProc, ghInst);
#if 0
Problem:
When in-place editing, bring up the Options (or other) dialog,
then bring another app into the foreground. If you now click on
our container, you just get a beep. You can get back using the
Task List.
I can't get it to work with AttachThreadInput, but I'm not even
sure that this should be the server's responsibility. It's the
container that's receiving the mouse clicks.
I haven't had any word from the OLE guys on this question.
if (gfOle2IPEditing)
{
ThreadId = GetCurrentThreadId( );
WindowThreadId = GetWindowThreadProcessId(ghwndCntr, NULL);
AttachThreadInput(WindowThreadId, ThreadId, TRUE);
}
#endif
DialogBox(ghInst, TEXT("Options"), hwnd, (DLGPROC)fpfn);
#if 0
if (gfOle2IPEditing)
AttachThreadInput(ThreadId, WindowThreadId, FALSE);
#endif
return TRUE; // should we check return value?
}
/*--------------------------------------------------------------+
| optionsDlgProc - dialog procedure for Options dialog |
| |
+--------------------------------------------------------------*/
INT_PTR FAR PASCAL _EXPORT optionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
UINT w;
HDC hdc;
static int aKeyWordIds[] =
{
OPT_AUTORWD, IDH_OPT_AUTO,
OPT_AUTOREP, IDH_OPT_REPEAT,
IDC_OLEOBJECT, IDH_OPT_CAPTCONTROL,
OPT_BAR, IDH_OPT_CAPTCONTROL,
OPT_BORDER, IDH_OPT_BORDER,
OPT_PLAY, IDH_OPT_PLAYCLIENT,
OPT_DITHER, IDH_OPT_DITHER,
IDC_CAPTIONTEXT, IDH_OPT_CAPTION,
IDC_TITLETEXT, IDH_OPT_CAPTION,
0 , 0
};
switch(msg){
case WM_INITDIALOG:
/* Take advantage of the fact that the button IDS are the */
/* same as the bit fields. */
for (w = OPT_FIRST; w <= OPT_LAST; w <<= 1)
CheckDlgButton(hwnd, w, gwOptions & w);
/* Enable and Fill the Title Text */
/* limit this box to CAPTION_LEN chars of input */
SendMessage(GetDlgItem(hwnd, IDC_TITLETEXT), EM_LIMITTEXT,
(WPARAM)CAPTION_LEN, 0L);
SendMessage(hwnd, WM_COMMAND, (WPARAM)OPT_BAR, 0L);
hdc = GetDC(NULL);
if (!(GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) ||
!(gwDeviceType & DTMCI_CANWINDOW)) {
CheckDlgButton(hwnd, OPT_DITHER, FALSE);
EnableWindow(GetDlgItem(hwnd, OPT_DITHER), FALSE);
#if 0
CheckDlgButton(hwnd, OPT_USEPALETTE, FALSE);
EnableWindow(GetDlgItem(hwnd, OPT_USEPALETTE), FALSE);
#endif
}
ReleaseDC(NULL, hdc);
return TRUE;
case WM_CONTEXTMENU:
{
WinHelp((HWND)wParam, aszHelpFile, HELP_CONTEXTMENU, (UINT_PTR)(LPVOID)aKeyWordIds);
return TRUE;
}
case WM_HELP:
{
int i;
for (i = 0; aKeyWordIds[i]; i+=2)
if (aKeyWordIds[i] == ((LPHELPINFO)lParam)->iCtrlId)
break;
WinHelp(((LPHELPINFO)lParam)->hItemHandle, aszHelpFile,
HELP_WM_HELP, (UINT_PTR)(LPVOID)aKeyWordIds);
return TRUE;
}
case WM_COMMAND:
switch(LOWORD(wParam)){
BOOL f;
case IDOK:
/* Change auto-repeat on the fly:
* If the auto-repeat option has changed
* and we're playing right now, toggle
* the appropriate global option and call
* PlayMCI(). This will update things.
* Note that if we are currently playing
* a selection, this causes the whole clip
* to be played. Is there any way round this?
*/
if ((gwStatus == MCI_MODE_PLAY)
&&(((gwOptions & OPT_AUTOREP) == OPT_AUTOREP)
!= (BOOL)IsDlgButtonChecked(hwnd, OPT_AUTOREP)))
{
gwOptions ^= OPT_AUTOREP;
PlayMCI(0,0);
}
gwOptions &= OPT_SCALE; // keep the Scale Mode
/* Take advantage of the fact that the button IDS are the */
/* same as the bit fields. */
for (w = OPT_FIRST; w <= OPT_LAST; w <<= 1)
if (IsDlgButtonChecked(hwnd, w))
gwOptions |= w;
if (IsDlgButtonChecked(hwnd, OPT_BAR))
{
GetWindowText(GetDlgItem(hwnd, IDC_TITLETEXT),
gachCaption, CHAR_COUNT(gachCaption));
if (gachCaption[0])
gwOptions |= OPT_TITLE;
else
gwOptions &= ~OPT_TITLE;
}
DirtyObject(FALSE);
EndDialog(hwnd, TRUE);
break;
case IDCANCEL:
EndDialog(hwnd, FALSE);
break;
case OPT_BAR:
f = IsDlgButtonChecked(hwnd, OPT_BAR);
EnableWindow(GetDlgItem(hwnd, IDC_CAPTIONTEXT), f);
EnableWindow(GetDlgItem(hwnd, IDC_TITLETEXT), f);
if(f) {
SetWindowText(GetDlgItem(hwnd, IDC_TITLETEXT), gachCaption);
} else {
GetWindowText(GetDlgItem(hwnd, IDC_TITLETEXT),
gachCaption, CHAR_COUNT(gachCaption));
SetWindowText(GetDlgItem(hwnd, IDC_TITLETEXT), TEXT(""));
}
break;
}
}
return FALSE;
}
/*--------------------------------------------------------------+
| mciDialog - bring up the dialog for MCI Send Command |
| |
+--------------------------------------------------------------*/
BOOL FAR PASCAL mciDialog(HWND hwnd)
{
FARPROC fpfn;
fpfn = MakeProcInstance((FARPROC)mciDlgProc, ghInst);
DialogBox(ghInst, MAKEINTATOM(DLG_MCICOMMAND), hwnd, (DLGPROC)fpfn);
return TRUE; // should we check return value?
}
/* StripLeadingAndTrailingWhiteSpace
*
* Removes blanks at the beginning and end of the string.
*
* Parameters:
*
* pIn - Pointer to the beginning of the string
*
* InLen - Length of the input string. If 0, the length will be checked.
*
* pOutLen - Pointer to a buffer to receive the length of the output string.
*
* Return:
*
* Pointer to the output string.
*
* Remarks:
*
* If InLen == *pOutLen, the string has not changed.
*
* This routine is destructive: all trailing white space is converted
* to NULLs.
*
*
* Andrew Bell, 4 January 1995
*/
LPTSTR StripLeadingAndTrailingWhiteSpace(LPTSTR pIn, DWORD InLen, LPDWORD pOutLen)
{
LPTSTR pOut = pIn;
DWORD Len = InLen;
if (Len == 0)
Len = lstrlen(pIn);
/* Strip trailing blanks:
*/
while ((Len > 0) && (pOut[Len - 1] == TEXT(' ')))
{
pOut[Len - 1] = TEXT('\0');
Len--;
}
/* Strip leading blanks:
*/
while ((Len > 0) && (*pOut == TEXT(' ')))
{
pOut++;
Len--;
}
if (pOutLen)
*pOutLen = Len;
return pOut;
}
INT_PTR FAR PASCAL _EXPORT mciDlgProc(HWND hwnd, unsigned msg, WPARAM wParam, LPARAM lParam)
{
TCHAR ach[MCI_STRING_LENGTH];
UINT w;
DWORD dw;
LPTSTR pStrip;
DWORD NewLen;
switch (msg)
{
case WM_INITDIALOG:
SendDlgItemMessage(hwnd, IDC_MCICOMMAND, EM_LIMITTEXT, CHAR_COUNT(ach) -1, 0);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
w = GetDlgItemText(hwnd, IDC_MCICOMMAND, ach, CHAR_COUNT(ach));
/* Strip off any white space at the start of the command,
* otherwise we get an MCI error. Remove it from the
* end also.
*/
pStrip = StripLeadingAndTrailingWhiteSpace(ach, w, &NewLen);
if (w > NewLen)
{
SetDlgItemText(hwnd, IDC_MCICOMMAND, pStrip);
w = GetDlgItemText(hwnd, IDC_MCICOMMAND, ach, CHAR_COUNT(ach));
}
if (w == 0)
break;
SendDlgItemMessage(hwnd, IDC_MCICOMMAND, EM_SETSEL, 0, (LPARAM)-1);
dw = SendStringMCI(ach, ach, CHAR_COUNT(ach));
if (dw != 0)
{
mciGetErrorString(dw, ach, CHAR_COUNT(ach));
// Error1(hwnd, IDS_DEVICEERROR, (LPTSTR)ach);
}
SetDlgItemText(hwnd, IDC_RESULT, ach);
break;
case IDCANCEL:
EndDialog(hwnd, FALSE);
break;
}
break;
}
return FALSE;
}