// NOTE: We intentionally receive a WEAK pointer here because we want to be callable by a delegate whose // payload contains a weak reference to a level editor instance TSharedPtr< SWidget > FLevelEditorContextMenu::BuildMenuWidget( TWeakPtr< SLevelEditor > LevelEditor, LevelEditorMenuContext ContextType, TSharedPtr<FExtender> Extender ) { // Build up the menu const bool bShouldCloseWindowAfterMenuSelection = true; FMenuBuilder MenuBuilder(bShouldCloseWindowAfterMenuSelection, TSharedPtr<const FUICommandList>()); FillMenu(MenuBuilder, LevelEditor, ContextType, Extender); return MenuBuilder.MakeWidget(); }
MRESULT EXPENTRY fnwpWxTaskWidget( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) { MRESULT mrc = 0; // get widget data from QWL_USER (stored there by WM_CREATE) PXCENTERWIDGET pWidget = (PXCENTERWIDGET)WinQueryWindowPtr( hwnd, QWL_USER ); // this ptr is valid after WM_CREATE switch( msg ) { /* * WM_CREATE: * as with all widgets, we receive a pointer to the * XCENTERWIDGET in mp1, which was created for us. * * The first thing the widget MUST do on WM_CREATE * is to store the XCENTERWIDGET pointer (from mp1) * in the QWL_USER window word by calling: * * WinSetWindowPtr(hwnd, QWL_USER, mp1); * * We could use XCENTERWIDGET.pUser for allocating * another private memory block for our own stuff, * for example to be able to store fonts and colors. * We ain't doing this in the minimal sample. */ case WM_CREATE: WinSetWindowPtr(hwnd, QWL_USER, mp1); pWidget = (PXCENTERWIDGET)mp1; if(( !pWidget ) || ( !pWidget->pfnwpDefWidgetProc )) { // shouldn't happen... stop window creation!! mrc = (MPARAM)TRUE; } hwndMenu = WinCreateWindow( hwnd, WC_MENU, 0, 0, 0, 0, 0, 0, hwnd, HWND_TOP, ID_MENU_TASKS, 0, 0 ); ico_tasks = WinLoadPointer( HWND_DESKTOP, hmodMe, ID_ICON_TASKS ); ico_detach = WinLoadPointer( HWND_DESKTOP, hmodMe, ID_ICON_DETACH ); ico_dos = WinLoadPointer( HWND_DESKTOP, hmodMe, ID_ICON_DOS ); ico_os2fs = WinLoadPointer( HWND_DESKTOP, hmodMe, ID_ICON_OS2FS ); ico_os2vio = WinLoadPointer( HWND_DESKTOP, hmodMe, ID_ICON_OS2VIO ); ico_pm = WinLoadPointer( HWND_DESKTOP, hmodMe, ID_ICON_PM ); break; /* * WM_BUTTON1CLICK: * clicked on the window */ case WM_BUTTON1CLICK: { mrc = (MPARAM)WgtControl( pWidget, mp1, mp2 ); RECTL rcl; POINTL ptl; SWP swp; // Check if Ctrl is pressed if( WinGetKeyState( HWND_DESKTOP, VK_CTRL ) & 0x8000 ) { bType = TRUE; } else { bType = FALSE; } // Fill it with items FillMenu( hwndMenu ); // Place popup according to xCenter position if( pWidget->pGlobals->ulPosition == XCENTER_BOTTOM ) { WinQueryWindowRect( hwnd, &rcl ); ptl.y = rcl.yTop + 1; ptl.x = rcl.xLeft; WinMapWindowPoints( HWND_DESKTOP, hwnd, &ptl, 0 ); } else { WinQueryWindowRect( hwnd, &rcl ); ptl.y = rcl.yBottom; ptl.x = rcl.xLeft; WinMapWindowPoints( HWND_DESKTOP, hwnd, &ptl, 0 ); memset( &swp, 0, sizeof(SWP)); swp.fl = SWP_SIZE; WinSendMsg( hwndMenu, WM_ADJUSTWINDOWPOS, MPFROMP(&swp), 0 ); ptl.y -= swp.cy; } // Show menu WinPopupMenu( hwnd, hwnd, hwndMenu, ptl.x, ptl.y, 0, PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_HCONSTRAIN | PU_VCONSTRAIN ); break; } case WM_COMMAND: { char szPid[1024]; MENUITEM mi; SHORT id; TASKDATA* data; // Get menu id and data id = SHORT1FROMMP(mp1); WinSendMsg( hwndMenu, MM_QUERYITEM, MPFROM2SHORT( id, FALSE ), MPFROMP( &mi )); data = (TASKDATA*)mi.hItem; // Is it "our" item ?? if( id >= ID_ITEM_FIRST && id < 10000 ) { if( bType ) { // Ctrl was pressed on icon, kill pid if( WinGetKeyState( HWND_DESKTOP, VK_CTRL ) & 0x8000 ) { // Ctrl was pressed on menu item, use external kill sprintf( szPid, "Kill this process (%d) using fastio$ ?", data->pid ); if( WinMessageBox( HWND_DESKTOP, hwnd, szPid, "xCenter", 0, MB_ICONQUESTION | MB_YESNO | MB_APPLMODAL | MB_MOVEABLE | MB_DEFBUTTON2 ) == MBID_YES ) { DosKillFastIo( data->pid ); } } else { sprintf( szPid, "Are you sure that you want to kill this process (%d)?", data->pid ); if( WinMessageBox( HWND_DESKTOP, hwnd, szPid, "xCenter", 0, MB_ICONQUESTION | MB_YESNO | MB_APPLMODAL | MB_MOVEABLE | MB_DEFBUTTON2) == MBID_YES ) { DosKillProcess( DKP_PROCESS, data->pid ); } } } else { // No Ctrl, its a switch to task SwitchTo( data ); } } else { // Its Ulrichs menu, forward mrc = pWidget->pfnwpDefWidgetProc( hwnd, msg, mp1, mp2 ); } break; } /* * WM_CONTROL: * process notifications/queries from the XCenter. */ case WM_CONTROL: mrc = (MPARAM)WgtControl( pWidget, mp1, mp2 ); break; /* * WM_PAINT: * well, paint the widget. */ case WM_PAINT: WgtPaint( hwnd, pWidget ); break; /* * WM_PRESPARAMCHANGED: * A well-behaved widget would intercept * this and store fonts and colors. */ case WM_PRESPARAMCHANGED: break; case WM_MEASUREITEM: return MeasureMenuItem((POWNERITEM)mp2 ); case WM_DRAWITEM: return DrawMenuItem((POWNERITEM)mp2 ); /* * WM_DESTROY: * clean up. This _must_ be passed on to * ctrDefWidgetProc. */ case WM_DESTROY: // If we had any user data allocated in WM_CREATE // or elsewhere, we'd clean this up here. // We _MUST_ pass this on, or the default widget proc // cannot clean up. WinDestroyWindow ( hwndMenu ); WinDestroyPointer( ico_tasks ); WinDestroyPointer( ico_detach ); WinDestroyPointer( ico_dos ); WinDestroyPointer( ico_os2fs ); WinDestroyPointer( ico_os2vio ); WinDestroyPointer( ico_pm ); mrc = pWidget->pfnwpDefWidgetProc( hwnd, msg, mp1, mp2 ); break; default: mrc = pWidget->pfnwpDefWidgetProc( hwnd, msg, mp1, mp2 ); } return (mrc); }
void HighlightFiles::HiEdit(int MenuPos) { Changed = true; VMenu HiMenu(MSG(MHighlightTitle),nullptr,0,ScrY-4); HiMenu.SetHelp(HLS.HighlightList); HiMenu.SetFlags(VMENU_WRAPMODE|VMENU_SHOWAMPERSAND); HiMenu.SetPosition(-1,-1,0,0); HiMenu.SetBottomTitle(MSG(MHighlightBottom)); FillMenu(&HiMenu,MenuPos); int NeedUpdate; Panel *LeftPanel=CtrlObject->Cp()->LeftPanel; Panel *RightPanel=CtrlObject->Cp()->RightPanel; HiMenu.Show(); while (1) { while (!HiMenu.Done()) { int Key=HiMenu.ReadInput(); int SelectPos=HiMenu.GetSelectPos(); NeedUpdate=FALSE; switch (Key) { /* $ 07.07.2000 IS Если нажали ctrl+r, то восстановить значения по умолчанию. */ case KEY_CTRLR: case KEY_RCTRLR: { if (Message(MSG_WARNING,2,MSG(MHighlightTitle), MSG(MHighlightWarning),MSG(MHighlightAskRestore), MSG(MYes),MSG(MCancel))) break; HierarchicalConfig *cfg = CreateHighlightConfig(); SetHighlighting(true, cfg); //delete old settings HiMenu.Hide(); ClearData(); InitHighlightFiles(cfg); delete cfg; NeedUpdate=TRUE; break; } case KEY_NUMDEL: case KEY_DEL: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && RealSelectPos<(int)HiData.getCount()) { const wchar_t *Mask; HiData.getItem(RealSelectPos)->GetMask(&Mask); if (Message(MSG_WARNING,2,MSG(MHighlightTitle), MSG(MHighlightAskDel),Mask, MSG(MDelete),MSG(MCancel))) break; HiData.deleteItem(RealSelectPos); (*Count)--; NeedUpdate=TRUE; } break; } case KEY_NUMENTER: case KEY_ENTER: case KEY_F4: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && RealSelectPos<(int)HiData.getCount()) if (FileFilterConfig(HiData.getItem(RealSelectPos),true)) NeedUpdate=TRUE; break; } case KEY_INS: case KEY_NUMPAD0: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count,true); if (Count) { FileFilterParams *NewHData = HiData.insertItem(RealSelectPos); if (!NewHData) break; if (FileFilterConfig(NewHData,true)) { (*Count)++; NeedUpdate=TRUE; } else HiData.deleteItem(RealSelectPos); } break; } case KEY_F5: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && RealSelectPos<(int)HiData.getCount()) { FileFilterParams *HData = HiData.insertItem(RealSelectPos); if (HData) { *HData = *HiData.getItem(RealSelectPos+1); HData->SetTitle(L""); if (FileFilterConfig(HData,true)) { NeedUpdate=TRUE; (*Count)++; } else HiData.deleteItem(RealSelectPos); } } break; } case KEY_CTRLUP: case KEY_CTRLNUMPAD8: case KEY_RCTRLUP: case KEY_RCTRLNUMPAD8: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && SelectPos > 0) { if (UpperCount && RealSelectPos==FirstCount && RealSelectPos<FirstCount+UpperCount) { FirstCount++; UpperCount--; SelectPos--; } else if (LowerCount && RealSelectPos==FirstCount+UpperCount && RealSelectPos<FirstCount+UpperCount+LowerCount) { UpperCount++; LowerCount--; SelectPos--; } else if (LastCount && RealSelectPos==FirstCount+UpperCount+LowerCount) { LowerCount++; LastCount--; SelectPos--; } else HiData.swapItems(RealSelectPos,RealSelectPos-1); HiMenu.SetCheck(--SelectPos); NeedUpdate=TRUE; break; } HiMenu.ProcessInput(); break; } case KEY_CTRLDOWN: case KEY_CTRLNUMPAD2: case KEY_RCTRLDOWN: case KEY_RCTRLNUMPAD2: { int *Count=nullptr; int RealSelectPos=MenuPosToRealPos(SelectPos,&Count); if (Count && SelectPos < (int)HiMenu.GetItemCount()-2) { if (FirstCount && RealSelectPos==FirstCount-1) { FirstCount--; UpperCount++; SelectPos++; } else if (UpperCount && RealSelectPos==FirstCount+UpperCount-1) { UpperCount--; LowerCount++; SelectPos++; } else if (LowerCount && RealSelectPos==FirstCount+UpperCount+LowerCount-1) { LowerCount--; LastCount++; SelectPos++; } else HiData.swapItems(RealSelectPos,RealSelectPos+1); HiMenu.SetCheck(++SelectPos); NeedUpdate=TRUE; } HiMenu.ProcessInput(); break; } default: HiMenu.ProcessInput(); break; } // повторяющийся кусок! if (NeedUpdate) { ScrBuf.Lock(); // отменяем всякую прорисовку HiMenu.Hide(); ProcessGroups(); if (Opt.AutoSaveSetup) SaveHiData(); //FrameManager->RefreshFrame(); // рефрешим LeftPanel->Update(UPDATE_KEEP_SELECTION); LeftPanel->Redraw(); RightPanel->Update(UPDATE_KEEP_SELECTION); RightPanel->Redraw(); FillMenu(&HiMenu,MenuPos=SelectPos); HiMenu.SetPosition(-1,-1,0,0); HiMenu.Show(); ScrBuf.Unlock(); // разрешаем прорисовку } } if (HiMenu.Modal::GetExitCode()!=-1) { HiMenu.ClearDone(); HiMenu.WriteInput(KEY_F4); continue; } break; } }