@@ -69,22 +69,32 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
6969 AppendMenuW (hMenu , MF_POPUP , (UINT )hFile , L"&File" );
7070 g_hFileMenu = hFile ;
7171
72+ /* Create Edit menu */
73+ g_hEditMenu = CreatePopupMenu ();
74+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_UNDO , L"&Undo\tCtrl+Z" );
75+ AppendMenuW (g_hEditMenu , MF_SEPARATOR , 0 , NULL );
76+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_CUT , L"Cu&t\tCtrl+X" );
77+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_COPY , L"&Copy\tCtrl+C" );
78+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_PASTE , L"&Paste\tCtrl+V" );
79+ AppendMenuW (g_hEditMenu , MF_SEPARATOR , 0 , NULL );
80+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_SELECTALL , L"Select &All\tCtrl+A" );
81+ AppendMenuW (g_hEditMenu , MF_SEPARATOR , 0 , NULL );
82+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_DELETE , L"&Delete\tDel" );
83+ AppendMenuW (g_hEditMenu , MF_SEPARATOR , 0 , NULL );
84+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_FIND , L"&Find...\tCtrl+F" );
85+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_FINDNEXT , L"Find &Next\tF3" );
86+ AppendMenuW (g_hEditMenu , MF_STRING , IDM_REPLACE , L"&Replace...\tCtrl+H" );
87+ AppendMenuW (hMenu , MF_POPUP , (UINT )g_hEditMenu , L"&Edit" );
88+
7289 /* Create all three context menus upfront */
7390 g_hQueryCtx = CreatePopupMenu ();
7491 AppendMenuW (g_hQueryCtx , MF_STRING , IDM_EXECUTE , L"&Execute\tCtrl+Enter" );
75- AppendMenuW (g_hQueryCtx , MF_SEPARATOR , 0 , NULL );
76- AppendMenuW (g_hQueryCtx , MF_STRING , IDM_FIND , L"&Find...\tCtrl+F" );
77- AppendMenuW (g_hQueryCtx , MF_STRING , IDM_FINDNEXT , L"Find &Next\tF3" );
78- AppendMenuW (g_hQueryCtx , MF_STRING , IDM_REPLACE , L"&Replace...\tCtrl+H" );
7992
8093 g_hResultCtx = CreatePopupMenu ();
8194 AppendMenuW (g_hResultCtx , MF_STRING , IDM_VIEWGRID , L"&Grid View\tCtrl+G" );
8295 AppendMenuW (g_hResultCtx , MF_SEPARATOR , 0 , NULL );
8396 AppendMenuW (g_hResultCtx , MF_STRING , IDM_EXPORTRESULTS , L"&Export Results..." );
8497 AppendMenuW (g_hResultCtx , MF_STRING , IDM_EXPORTHTMLRES , L"Export &HTML..." );
85- AppendMenuW (g_hResultCtx , MF_SEPARATOR , 0 , NULL );
86- AppendMenuW (g_hResultCtx , MF_STRING , IDM_FIND , L"&Find...\tCtrl+F" );
87- AppendMenuW (g_hResultCtx , MF_STRING , IDM_FINDNEXT , L"Find &Next\tF3" );
8898
8999 {
90100 HMENU hSelObj = CreatePopupMenu ();
@@ -395,6 +405,42 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
395405 case IDM_FONTSIZE :
396406 CycleFontSize ();
397407 break ;
408+ /* Edit menu */
409+ case IDM_UNDO :
410+ if (g_viewMode == VIEW_QUERY )
411+ SendMessage (g_hwndQuery , EM_UNDO , 0 , 0 );
412+ else if (g_editMode && CanUndo ())
413+ DoUndo ();
414+ break ;
415+ case IDM_CUT :
416+ if (g_viewMode == VIEW_QUERY )
417+ SendMessage (g_hwndQuery , WM_CUT , 0 , 0 );
418+ break ;
419+ case IDM_COPY :
420+ if (g_viewMode == VIEW_QUERY )
421+ SendMessage (g_hwndQuery , WM_COPY , 0 , 0 );
422+ else if (g_viewMode == VIEW_RESULT && !g_gridView )
423+ SendMessage (g_hwndResult , WM_COPY , 0 , 0 );
424+ break ;
425+ case IDM_PASTE :
426+ if (g_viewMode == VIEW_QUERY )
427+ SendMessage (g_hwndQuery , WM_PASTE , 0 , 0 );
428+ break ;
429+ case IDM_SELECTALL :
430+ if (g_viewMode == VIEW_QUERY ) {
431+ SetFocus (g_hwndQuery );
432+ SendMessage (g_hwndQuery , EM_SETSEL , 0 , -1 );
433+ } else if (g_viewMode == VIEW_RESULT && !g_gridView ) {
434+ SetFocus (g_hwndResult );
435+ SendMessage (g_hwndResult , EM_SETSEL , 0 , -1 );
436+ } else if (g_viewMode == VIEW_RESULT && g_gridView && g_hwndGrid ) {
437+ SetFocus (g_hwndGrid );
438+ ListView_SetItemState (g_hwndGrid , -1 , LVIS_SELECTED , LVIS_SELECTED );
439+ }
440+ break ;
441+ case IDM_DELETE :
442+ if (g_editMode && g_viewMode == VIEW_RESULT ) DoDeleteRows ();
443+ break ;
398444 case IDOK : SendMessage (hwnd , WM_CLOSE , 0 , 0 ); break ;
399445 case 1001 :
400446 if (HIWORD (wParam ) == EN_CHANGE && g_viewMode == 0 ) {
@@ -540,6 +586,23 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
540586
541587 case WM_INITMENUPOPUP : {
542588 HMENU hMenu = (HMENU )wParam ;
589+ /* Update Edit menu state */
590+ if (hMenu == g_hEditMenu ) {
591+ int canUndo = 0 ;
592+ int hasSelection = 0 ;
593+ int canCut = (g_viewMode == VIEW_QUERY );
594+ if (g_viewMode == VIEW_QUERY )
595+ canUndo = SendMessage (g_hwndQuery , EM_CANUNDO , 0 , 0 );
596+ else if (g_editMode )
597+ canUndo = CanUndo ();
598+ if (g_viewMode == VIEW_RESULT && g_gridView && g_hwndGrid )
599+ hasSelection = ListView_GetNextItem (g_hwndGrid , -1 , LVNI_SELECTED ) >= 0 ;
600+ EnableMenuItem (hMenu , IDM_UNDO , canUndo ? MF_ENABLED : MF_GRAYED );
601+ EnableMenuItem (hMenu , IDM_CUT , canCut ? MF_ENABLED : MF_GRAYED );
602+ EnableMenuItem (hMenu , IDM_DELETE , (g_editMode && g_viewMode == VIEW_RESULT && hasSelection ) ? MF_ENABLED : MF_GRAYED );
603+ EnableMenuItem (hMenu , IDM_REPLACE , (g_viewMode == VIEW_QUERY ) ? MF_ENABLED : MF_GRAYED );
604+ EnableMenuItem (hMenu , IDM_FINDNEXT , g_findText [0 ] ? MF_ENABLED : MF_GRAYED );
605+ }
543606 /* Check if this is the Selected Object submenu */
544607 if (g_viewMode == 2 ) {
545608 int objType = GetSelectedObjectType ();
0 commit comments