📄 wmain.c
字号:
fname = einfo->info->file_name;
} else {
fname = einfo->file_name;
}
text = WAllocRCString( W_ACCELAPPTITLE );
if( !fname || !text ) {
return( NULL );
}
offset = WRFindFnOffset( fname );
fname = &fname[offset];
len = strlen( fname ) + strlen( text ) + 6;
title = (char *)WMemAlloc( len );
if( title ) {
strcpy( title, text );
strcat( title, " - [" );
strcat( title, fname );
strcat( title, "]" );
}
if( text ) {
WFreeRCString( text );
}
return ( title );
}
void WSetEditTitle( WAccelEditInfo *einfo )
{
char *title;
Bool is_rc;
title = WCreateEditTitle( einfo );
is_rc = FALSE;
if( !title ) {
title = WAllocRCString( W_ACCELAPPTITLE );
is_rc = TRUE;
}
if( title ) {
SendMessage( einfo->win, WM_SETTEXT, 0, (LPARAM) title );
if( is_rc ) {
WFreeRCString( title );
} else {
WMemFree( title );
}
}
}
Bool WCreateEditWindow( HINSTANCE inst, WAccelEditInfo *einfo )
{
int x, y, width, height;
char *title;
HMENU hmenu;
HMENU menu;
Bool is_rc;
RECT rect;
if( !einfo ) {
return( FALSE );
}
x = CW_USEDEFAULT;
y = CW_USEDEFAULT;
width = appWidth;
height = appHeight;
if( einfo->info->stand_alone ) {
WGetScreenPosOption( &rect );
if( !IsRectEmpty( &rect ) ) {
x = rect.left;
y = rect.top;
width = max( appWidth, rect.right - rect.left );
height = max( appHeight, rect.bottom - rect.top );
}
}
is_rc = FALSE;
title = WCreateEditTitle( einfo );
if( !title ) {
title = WAllocRCString( W_ACCELAPPTITLE );
is_rc = TRUE;
}
menu = (HMENU)NULL;
if( einfo->info->stand_alone ) {
menu = LoadMenu( inst, WMainSOMenuName );
}
einfo->win = CreateWindow( WMainClass, title, WS_OVERLAPPEDWINDOW,
x, y, width, height, einfo->info->parent,
menu, inst, einfo );
if( title ) {
if( is_rc ) {
WFreeRCString( title );
} else {
WMemFree( title );
}
}
if( einfo->win == (HWND)NULL ) {
return( FALSE );
}
if( !WCreateRibbon( einfo ) ) {
return( FALSE );
}
einfo->wsb = WCreateStatusLine( einfo->win, inst );
if( !einfo->wsb ) {
return( FALSE );
}
if( !WCreateAccelEditWindow( einfo, inst ) ) {
return( FALSE );
}
hmenu = GetMenu( einfo->win );
if( hmenu != (HMENU)NULL ) {
EnableMenuItem( hmenu, IDM_ACC_CUT, MF_GRAYED );
EnableMenuItem( hmenu, IDM_ACC_COPY, MF_GRAYED );
}
if( WGetOption( WOptScreenMax ) ) {
ShowWindow( einfo->win, SW_SHOWMAXIMIZED );
} else {
ShowWindow ( einfo->win, SW_SHOWNORMAL );
}
UpdateWindow ( einfo->win );
WResizeWindows ( einfo );
SetFocus( einfo->edit_dlg );
return ( TRUE );
}
WAccelEditInfo *WGetCurrentEditInfo ( void )
{
return ( WCurrEditInfo );
}
void WSetCurrentEditInfo ( WAccelEditInfo *einfo )
{
WCurrEditInfo = einfo;
}
HMENU WGetMenuHandle ( WAccelEditInfo *einfo )
{
if ( !einfo ) {
einfo = WGetCurrentEditInfo ();
}
if ( einfo && einfo->win ) {
return ( GetMenu ( einfo->win ) );
}
return ( NULL );
}
static void handleSymbols( WAccelEditInfo *einfo )
{
char *text;
if( !WEditSymbols( einfo->win, &einfo->info->symbol_table,
WGetEditInstance(), WAccHelpRoutine ) ) {
return;
}
WResolveAllEntrySymIDs( einfo );
text = WGetStrFromEdit( GetDlgItem( einfo->edit_dlg, IDM_ACCEDCMDID ),
NULL );
WRAddSymbolsToComboBox( einfo->info->symbol_table, einfo->edit_dlg,
IDM_ACCEDCMDID, WR_HASHENTRY_ALL );
if( text != NULL ) {
WSetEditWithStr( GetDlgItem( einfo->edit_dlg, IDM_ACCEDCMDID ),
text );
WMemFree( text );
}
WHandleSelChange( einfo );
}
static void handleLoadSymbols( WAccelEditInfo *einfo )
{
char *file;
file = WLoadSymbols( &einfo->info->symbol_table,
einfo->info->symbol_file,
einfo->win, TRUE );
if( file == NULL ) {
return;
}
if( einfo->info->symbol_file ) {
WMemFree( einfo->info->symbol_file );
}
einfo->info->symbol_file = file;
// lookup the id associated with the symbol for all entries
WResolveAllEntrySymIDs( einfo );
// look for the symbol matching the id for all entries
WResolveAllEntrySymbols( einfo );
WInitEditWindowListBox( einfo );
if( einfo->current_pos != -1 ) {
SendDlgItemMessage( einfo->edit_dlg, IDM_ACCEDLIST,
LB_SETCURSEL, einfo->current_pos, 0 );
}
WRAddSymbolsToComboBox( einfo->info->symbol_table, einfo->edit_dlg,
IDM_ACCEDCMDID, WR_HASHENTRY_ALL );
einfo->info->modified = TRUE;
WDoHandleSelChange( einfo, FALSE, TRUE );
}
void setLastMenuSelect( WAccelEditInfo *einfo, WPARAM wParam, LPARAM lParam )
{
WORD flags;
flags = GET_WM_MENUSELECT_FLAGS(wParam,lParam);
if( ( flags == (WORD)-1 ) &&
( GET_WM_MENUSELECT_HMENU(wParam,lParam) == (HMENU)NULL ) ) {
einfo->last_menu_select = -1;
} else if ( flags & (MF_SYSMENU | MF_SEPARATOR | MF_POPUP) ) {
einfo->last_menu_select = -1;
} else {
einfo->last_menu_select = GET_WM_MENUSELECT_ITEM(wParam,lParam);
}
}
LRESULT WINEXPORT WMainWndProc ( HWND hWnd, UINT message,
WPARAM wParam, volatile LPARAM lParam )
{
HMENU menu;
#if 0
HWND win;
#endif
LRESULT ret;
Bool pass_to_def;
WAccelEditInfo *einfo;
WORD wp;
MINMAXINFO *minmax;
pass_to_def = TRUE;
ret = FALSE;
einfo = (WAccelEditInfo *) GetWindowLong ( hWnd, 0 );
WSetCurrentEditInfo ( einfo );
if( einfo && einfo->getting_key ) {
if( WGetKeyPressProc( einfo, message, wParam, lParam ) ) {
einfo->getting_key = FALSE;
DestroyWindow( einfo->key_info.text_win );
ReleaseCapture();
WHandleChange( einfo );
pass_to_def = FALSE;
}
}
switch( message ) {
case WM_ACTIVATE:
if( GET_WM_ACTIVATE_FACTIVE(wParam, lParam) &&
!GET_WM_ACTIVATE_FMINIMIZED(wParam, lParam) &&
einfo && einfo->edit_dlg != (HWND)NULL ) {
SetFocus( einfo->edit_dlg );
pass_to_def = FALSE;
}
break;
case WM_INITMENU:
if( wParam == (WPARAM) GetMenu(hWnd) ) {
// set the cut and copy menu items
ret = SendDlgItemMessage( einfo->edit_dlg, IDM_ACCEDLIST,
LB_GETCURSEL, 0, 0 );
if( ret != LB_ERR ) {
EnableMenuItem( (HMENU)wParam, IDM_ACC_CUT, MF_ENABLED );
EnableMenuItem( (HMENU)wParam, IDM_ACC_COPY, MF_ENABLED );
} else {
EnableMenuItem( (HMENU)wParam, IDM_ACC_CUT, MF_GRAYED );
EnableMenuItem( (HMENU)wParam, IDM_ACC_COPY, MF_GRAYED );
}
// set the paste menu item
if( OpenClipboard( hWnd ) ) {
if( //IsClipboardFormatAvailable( WClipbdFormat ) ||
IsClipboardFormatAvailable( WItemClipbdFormat ) ) {
EnableMenuItem( (HMENU)wParam, IDM_ACC_PASTE, MF_ENABLED );
} else {
EnableMenuItem( (HMENU)wParam, IDM_ACC_PASTE, MF_GRAYED );
}
CloseClipboard();
}
ret = FALSE;
}
break;
case WM_CREATE:
einfo = ((CREATESTRUCT *)lParam)->lpCreateParams;
SetWindowLong ( hWnd, 0, (LONG)einfo );
break;
case WM_MENUSELECT:
if( einfo ) {
menu = WGetMenuHandle ( einfo );
WHandleMenuSelect ( einfo->wsb, menu, wParam, lParam );
setLastMenuSelect( einfo, wParam, lParam );
}
break;
case WM_GETMINMAXINFO:
minmax = (MINMAXINFO *) lParam;
minmax->ptMinTrackSize.x = appWidth;
minmax->ptMinTrackSize.y = appHeight;
break;
case WM_MOVE:
if ( einfo ) {
if ( IsZoomed ( hWnd ) ) {
WSetOption ( WOptScreenMax, TRUE );
} else if ( !IsIconic ( hWnd ) ) {
WUpdateScreenPosOpt ( hWnd );
WSetOption ( WOptScreenMax, FALSE );
}
}
break;
case WM_SIZE:
if ( einfo ) {
if ( wParam == SIZE_MAXIMIZED ) {
WSetOption ( WOptScreenMax, TRUE );
} else if ( wParam != SIZE_MINIMIZED ) {
WUpdateScreenPosOpt ( hWnd );
WSetOption ( WOptScreenMax, FALSE );
}
WResizeWindows ( einfo );
}
break;
#if 0
case WM_ACTIVATE:
if( GET_WM_ACTIVATE_FACTIVE(wParam, lParam) != WA_INACTIVE ) {
einfo = (WAccelEditInfo *) GetWindowLong( hWnd, 0 );
if( einfo && einfo->edit_dlg != (HWND)NULL ) {
SetFocus( einfo->edit_dlg );
}
WSetCurrentEditInfo( einfo );
} else {
WSetCurrentEditInfo( NULL );
}
break;
#endif
case WM_COMMAND:
wp = LOWORD(wParam);
switch ( wp ) {
case IDM_ACC_CLEAR:
WHandleClear( einfo );
pass_to_def = FALSE;
break;
case IDM_ACC_UPDATE:
SendMessage( einfo->info->parent, ACCEL_PLEASE_SAVEME, 0,
(LPARAM)einfo->hndl );
pass_to_def = FALSE;
break;
case IDM_ACC_OPEN:
pass_to_def = FALSE;
if( einfo->info->modified ) {
ret = WQuerySave( einfo, FALSE );
if( !ret ) {
break;
}
}
ret = SendMessage( einfo->info->parent,
ACCEL_PLEASE_OPENME, 0,
(LPARAM)einfo->hndl );
ret = FALSE;
break;
case IDM_ACC_SAVE:
WSaveObject( einfo, FALSE, FALSE );
pass_to_def = FALSE;
break;
case IDM_ACC_SAVEAS:
WSaveObject( einfo, TRUE, FALSE );
pass_to_def = FALSE;
break;
case IDM_ACC_SAVEINTO:
WSaveObject( einfo, TRUE, TRUE );
pass_to_def = FALSE;
break;
case IDM_ACC_EXIT:
/* clean up before we exit */
PostMessage( einfo->win, WM_CLOSE, 0, 0 );
break;
case IDM_ACC_PASTE:
WPasteAccelItem( einfo );
pass_to_def = FALSE;
break;
case IDM_ACC_COPY:
case IDM_ACC_CUT:
WClipAccelItem( einfo, ( wp == IDM_ACC_CUT ) );
pass_to_def = FALSE;
break;
case IDM_ACC_DELETE:
WDeleteAccelEntry ( einfo );
pass_to_def = FALSE;
break;
case IDM_ACC_NEWITEM:
WInsertAccelEntry ( einfo );
pass_to_def = FALSE;
break;
case IDM_ACC_KEYVALUE:
WSetStatusByID( einfo->wsb, W_GETTINGKEYS, -1 );
WHandleGetKeyValue( einfo, einfo->last_menu_select == IDM_ACC_KEYVALUE );
WSetStatusReadyText( einfo->wsb );
pass_to_def = FALSE;
break;
case IDM_ACC_SYMBOLS:
handleSymbols( einfo );
pass_to_def = FALSE;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -