source-engine/utils/hlfaceposer/cclookup.cpp

240 lines
5.9 KiB
C++
Raw Normal View History

2020-04-23 00:56:21 +08:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include <commctrl.h>
#include "mxtk/mx.h"
#include "resource.h"
#include "CCLookup.h"
#include "mdlviewer.h"
#include "addsoundentry.h"
#include <vgui/ILocalize.h>
using namespace vgui;
extern vgui::ILocalize *g_pLocalize;
static CCloseCaptionLookupParams g_Params;
static HFONT g_UnicodeFont = NULL;
static void InsertTextColumn( HWND listcontrol, int column, int width, char const *label )
{
LVCOLUMN col;
memset( &col, 0, sizeof( col ) );
col.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_ORDER;
col.iOrder = column;
col.pszText = (char *)label;
col.cchTextMax = 256;
col.iSubItem = column;
col.cx = width;
ListView_InsertColumn( listcontrol, column, &col );
}
static void PopulateCloseCaptionTokenList( HWND wnd, CCloseCaptionLookupParams *params )
{
HWND control = GetDlgItem( wnd, IDC_CCTOKENLIST );
if ( !control )
return;
InsertTextColumn( control, 0, 200, "CloseCaption Token" );
InsertTextColumn( control, 1, 800, "Text" );
ListView_DeleteAllItems( control );
SendMessage( control, WM_SETFONT, (WPARAM)g_UnicodeFont, MAKELPARAM (TRUE, 0) );
StringIndex_t i = g_pLocalize->GetFirstStringIndex();
int saveSelected = -1;
while ( INVALID_LOCALIZE_STRING_INDEX != i )
{
char const *name = g_pLocalize->GetNameByIndex( i );
LV_ITEMW lvItem;
memset( &lvItem, 0, sizeof( lvItem ) );
lvItem.iItem = ListView_GetItemCount( control );
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.lParam = (LPARAM)i;
wchar_t label[ 256 ];
g_pLocalize->ConvertANSIToUnicode( name, label, sizeof( label ) );
lvItem.pszText = label;
lvItem.cchTextMax = 256;
SendMessage( control, LVM_INSERTITEMW, 0, (LPARAM)(const LV_ITEMW FAR*)(&lvItem));
lvItem.mask = LVIF_TEXT;
lvItem.iSubItem = 1;
wchar_t *value = g_pLocalize->GetValueByIndex( i );
lvItem.pszText = (wchar_t *)value;
lvItem.cchTextMax = 1024;
SendMessage( control, LVM_SETITEMW, 0, (LPARAM)(const LV_ITEMW FAR*)(&lvItem));
if ( !Q_stricmp( name, params->m_szCCToken ) )
{
ListView_SetItemState( control, lvItem.iItem, LVIS_SELECTED, LVIS_STATEIMAGEMASK );
saveSelected = lvItem.iItem;
}
i = g_pLocalize->GetNextStringIndex( i );
}
if ( saveSelected != -1 )
{
ListView_EnsureVisible(control, saveSelected, FALSE );
}
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : hwndDlg -
// uMsg -
// wParam -
// lParam -
// Output : static BOOL CALLBACK
//-----------------------------------------------------------------------------
static BOOL CALLBACK CloseCaptionLookupDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_INITDIALOG:
// Insert code here to put the string (to find and replace with)
// into the edit controls.
// ...
{
g_Params.PositionSelf( hwndDlg );
HWND control = GetDlgItem( hwndDlg, IDC_CCTOKENLIST );
DWORD exStyle = GetWindowLong( control, GWL_EXSTYLE );
exStyle |= LVS_EX_FULLROWSELECT;
SetWindowLong( control, GWL_EXSTYLE, exStyle );
PopulateCloseCaptionTokenList( hwndDlg, &g_Params );
SetWindowText( hwndDlg, g_Params.m_szDialogTitle );
SetDlgItemText( hwndDlg, IDC_CCTOKEN, g_Params.m_szCCToken );
SetFocus( GetDlgItem( hwndDlg, IDC_CCTOKENLIST ) );
}
return FALSE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
{
/*
//int selindex = SendMessage( GetDlgItem( hwndDlg, IDC_CCTOKENLIST ), LB_GETCURSEL, 0, 0 );
if ( selindex == LB_ERR )
{
mxMessageBox( NULL, "You must select an entry from the list", g_appTitle, MB_OK );
return TRUE;
}
*/
SendMessage( GetDlgItem( hwndDlg, IDC_CCTOKEN ), WM_GETTEXT, (WPARAM)sizeof( g_Params.m_szCCToken ), (LPARAM)g_Params.m_szCCToken );
EndDialog( hwndDlg, 1 );
}
break;
case IDCANCEL:
EndDialog( hwndDlg, 0 );
break;
}
return TRUE;
case WM_NOTIFY:
{
if ( wParam == IDC_CCTOKENLIST )
{
NMHDR *hdr = ( NMHDR * )lParam;
if ( hdr->code == LVN_ITEMCHANGED )
{
HWND control = GetDlgItem( hwndDlg, IDC_CCTOKENLIST );
NM_LISTVIEW *nmlv = ( NM_LISTVIEW * )lParam;
int item = nmlv->iItem;
if ( item >= 0 )
{
// look up the lparam value
LVITEM lvi;
memset( &lvi, 0, sizeof( lvi ) );
lvi.mask = LVIF_PARAM;
lvi.iItem = item;
if ( ListView_GetItem( control, &lvi ) )
{
char const *name = g_pLocalize->GetNameByIndex( lvi.lParam );
if ( name )
{
Q_strncpy( g_Params.m_szCCToken, name, sizeof( g_Params.m_szCCToken ) );
SendMessage( GetDlgItem( hwndDlg, IDC_CCTOKEN ), WM_SETTEXT, (WPARAM)sizeof( g_Params.m_szCCToken ), (LPARAM)g_Params.m_szCCToken );
}
}
}
return FALSE;
}
if ( hdr->code == NM_DBLCLK )
{
SendMessage( GetDlgItem( hwndDlg, IDC_CCTOKEN ), WM_GETTEXT, (WPARAM)sizeof( g_Params.m_szCCToken ), (LPARAM)g_Params.m_szCCToken );
EndDialog( hwndDlg, 1 );
return FALSE;
}
}
}
return TRUE;
}
return FALSE;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *view -
// *actor -
// Output : int
//-----------------------------------------------------------------------------
int CloseCaptionLookup( CCloseCaptionLookupParams *params )
{
g_Params = *params;
g_UnicodeFont = CreateFont(
-10,
0,
0,
0,
FW_NORMAL,
FALSE,
FALSE,
FALSE,
ANSI_CHARSET,
OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,
ANTIALIASED_QUALITY,
DEFAULT_PITCH,
"Tahoma" );
int retval = DialogBox( (HINSTANCE)GetModuleHandle( 0 ),
MAKEINTRESOURCE( IDD_CCLOOKUP ),
(HWND)g_MDLViewer->getHandle(),
(DLGPROC)CloseCaptionLookupDialogProc );
DeleteObject( g_UnicodeFont );
g_UnicodeFont = NULL;
*params = g_Params;
return retval;
}