/*-----------------------------------------------------------------------------+ | 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 #include #include #include #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; }