int FCollectionMenu::ShowContextMenu(HWND hWndParent, const FArray<FString> &aVids) { FArray<FDownload> aVideos; size_t videoCount = BuildDownloadArray(aVideos, aVids); if (videoCount == 0) return 0; vidtype videoID = aVideos[0].m_Detail.m_VideoID; FDownload &pVideo = aVideos[0]; HMENU hmenu = CreatePopupMenu(); int i = 0; if (videoCount == 1 ) { if (pVideo.m_dwFlags & FLAG_DOWNLOAD_FINISHED) _InsertMenuItem(hmenu, i++, miPlay, "Play"); if (!pVideo.IsDownloadFinished()) { if (pVideo.m_dwFlags & FLAG_DOWNLOAD_QUEUED ) _InsertMenuItem(hmenu, i++, miStart, "Start Download"); else _InsertMenuItem(hmenu, i++, miSuspend, pVideo.IsPaused() ? "Resume Download" : "Suspend Download"); } else { if (pVideo.IsDownloadableStream()) _InsertMenuItem(hmenu, i++, miStart, "Download Video"); } _InsertMenuItem(hmenu, i++, miInfo, "Info..."); _InsertMenuItem(hmenu, i++, miRename, "Rename"); } _InsertMenuItem(hmenu, i++, miDelete, "Delete"); _InsertMenuSeparator(hmenu, i++); FLabels aAllLabels; FLabels aCommonLabels; BuildLabelsUnion(aVideos, aAllLabels, aCommonLabels); HMENU hSub = CreateLabelsSubmenu(aCommonLabels, 100); _InsertSubMenu(hmenu, i++, "Label", hSub); if (videoCount == 1) _InsertMenuItem(hmenu, i++, miRevealFiles, "Reveal Files"); BOOL bShowReveal = g_AppSettings.m_LogEnabled; #ifdef _DEBUG bShowReveal = TRUE; #endif if (bShowReveal) _InsertMenuItem(hmenu, i++, miRevealMTTI, "Reveal MTTI"); POINT pt; GetCursorPos(&pt); int nCmd = TrackPopupMenu(hmenu, TPM_RETURNCMD, pt.x, pt.y, 0, hWndParent, NULL); if (nCmd < 100) { switch(nCmd) { case miPlay: g_MainFrame->PlayMediaFile(videoID); break; case miRename: { FString StrNewName = ShowRenameDlg(hWndParent, pVideo.m_Detail.m_VideoName); if (StrNewName != "") { pVideo.m_Detail.m_VideoName = StrNewName; g_Objects._DownloadManager.SaveVideoDetails(pVideo.GetVideoID(), pVideo.m_Detail); } } break; case miSuspend: for (size_t k = 0; k < aVideos.GetCount(); k++) { FDownload& pVideo = aVideos[k]; if (!pVideo.IsPaused()) g_Objects._DownloadManager.PauseDownload(videoID); else g_Objects._DownloadManager.ResumeDownload(videoID); } break; case miDelete: for (size_t k = 0; k < aVideos.GetCount(); k++) { g_MainFrame->RemoveVideo(aVideos[k].m_Detail.m_VideoID); //g_Objects._DownloadManager.RemoveDownload(aVideos[k].m_Detail.m_VideoID); } break; case miRevealFiles: { FString StrExec; if (pVideo.m_Clips.GetCount() > 0) StrExec = pVideo.m_Clips[0]->m_DataPath; ShellExecute(NULL, "open", StrExec, "", "", SW_SHOW); } break; case miRevealMTTI: { FString MTTFileName = g_Objects._DownloadManager.GetDownloadMTTI(videoID); ShellExecute(NULL, "open", "notepad", MTTFileName, "", SW_SHOW); } break; case miStart: { IVideoPlayer* pPlayer = g_MainFrame->GetPlayer(); if (pPlayer) { if (pPlayer->GetVideoID() == videoID) pPlayer->Stop(); } g_Objects._DownloadManager.StartQueuedDownload(videoID); } break; case miInfo: { //Navigate to details if episodeID exists. //If it's a RSS Feed, GoToChannelById() //If it's neither, open the folder g_MainFrame->EpisodeDetails(videoID); } break; } } if (nCmd >= 100) { int idStr = nCmd - 100; if (idStr == 0) { FString StrLabel = ShowAddLabelDlg(hWndParent, ""); if (StrLabel.GetLength() > 0) { g_Objects._LabelManager.AddLabel(StrLabel); for (size_t k = 0; k < aVideos.GetCount(); k++) { g_Objects._DownloadManager.AddLabel(aVideos[k].m_Detail.m_VideoID, StrLabel); } } nCmd = 0; } else if (idStr > 0 && idStr <= (int)m_zeLabels.GetCount()) { FString SelectedLabel = m_zeLabels[idStr - 1]; UINT uState = GetMenuState(hSub, idStr + 100, MF_BYCOMMAND); if (uState != (UINT)-1) { for (size_t k = 0; k < aVideos.GetCount(); k++) { if (uState == MF_CHECKED) g_Objects._DownloadManager.RemoveLabel(aVideos[k].m_Detail.m_VideoID, SelectedLabel); else g_Objects._DownloadManager.AddLabel(aVideos[k].m_Detail.m_VideoID, SelectedLabel); } } } } DestroyMenu(hSub); DestroyMenu(hmenu); return nCmd; }
static void OnFavTreeContextMenu(WindowInfo* win, PointI pt) { TVITEM item; if (pt.x != -1 || pt.y != -1) { TVHITTESTINFO ht = {0}; ht.pt.x = pt.x; ht.pt.y = pt.y; MapWindowPoints(HWND_DESKTOP, win->hwndFavTree, &ht.pt, 1); TreeView_HitTest(win->hwndFavTree, &ht); if ((ht.flags & TVHT_ONITEM) == 0) return; // only display menu if over a node in tree TreeView_SelectItem(win->hwndFavTree, ht.hItem); item.hItem = ht.hItem; } else { item.hItem = TreeView_GetSelection(win->hwndFavTree); if (!item.hItem) { return; } RECT rcItem; if (TreeView_GetItemRect(win->hwndFavTree, item.hItem, &rcItem, TRUE)) { MapWindowPoints(win->hwndFavTree, HWND_DESKTOP, (POINT*)&rcItem, 2); pt.x = rcItem.left; pt.y = rcItem.bottom; } else { WindowRect rc(win->hwndFavTree); pt = rc.TL(); } } item.mask = TVIF_PARAM; TreeView_GetItem(win->hwndFavTree, &item); Favorite* toDelete = (Favorite*)item.lParam; HMENU popup = BuildMenuFromMenuDef(menuDefFavContext, dimof(menuDefFavContext), CreatePopupMenu()); INT cmd = TrackPopupMenu(popup, TPM_RETURNCMD | TPM_RIGHTBUTTON, pt.x, pt.y, 0, win->hwndFavTree, nullptr); DestroyMenu(popup); if (IDM_FAV_DEL == cmd) { RememberFavTreeExpansionStateForAllWindows(); if (toDelete) { DisplayState* f = gFavorites.GetByFavorite(toDelete); gFavorites.Remove(f->filePath, toDelete->pageNo); } else { // toDelete == nullptr => this is a parent node signifying all bookmarks in a file item.hItem = TreeView_GetChild(win->hwndFavTree, item.hItem); item.mask = TVIF_PARAM; TreeView_GetItem(win->hwndFavTree, &item); toDelete = (Favorite*)item.lParam; DisplayState* f = gFavorites.GetByFavorite(toDelete); gFavorites.RemoveAllForFile(f->filePath); } UpdateFavoritesTreeForAllWindows(); prefs::Save(); // TODO: it would be nice to have a system for undo-ing things, like in Gmail, // so that we can do destructive operations without asking for permission via // invasive model dialog boxes but also allow reverting them if were done // by mistake } }
void CPsTree::PopupMenu() { HMENU hPopup; MENUITEMINFO mii; TVHITTESTINFO hti; TVITEM tvi; POINT pt; int iItem, i; // init popup menu if (!(hPopup = CreatePopupMenu())) return; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_STRING|MIIM_ID; // get cursor postion GetCursorPos(&pt); hti.pt = pt; ScreenToClient(_hWndTree, &hti.pt); tvi.mask = TVIF_PARAM|TVIF_CHILDREN; // find treeitem under cursor TreeView_HitTest(_hWndTree, &hti); if (hti.flags & (TVHT_ONITEM|TVHT_ONITEMRIGHT)) { tvi.hItem = hti.hItem; TreeView_GetItem(_hWndTree, &tvi); if (!db_get_b(NULL, MODNAME, SET_PROPSHEET_READONLYLABEL, FALSE)) { mii.dwTypeData = TranslateT("Rename Item"); mii.wID = 32001; InsertMenuItem(hPopup, 0, FALSE, &mii); } // do not allow hiding groups if (tvi.cChildren) { mii.fMask |= MIIM_STATE; mii.fState = MFS_DISABLED; } mii.dwTypeData = TranslateT("Hide Item"); mii.wID = 32000; InsertMenuItem(hPopup, 0, FALSE, &mii); } else { // add hidden items to menu mii.wID = 0; for (i = 0; i < _numItems; i++) { if (!_pItems[i]->Hti()) { mii.dwTypeData = _pItems[i]->Label(); mii.wID = 100 + i; InsertMenuItem(hPopup, 0, FALSE, &mii); } } // add headline if (mii.wID > 0) { mii.fMask |= MIIM_STATE; mii.fState = MFS_DISABLED; mii.dwTypeData = TranslateT("Show Items:"); mii.wID = 0; InsertMenuItem(hPopup, 0, TRUE, &mii); mii.fMask |= MIIM_FTYPE; mii.fType = MFT_SEPARATOR; InsertMenuItem(hPopup, 1, TRUE, &mii); InsertMenuItem(hPopup, ++i, TRUE, &mii); } mii.fMask &= ~(MIIM_FTYPE|MIIM_STATE); mii.dwTypeData = TranslateT("Reset to defaults"); mii.wID = 32004; InsertMenuItem(hPopup, ++i, TRUE, &mii); } // show the popup menu iItem = TrackPopupMenu(hPopup, TPM_RETURNCMD, pt.x, pt.y, 0, _hWndTree, NULL); DestroyMenu(hPopup); switch (iItem) { // hide the item case 32000: HideItem(tvi.lParam); break; // rename the item case 32001: BeginLabelEdit(tvi.hItem); break; // reset current tree case 32004: DBResetState(); break; // show a hidden item default: if ((iItem -= 100) >= 0 && ShowItem(iItem, NULL)) AddFlags(PSTVF_STATE_CHANGED|PSTVF_POS_CHANGED); break; } }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { char *pb; char *pe; WNDCLASS wc; HWND hWnd; HMENU hMainMenu; MSG msg; for (pb = lpCmdLine; *pb == ' ' || *pb == '\t'; pb++); for (pe = pb; *pe != '\0'; pe++); while (--pe > pb && (*pe == ' ' || *pe == '\t')); /* Now pb and pe point at respectively the first and last non-blank character in lpCmdLine. If pb > pe then the command line is blank. */ if (*pb == '"' && *pe == '"') pb++; else pe++; *pe = '\0'; /* Now pb contains the filename, if any, specified on the command line. */ hWnd = FindWindow(WND_CLASS_NAME, NULL); if (hWnd != NULL) { /* as instance of WASAP is already running */ if (*pb != '\0') { /* pass the filename */ COPYDATASTRUCT cds = { 'O', (DWORD) (pe + 1 - pb), pb }; SendMessage(hWnd, WM_COPYDATA, (WPARAM) NULL, (LPARAM) &cds); } else { /* bring the open dialog to top */ HWND hChild = GetLastActivePopup(hWnd); if (hChild != hWnd) SetForegroundWindow(hChild); } return 0; } wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = WND_CLASS_NAME; RegisterClass(&wc); hWnd = CreateWindow(WND_CLASS_NAME, APP_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); hStopIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_STOP)); hPlayIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PLAY)); hMainMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_TRAYMENU)); hTrayMenu = GetSubMenu(hMainMenu, 0); hSongMenu = CreatePopupMenu(); InsertMenu(hTrayMenu, 1, MF_BYPOSITION | MF_ENABLED | MF_STRING | MF_POPUP, (UINT_PTR) hSongMenu, "So&ng"); hQualityMenu = GetSubMenu(hTrayMenu, 3); SetMenuDefaultItem(hTrayMenu, 0, TRUE); Tray_Add(hWnd, hStopIcon); SetQuality(hWnd, use_16bit, quality); if (*pb != '\0') { memcpy(strFile, pb, pe + 1 - pb); LoadFile(hWnd); } else SelectAndLoadFile(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } WaveOut_Close(); Tray_Delete(hWnd); DestroyMenu(hMainMenu); return 0; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { #if MENU_2 case WM_CREATE: { HMENU hMenu, hSubMenu; HICON hIcon, hIconSm; hMenu = CreateMenu(); //create submenu hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "E&xit"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File"); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu,MF_STRING,ID_STUFF_GO, "&Go"); AppendMenu(hMenu,MF_STRING | MF_POPUP, (UINT)hSubMenu, "&stuff"); SetMenu(hwnd,hMenu); hIcon = (HICON)LoadImage(NULL, "menu_two.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE); if(hIcon) //success SendMessage(hwnd,WM_SETICON,ICON_BIG,(LPARAM)hIcon); else //fail MessageBox(hwnd,"Could not load large icon","Error",MB_OK | MB_ICONERROR); hIconSm = (HICON)LoadImage(NULL, "menu_two.ico", IMAGE_ICON,16,16,LR_LOADFROMFILE); if(hIconSm) //success SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)hIconSm); else MessageBox(hwnd,"Could not load small icon","Error", MB_OK | MB_ICONERROR); } break; #endif case WM_COMMAND: switch(LOWORD(wParam)) { case ID_HELP_ABOUT: { int ret = DialogBox(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_ABOUT),hwnd,AboutDlgProc); if(ret == IDOK) MessageBox(hwnd,"Dialog exited with OK","Notice",MB_OK | MB_ICONINFORMATION); else if(ret == IDCANCEL) MessageBox(hwnd,"Dialog exited with Cancel","Notice", MB_OK | MB_ICONINFORMATION); else if(ret == -1) MessageBox(hwnd,"Dialog Failed!","Error",MB_OK | MB_ICONEXCLAMATION); } break; case ID_FILE_EXIT: PostMessage(hwnd,WM_CLOSE,0,0); break; case ID_STUFF_GO: MessageBox(hwnd,"I go do something.","Do it",MB_OK); break; } break; case WM_LBUTTONDOWN: { char szFileName[MAX_PATH]; HINSTANCE hInstance = GetModuleHandle(NULL); //return a handle to the file used to //create a calling process GetModuleFileName(hInstance, szFileName, MAX_PATH); //a pointer to a buffer that recives the path and file name // of the specidied module MessageBox(hwnd, szFileName, "This program is:", MB_OK | MB_ICONINFORMATION); break; } case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,msg,wParam,lParam); //most likely does nothing } return 0; }
LRESULT playlist_view::on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_NCCREATE: wnd_playlist = wnd; initialised = true; list_playlist.add_item(this); g_playlist_message_window.add_ref(); break; case WM_CREATE: { pfc::com_ptr_t<IDropTarget_playlist> IDT_playlist = new IDropTarget_playlist(this); RegisterDragDrop(wnd, IDT_playlist.get_ptr()); if (true) { m_theme = IsThemeActive() && IsAppThemed() ? OpenThemeData(wnd, L"ListView") : NULL; SetWindowTheme(wnd, L"Explorer", NULL); } m_always_show_focus = config_object::g_get_data_bool_simple(standard_config_objects::bool_playback_follows_cursor, false); on_playlist_font_change(); create_header(true); drawing_enabled = true; m_cache.initialise(); } return 0; case WM_DESTROY: m_edit_save = false; exit_inline_edit(); m_cache.deinitialise(); RevokeDragDrop(wnd); SendMessage(wnd, WM_SETFONT, 0, 0); SendMessage(wnd_header, WM_SETFONT, 0, 0); { if (m_theme) CloseThemeData(m_theme); m_theme = NULL; } m_selection_holder.release(); break; case WM_NCDESTROY: g_playlist_message_window.release(); wnd_playlist = 0; initialised = false; list_playlist.remove_item(this); m_shown = false; // if (!list_playlist.get_count()) // { // g_playlist_entries.rebuild_all(); // } break; case WM_THEMECHANGED: { if (m_theme) CloseThemeData(m_theme); m_theme = IsThemeActive() && IsAppThemed() ? OpenThemeData(wnd, L"ListView") : 0; } break; case WM_SHOWWINDOW: if (wp == TRUE && lp == 0 && !m_shown) { static_api_ptr_t<playlist_manager> playlist_api; ensure_visible(playlist_api->activeplaylist_get_focus_item()); m_shown = true; } break; case WM_WINDOWPOSCHANGED: { LPWINDOWPOS lpwp = (LPWINDOWPOS)lp; if (!(lpwp->flags & SWP_NOSIZE)) { on_size(lpwp->cx, lpwp->cy); } } break; case WM_ERASEBKGND: return TRUE; break; case WM_PAINT: { PAINTSTRUCT ps; HDC dc_paint = BeginPaint(wnd, &ps); RECT rc_update, rc_playlist; get_playlist_rect(&rc_playlist); rc_update = ps.rcPaint; if (rc_update.top<rc_playlist.top) rc_update.top = rc_playlist.top; if (rc_update.bottom >= rc_update.top) { int item_height = get_item_height(); int start_item = (rc_update.top - rc_playlist.top) / item_height; int end_item = (rc_update.bottom - rc_playlist.top) / item_height; if (((end_item - start_item) + 1)*item_height < rc_update.bottom - rc_update.top) end_item++; { draw_items(dc_paint, start_item, 1 + (end_item - start_item)); } } EndPaint(wnd, &ps); } return 0; case WM_SETREDRAW: drawing_enabled = (wp != 0); return 0; case WM_MOUSEACTIVATE: if (GetFocus() != wnd) m_no_next_edit = true; return MA_ACTIVATE; case WM_UPDATEUISTATE: RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE); break; case WM_KILLFOCUS: RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); m_selection_holder.release(); break; case WM_SETFOCUS: //if (msg == WM_SETFOCUS && (HWND)wp != wnd) //m_no_next_edit = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); m_selection_holder = static_api_ptr_t<ui_selection_manager>()->acquire(); m_selection_holder->set_playlist_selection_tracking(); break; case WM_GETDLGCODE: return DLGC_WANTALLKEYS; case WM_KEYDOWN: { static_api_ptr_t<playlist_manager> playlist_api; uie::window_ptr p_this = this; //DWORD vk_slash = VkKeyScan('/'); if (wp == VK_CONTROL) g_drag_lmb = true; if (m_prevent_wm_char_processing = process_keydown(msg, lp, wp, true)) return 0; else { SendMessage(wnd, WM_CHANGEUISTATE, MAKEWPARAM(UIS_CLEAR, UISF_HIDEFOCUS), NULL); if (wp == VK_HOME || wp == VK_DOWN || wp == VK_END || wp == VK_PRIOR || wp == VK_NEXT || wp == VK_UP) { int focus = playlist_api->activeplaylist_get_focus_item(); int total = playlist_api->activeplaylist_get_item_count(); if ((wp == VK_HOME || wp == VK_PRIOR || wp == VK_UP)) { // if (focus == 0) return 0; } if ((wp == VK_END || wp == VK_NEXT || wp == VK_DOWN)) { // if (focus == total - 1) return 0; } SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_PAGE | SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int offset = 0; int scroll = scroll_item_offset; if (wp == VK_HOME) scroll = 0; else if (wp == VK_PRIOR && focus == scroll_item_offset) scroll -= si.nPage; else if (wp == VK_UP) { if (focus <= scroll_item_offset) scroll = focus - 1; else if (focus > si.nPos + si.nPage - 1) scroll = focus - 1 - si.nPage + 1; } else if (wp == VK_DOWN) { if (focus < scroll_item_offset) scroll = focus + 1; else if (focus >= si.nPos + si.nPage - 1) scroll = focus + 1 - si.nPage + 1; } else if (wp == VK_END) scroll = total - 1; else if (wp == VK_NEXT && focus == si.nPos + si.nPage - 1) scroll += si.nPage; drawing_enabled = false; si.nPos = scroll; si.fMask = SIF_POS; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (wp == VK_HOME) offset = 0 - focus; else if (wp == VK_PRIOR) offset = scroll_item_offset - focus; else if (wp == VK_END) offset = total - focus - 1; else if (wp == VK_NEXT) offset = get_last_viewable_item() - focus; else if (wp == VK_DOWN) offset = 1; else if (wp == VK_UP) offset = -1; //if (offset) process_keydown(offset, ((HIWORD(lp) & KF_ALTDOWN) != 0), drawing_enabled, (HIWORD(lp) & KF_REPEAT) != 0); drawing_enabled = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); return 0; } else if (wp == VK_SPACE) { int focus = playlist_api->activeplaylist_get_focus_item(); set_sel_single(focus, true, false, false); return 0; } else if (wp == VK_RETURN) { bool ctrl_down = 0 != (GetKeyState(VK_CONTROL) & KF_UP); int focus = playlist_api->activeplaylist_get_focus_item(); unsigned active = playlist_api->get_active_playlist(); if (ctrl_down) { if (active != -1 && focus != -1) playlist_api->queue_add_item_playlist(active, focus); } else { // playlist_api->set_playing_playlist(active); unsigned focus = playlist_api->activeplaylist_get_focus_item(); //unsigned active = playlist_api->get_active_playlist(); //playlist_api->playlist_set_playback_cursor(active, focus); playlist_api->activeplaylist_execute_default_action(focus); //static_api_ptr_t<play_control>()->play_start(play_control::track_command_settrack); } return 0; } else if (wp == VK_SHIFT) { if (!(HIWORD(lp) & KF_REPEAT)) g_shift_item_start = playlist_api->activeplaylist_get_focus_item(); } else if (wp == VK_F2) { unsigned count = g_get_cache().active_column_get_active_count(); if (count) { unsigned focus = playlist_api->activeplaylist_get_focus_item(); if (focus != pfc_infinite) { t_size i, pcount = playlist_api->activeplaylist_get_item_count(); bit_array_bittable sel(pcount); playlist_api->activeplaylist_get_selection_mask(sel); pfc::list_t<t_size> indices; indices.prealloc(32); for (i = 0; i<pcount; i++) if (sel[i]) indices.add_item(i); /*t_size start = focus, end = focus; if (sel[start] && pcount) { while (start>0 && sel[start-1]) start--; while (end<pcount-1 && sel[end+1]) end++; }*/ unsigned count = g_get_cache().active_column_get_active_count(); unsigned column; for (column = 0; column<count; column++) { if (!g_get_columns()[g_get_cache().active_column_active_to_actual(column)]->edit_field.is_empty()) { //create_inline_edit_v2(start, end-start+1, column); create_inline_edit_v2(indices, column); break; } } } } } else if (wp == VK_DELETE) { playlist_api->activeplaylist_undo_backup(); playlist_api->activeplaylist_remove_selection(); } else if (wp == VK_F3) { standard_commands::main_playlist_search(); } /*else if (vk_slash != -1 && wp == LOWORD(vk_slash)) { HWND wnd_search = m_searcher.create(wnd); on_size(); ShowWindow(wnd_search, SW_SHOWNORMAL); ; }*/ } } break; case WM_CHAR: if (!m_prevent_wm_char_processing) { //if (!(HIWORD(lp) & KF_REPEAT)) { if ((GetKeyState(VK_CONTROL) & KF_UP)) { static_api_ptr_t<playlist_manager> playlist_api; if (wp == 1) //Ctrl-A { playlist_api->activeplaylist_set_selection(bit_array_true(), bit_array_true()); return 0; } else if (wp == 26) //Ctrl-Z { playlist_api->activeplaylist_undo_restore(); return 0; } else if (wp == 25) //Ctrl-Y { playlist_api->activeplaylist_redo_restore(); return 0; } else if (wp == 24) //Ctrl-X { playlist_utils::cut(); return 0; } else if (wp == 3) //Ctrl-C { playlist_utils::copy(); return 0; } else if (wp == 6) //Ctrl-F { standard_commands::main_playlist_search(); return 0; } else if (wp == 22) //Ctrl-V { playlist_utils::paste(wnd); return 0; } } } } break; case WM_KEYUP: if (process_keydown(msg, lp, wp, true)) return 0; break; case WM_SYSKEYUP: if (process_keydown(msg, lp, wp, true)) return 0; break; case WM_SYSKEYDOWN: { uie::window_ptr p_this = this; if (m_prevent_wm_char_processing = process_keydown(msg, lp, wp, true)) return 0; } break; case WM_LBUTTONDOWN: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; uSendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } bool b_was_focused = GetFocus() == wnd; if (!b_was_focused) m_no_next_edit = true; //#ifdef INLINE_EDIT exit_inline_edit(); // g_no_next_edit = false; //#endif dragged = false; SetFocus(wnd); SetCapture(wnd); static_api_ptr_t<playlist_manager> playlist_api; g_drag_lmb = true; int focus = playlist_api->activeplaylist_get_focus_item(); drag_start_lmb.x = GET_X_LPARAM(lp); drag_start_lmb.y = GET_Y_LPARAM(lp); int item_height = get_item_height(); int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); // int idx = ((GET_Y_LPARAM(lp) -get_header_height()) / item_height) + scroll_item_offset; // if( idx >= 0 && idx <playlist_api->activeplaylist_get_item_count() && GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual()) if (idx >= 0) { // playlist_oper * playlist_api = playlist_api; // playlist_api->set_playback_cursor(idx); //#ifdef INLINE_EDIT m_prev_sel = (playlist_api->activeplaylist_is_item_selected(idx) && !m_wnd_edit && (playlist_api->activeplaylist_get_selection_count(2) == 1)); //#endif if (!is_visible(idx)) SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); if (wp & MK_CONTROL && wp & MK_SHIFT) { playlist_api->activeplaylist_move_selection(idx - focus); dragged = true; drag_type = 0; } else if (wp & MK_SHIFT) { drag_type = 2; dragitem = idx, dragstartitem = idx; int n = (cfg_alternative_sel ? focus : g_shift_item_start), t = idx; bool focus_sel = playlist_api->activeplaylist_is_item_selected(focus); set_sel_range(n, t, (cfg_alternative_sel != 0), (cfg_alternative_sel ? !focus_sel : false)); playlist_api->activeplaylist_set_focus_item(idx); dragged = true; } else if (wp & MK_CONTROL) { /* drag_type = 2; dragitem = idx,dragstartitem=idx; set_sel_single(idx, false, true, false); dragged = true;*/ } else if (playlist_api->activeplaylist_is_item_selected(idx)) { drag_type = 1; dragitem = idx, dragstartitem = idx; playlist_api->activeplaylist_undo_backup(); playlist_api->activeplaylist_set_focus_item(idx); dragged = false; } else { drag_type = 2; dragitem = idx, dragstartitem = idx;//item irrelevant actually; set_sel_single(idx, false, true, true); /* bit_array_bittable mask(playlist_api->activeplaylist_get_item_count()); // playlist_api->activeplaylist_is_item_selected_mask(mask); int n, t = playlist_api->activeplaylist_get_item_count(); for (n = 0;n <t;n++) { if (n==idx) mask.set(n, true); else mask.set(n, false); } console::info("crap"); playlist_api->set_sel_mask(mask); playlist_api->activeplaylist_set_focus_item(idx);*/ dragged = false; } } else { // console::info("wow"); // bit_array_bittable mask(playlist_api->activeplaylist_get_item_count()); playlist_api->activeplaylist_set_selection(bit_array_true(), bit_array_false()); dragged = true; drag_type = 0; } } break; case WM_RBUTTONUP: m_no_next_edit = false; break; case WM_MBUTTONUP: { m_no_next_edit = false; unsigned idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); playlist_mclick_actions::run(cfg_playlist_middle_action, idx != -1, idx); } break; case WM_LBUTTONUP: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; uSendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } ReleaseCapture(); g_drag_lmb = false; int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); //((GET_Y_LPARAM(lp) -get_header_height()) / get_item_height()) + scroll_item_offset; static_api_ptr_t<playlist_manager> playlist_api; if (!dragged) { if (wp & MK_CONTROL) { // int idx_down = hittest_item(drag_start_lmb.x, drag_start_lmb.y); if (idx >= 0) set_sel_single(idx, true, true, false); } else { // int item_height = get_item_height(); // int idx = ((GET_Y_LPARAM(lp) - get_header_height()) / item_height) + scroll_item_offset; if (idx >= 0 /*&& idx < playlist_api->activeplaylist_get_item_count() && (GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual())*/) { if (!m_no_next_edit && cfg_inline_edit && playlist_api->activeplaylist_is_item_selected(idx) && m_prev_sel /*&& !dragged*/) { //if (m_no_next_edit && GetCapture() == wnd) ReleaseCapture(); { exit_inline_edit(); if (main_window::config_get_inline_metafield_edit_mode() != main_window::mode_disabled) { m_edit_index = idx; long width; m_edit_column = hittest_column(GET_X_LPARAM(lp), width); if (m_edit_column >= 0 && !g_get_columns()[g_get_cache().active_column_active_to_actual(m_edit_column)]->edit_field.is_empty()) { m_edit_timer = (SetTimer(wnd, EDIT_TIMER_ID, GetDoubleClickTime(), 0) != 0); } } } } int focus = playlist_api->activeplaylist_get_focus_item(); set_sel_single(focus, false, false, true); } } } dragged = true; drag_type = 0; dragstartitem = 0; dragitem = 0; //#ifdef INLINE_EDIT m_no_next_edit = false; //#endif } break; case WM_MOUSEMOVE: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; uSendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } const unsigned cx_drag = (unsigned)abs(GetSystemMetrics(SM_CXDRAG)); const unsigned cy_drag = (unsigned)abs(GetSystemMetrics(SM_CYDRAG)); if (!g_dragging && ((g_dragging1 && wp & MK_RBUTTON && (abs(drag_start.x - GET_X_LPARAM(lp)) > cx_drag || abs(drag_start.y - GET_Y_LPARAM(lp)) > cy_drag)) || (g_drag_lmb && (wp & MK_LBUTTON) && (wp & MK_CONTROL) && (abs(drag_start_lmb.x - GET_X_LPARAM(lp)) > 3 || abs(drag_start_lmb.y - GET_Y_LPARAM(lp)) > 3)))) { static_api_ptr_t<playlist_manager> playlist_api; metadb_handle_list data; playlist_api->activeplaylist_get_selected_items(data); if (data.get_count() > 0) { static_api_ptr_t<playlist_incoming_item_filter> incoming_api; IDataObject * pDataObject = incoming_api->create_dataobject(data); if (pDataObject) { //RegisterClipboardFormat(_T("foo_ui_columns"); if (g_tooltip) { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } DWORD blah; { pfc::com_ptr_t<IDropSource_playlist> p_IDropSource_playlist = new IDropSource_playlist(this); DoDragDrop(pDataObject, p_IDropSource_playlist.get_ptr(), DROPEFFECT_COPY, &blah); } pDataObject->Release(); } } data.remove_all(); g_dragging = false; g_dragging1 = false; g_drag_lmb = false; if (wp & MK_LBUTTON) { dragged = true; drag_type = 0; dragstartitem = 0; dragitem = 0; } } if (cfg_tooltip && (GET_Y_LPARAM(lp) > get_header_height())) { int item_height = get_item_height(); int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); long cx; int column = hittest_column(GET_X_LPARAM(lp), cx); // unsigned act_col = g_cache.active_column_active_to_actual(column); if (column >= 0 && idx >= 0) { if (last_idx != (idx) || last_column != column) { if (!cfg_tooltips_clipped || is_item_clipped(idx, column)) { pfc::string8 src; g_cache.active_get_display_name(idx, column, src); pfc::string8 temp; titleformat_compiler::remove_color_marks(src, temp); temp.replace_char(9, 0x20); CreateToolTip(temp); } else { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } POINT a; a.x = cx + 3; a.y = (idx - scroll_item_offset) * item_height + get_header_height(); ClientToScreen(wnd_playlist, &a); tooltip.top = a.y; tooltip.bottom = a.y + item_height; tooltip.left = a.x; tooltip.right = a.x + get_column_width(column); } last_idx = idx; last_column = column; } else { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } } if (drag_type && (wp & MK_LBUTTON) && !(GetKeyState(VK_SHIFT) & KF_UP) && !(GetKeyState(VK_CONTROL) & KF_UP)) { RECT rc; get_playlist_rect(&rc); static_api_ptr_t<playlist_manager> playlist_api; int total = playlist_api->activeplaylist_get_item_count(); int item_height = get_item_height(); int valid_idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), false); int idx = hittest_item_no_scroll(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), false); // (GET_Y_LPARAM(lp) - get_header_height()) / (item_height); int items_count = ((rc.bottom - rc.top) / item_height) + 1; if ((idx + scroll_item_offset) != dragitem || GET_Y_LPARAM(lp) < get_header_height()) //(idx + scroll_item_offset) < playlist_api->activeplaylist_get_item_count() { if (idx >= items_count - 1) { bool need_redrawing = false; int focus = playlist_api->activeplaylist_get_focus_item(); SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int old_offset = si.nPos; si.nPos += 3; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (old_offset != scroll_item_offset) need_redrawing = true; int t = scroll_item_offset + items_count - 2; //n=dragitem, if (t > total) t = total - 1; if (t != dragitem) { drawing_enabled = false; if (drag_type == 1) playlist_api->activeplaylist_move_selection((rc.bottom - rc.top) / item_height + scroll_item_offset - focus - 1); else if (drag_type == 2) { set_sel_range(dragstartitem, t, false); playlist_api->activeplaylist_set_focus_item(t); } dragitem = t; drawing_enabled = true; need_redrawing = true; } if (need_redrawing) RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } else if (idx < 0 || GET_Y_LPARAM(lp) < get_header_height() || GET_Y_LPARAM(lp) < 0) { int focus = playlist_api->activeplaylist_get_focus_item(); bool need_redrawing = false; SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int old_offset = si.nPos; si.nPos -= 3; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (old_offset != scroll_item_offset) need_redrawing = true; if (dragitem != scroll_item_offset) { drawing_enabled = false; if (drag_type == 1) playlist_api->activeplaylist_move_selection(scroll_item_offset - focus); else if (drag_type == 2) { set_sel_range(dragstartitem, scroll_item_offset, false); playlist_api->activeplaylist_set_focus_item(scroll_item_offset); RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } dragitem = scroll_item_offset; drawing_enabled = true; need_redrawing = true; } if (need_redrawing) RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } else { int focus = playlist_api->activeplaylist_get_focus_item(); if (drag_type == 1) playlist_api->activeplaylist_move_selection(idx + scroll_item_offset - focus); else if (drag_type == 2) { if (valid_idx >= 0) { drawing_enabled = false; set_sel_range(dragstartitem, valid_idx, false); playlist_api->activeplaylist_set_focus_item(valid_idx); drawing_enabled = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } } dragitem = valid_idx; dragged = true; } } } else if (!(wp & MK_LBUTTON)) drag_type = 0; } break; case WM_LBUTTONDBLCLK: { int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); if (idx >= 0) { //#ifdef INLINE_EDIT exit_inline_edit(); m_no_next_edit = true; //#endif //if (!is_visible(idx)) uSendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0),0); #if 0 // DEATH's code case WM_LBUTTONDBLCLK: { int idx = item_from_point((short)HIWORD(lp)); if (idx >= 0 && idx<(int)m_api->activeplaylist_get_item_count()) { m_api->activeplaylist_set_focus_item(idx); static_api_ptr_t<play_control>()->play_start(play_control::TRACK_COMMAND_SETTRACK); } } return 0; #endif static_api_ptr_t<playlist_manager> playlist_api; //unsigned active = playlist_api->get_active_playlist(); // playlist_api->set_playing_playlist(active); //playlist_api->playlist_set_playback_cursor(active, idx); //playlist_api->queue_flush(); unsigned focus = playlist_api->activeplaylist_get_focus_item(); playlist_api->activeplaylist_execute_default_action(focus); } else if (cfg_playlist_double.get_value().m_command != pfc::guid_null) { mainmenu_commands::g_execute(cfg_playlist_double.get_value().m_command); } dragged = true; } break; case WM_RBUTTONDOWN: { if (wnd_playlist) SetFocus(wnd_playlist); g_dragging1 = true; drag_start.x = GET_X_LPARAM(lp); drag_start.y = GET_Y_LPARAM(lp); static_api_ptr_t<playlist_manager> playlist_api; // int item_height = get_item_height(); // int idx = ((GET_Y_LPARAM(lp) - get_header_height()) / item_height) + scroll_item_offset; int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); if (idx != -1 && !is_visible(idx)) SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); if (idx >= 0 /*&& idx < playlist_api->activeplaylist_get_item_count() && (GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual())*/) { if (!playlist_api->activeplaylist_is_item_selected(idx) && !(GetKeyState(VK_CONTROL) & KF_UP)) { set_sel_single(idx, false, false, true); } playlist_api->activeplaylist_set_focus_item(idx); } } break; case WM_MOUSEWHEEL: {//GET_WHEEL_DELTA_WPARAM exit_inline_edit(); if (1 || (wp & MK_CONTROL)) { LONG_PTR style = GetWindowLongPtr(wnd_playlist, GWL_STYLE); if (!(style & WS_VSCROLL) || ((wp & MK_CONTROL) && (style & WS_HSCROLL))) { if ((style & WS_HSCROLL)) { SCROLLINFO si; memset(&si, 0, sizeof(SCROLLINFO)); si.fMask = SIF_PAGE; si.cbSize = sizeof(SCROLLINFO); GetScrollInfo(wnd, SB_HORZ, &si); int new_pos = horizontal_offset; int old_pos = horizontal_offset; unsigned scroll_lines = GetNumScrollLines(); int zDelta = short(HIWORD(wp)); if (scroll_lines == -1) { scroll_lines = si.nPage > 1 ? si.nPage - 1 : 1; } else scroll_lines *= 3; int delta = MulDiv(zDelta, scroll_lines, 120); if (!si.nPage) si.nPage++; if (delta < 0 && delta*-1 > si.nPage) { delta = si.nPage*-1; if (delta >1) delta--; } else if (delta > 0 && delta > si.nPage) { delta = si.nPage; if (delta >1) delta--; } scroll(scroll_horizontally, scroll_position_delta, -delta); } return 1; } } SCROLLINFO si; memset(&si, 0, sizeof(SCROLLINFO)); si.fMask = SIF_PAGE; si.cbSize = sizeof(SCROLLINFO); GetScrollInfo(wnd, SB_VERT, &si); int new_pos = scroll_item_offset; int old_pos = scroll_item_offset; unsigned scroll_lines = GetNumScrollLines(); int zDelta = short(HIWORD(wp)); if (scroll_lines == -1) { scroll_lines = si.nPage > 1 ? si.nPage - 1 : 1; } int delta = MulDiv(zDelta, scroll_lines, 120); if (!si.nPage) si.nPage++; if (delta < 0 && delta*-1 > si.nPage) { delta = si.nPage*-1; if (delta >1) delta--; } else if (delta > 0 && delta > si.nPage) { delta = si.nPage; if (delta >1) delta--; } scroll(scroll_vertically, scroll_position_delta, -delta); } return 1; case WM_VSCROLL: { exit_inline_edit(); scroll(scroll_vertically, scroll_sb, LOWORD(wp)); } return 0; case WM_HSCROLL: { exit_inline_edit(); scroll(scroll_horizontally, scroll_sb, LOWORD(wp)); } return 0; case WM_MENUSELECT: { if (HIWORD(wp) & MF_POPUP) { m_status_override.release(); } else { if (g_main_menu_a.is_valid() || g_main_menu_b.is_valid()) { unsigned id = LOWORD(wp); bool set = false; pfc::string8 desc; if (g_main_menu_a.is_valid() && id < MENU_B_BASE) { set = g_main_menu_a->get_description(id - MENU_A_BASE, desc); } else if (g_main_menu_b.is_valid()) { contextmenu_node * node = g_main_menu_b->find_by_id(id - MENU_B_BASE); if (node) set = node->get_description(desc); } service_ptr_t<ui_status_text_override> p_status_override; if (set) { get_host()->override_status_text_create(p_status_override); if (p_status_override.is_valid()) { p_status_override->override_text(desc); } } m_status_override = p_status_override; } } } break; case WM_CONTEXTMENU: { uie::window_ptr p_this_temp = this; if ((HWND)wp == wnd_header) { POINT pt = { (short)LOWORD(lp), (short)HIWORD(lp) }; POINT temp; temp.x = pt.x; temp.y = pt.y; ScreenToClient(wnd_header, &temp); HDHITTESTINFO hittest; hittest.pt.x = temp.x; hittest.pt.y = temp.y; uSendMessage(wnd_header, HDM_HITTEST, 0, (LPARAM)&hittest); enum { IDM_ASC = 1, IDM_DES = 2, IDM_SEL_ASC, IDM_SEL_DES, IDM_AUTOSIZE, IDM_PREFS, IDM_EDIT_COLUMN, IDM_CUSTOM_BASE }; HMENU menu = CreatePopupMenu(); HMENU selection_menu = CreatePopupMenu(); if (!(hittest.flags & HHT_NOWHERE)) { uAppendMenu(menu, (MF_STRING), IDM_ASC, "&Sort ascending"); uAppendMenu(menu, (MF_STRING), IDM_DES, "Sort &descending"); uAppendMenu(selection_menu, (MF_STRING), IDM_SEL_ASC, "Sort a&scending"); uAppendMenu(selection_menu, (MF_STRING), IDM_SEL_DES, "Sort d&escending"); uAppendMenu(menu, MF_STRING | MF_POPUP, (UINT)selection_menu, "Se&lection"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); uAppendMenu(menu, (MF_STRING), IDM_EDIT_COLUMN, "&Edit this column"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); uAppendMenu(menu, (MF_STRING | (cfg_nohscroll ? MF_CHECKED : MF_UNCHECKED)), IDM_AUTOSIZE, "&Auto-sizing columns"); uAppendMenu(menu, (MF_STRING), IDM_PREFS, "&Preferences"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); pfc::string8 playlist_name; static_api_ptr_t<playlist_manager> playlist_api; playlist_api->activeplaylist_get_name(playlist_name); pfc::string8_fast_aggressive filter, name; int s, e = columns.get_count(); for (s = 0; s<e; s++) { bool add = false; switch (columns[s]->filter_type) { case FILTER_NONE: { add = true; break; } case FILTER_SHOW: { if (wildcard_helper::test(playlist_name, columns[s]->filter, true)) { add = true; /* g_columns.get_string(s, name, STRING_NAME); uAppendMenu(menu,MF_STRING|MF_CHECKED,IDM_CUSTOM_BASE+s,name);*/ } } break; case FILTER_HIDE: { if (!wildcard_helper::test(playlist_name, columns[s]->filter, true)) { add = true; /* g_columns.get_string(s, name, STRING_NAME); uAppendMenu(menu,MF_STRING|MF_CHECKED,IDM_CUSTOM_BASE+s,name);*/ } } break; } if (add) { uAppendMenu(menu, MF_STRING | (columns[s]->show ? MF_CHECKED : MF_UNCHECKED), IDM_CUSTOM_BASE + s, columns[s]->name); } } } else { uAppendMenu(menu, (MF_STRING | (cfg_nohscroll ? MF_CHECKED : MF_UNCHECKED)), IDM_AUTOSIZE, "&Auto-sizing columns"); uAppendMenu(menu, (MF_STRING), IDM_PREFS, "&Preferences"); } menu_helpers::win32_auto_mnemonics(menu); int cmd = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, wnd, 0); DestroyMenu(menu); if (cmd == IDM_ASC) { g_set_sort(hittest.iItem, false); } else if (cmd == IDM_DES) { g_set_sort(hittest.iItem, true); } else if (cmd == IDM_SEL_ASC) { g_set_sort(hittest.iItem, false, true); } else if (cmd == IDM_SEL_DES) { g_set_sort(hittest.iItem, true, true); } else if (cmd == IDM_EDIT_COLUMN) { g_set_tab("Columns"); cfg_cur_prefs_col = g_cache.active_column_active_to_actual(hittest.iItem); //get_idx static_api_ptr_t<ui_control>()->show_preferences(columns::config_get_playlist_view_guid()); } else if (cmd == IDM_AUTOSIZE) { cfg_nohscroll = cfg_nohscroll == 0; update_all_windows(); pvt::ng_playlist_view_t::g_on_autosize_change(); } else if (cmd == IDM_PREFS) { static_api_ptr_t<ui_control>()->show_preferences(columns::config_get_main_guid()); } else if (cmd >= IDM_CUSTOM_BASE) { if (t_size(cmd - IDM_CUSTOM_BASE) < columns.get_count()) { columns[cmd - IDM_CUSTOM_BASE]->show = !columns[cmd - IDM_CUSTOM_BASE]->show; //g_columns //if (!cfg_nohscroll) g_save_columns(); //g_cache.flush_all(); g_reset_columns(); update_all_windows(); pvt::ng_playlist_view_t::g_on_columns_change(); } } return 0; } else if ((HWND)wp == wnd) { //DWORD mp = GetMessagePos(); POINT px, pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; static_api_ptr_t<playlist_manager> playlist_api; if (playlist_api->activeplaylist_get_selection_count(1) > 0 && 1) { if (pt.x == -1 && pt.y == -1) { int focus = playlist_api->activeplaylist_get_focus_item(); unsigned last = get_last_viewable_item(); if (focus == -1 || focus < scroll_item_offset || focus > last) { px.x = 0; px.y = 0; } else { RECT rc; get_playlist_rect(&rc); px.x = 0; unsigned item_height = get_item_height(); px.y = (focus - scroll_item_offset)*(item_height)+item_height / 2 + rc.top; } pt = px; MapWindowPoints(wnd, HWND_DESKTOP, &pt, 1); } else { px = pt; ScreenToClient(wnd, &px); //int idx = hittest_item(px.x, px.y); //if (!is_visible(idx)) // SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0),0); } // int idx = hittest_item(px.x, px.y); enum { ID_PLAY = 1, ID_CUT, ID_COPY, ID_PASTE, ID_SELECTION, ID_CUSTOM_BASE = 0x8000 }; HMENU menu = CreatePopupMenu();//LoadMenu(core_api::get_my_instance(),MAKEINTRESOURCE(IDR_TREEPOPUP)); service_ptr_t<mainmenu_manager> p_manager_selection; service_ptr_t<contextmenu_manager> p_manager_context; p_manager_selection = standard_api_create_t<mainmenu_manager>(); contextmenu_manager::g_create(p_manager_context); if (p_manager_selection.is_valid()) { p_manager_selection->instantiate(mainmenu_groups::edit_part2_selection); p_manager_selection->generate_menu_win32(menu, ID_SELECTION, ID_CUSTOM_BASE - ID_SELECTION, standard_config_objects::query_show_keyboard_shortcuts_in_menus() ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); if (GetMenuItemCount(menu) > 0) uAppendMenu(menu, MF_SEPARATOR, 0, ""); } AppendMenu(menu, MF_STRING, ID_CUT, L"Cut"); AppendMenu(menu, MF_STRING, ID_COPY, L"Copy"); if (playlist_utils::check_clipboard()) AppendMenu(menu, MF_STRING, ID_PASTE, L"Paste"); AppendMenu(menu, MF_SEPARATOR, 0, NULL); if (p_manager_context.is_valid()) { const keyboard_shortcut_manager::shortcut_type shortcuts[] = { keyboard_shortcut_manager::TYPE_CONTEXT_PLAYLIST, keyboard_shortcut_manager::TYPE_CONTEXT }; p_manager_context->set_shortcut_preference(shortcuts, tabsize(shortcuts)); p_manager_context->init_context_playlist(standard_config_objects::query_show_keyboard_shortcuts_in_menus() ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); p_manager_context->win32_build_menu(menu, ID_CUSTOM_BASE, -1); } menu_helpers::win32_auto_mnemonics(menu); MENU_A_BASE = ID_SELECTION; MENU_B_BASE = ID_CUSTOM_BASE; g_main_menu_a = p_manager_selection; g_main_menu_b = p_manager_context; int cmd = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, wnd, 0); if (m_status_override.is_valid()) { m_status_override.release(); } DestroyMenu(menu); if (cmd) { if (cmd == ID_CUT) { playlist_utils::cut(); } else if (cmd == ID_COPY) { playlist_utils::copy(); } else if (cmd == ID_PASTE) { playlist_utils::paste(wnd); } else if (cmd >= ID_SELECTION && cmd<ID_CUSTOM_BASE) { if (p_manager_selection.is_valid()) { p_manager_selection->execute_command(cmd - ID_SELECTION); } } else if (cmd >= ID_CUSTOM_BASE) { if (p_manager_context.is_valid()) { p_manager_context->execute_by_id(cmd - ID_CUSTOM_BASE); } } } g_main_menu_a.release(); g_main_menu_b.release(); } // contextmenu_manager::win32_run_menu_context_playlist(wnd, 0, config_object::g_get_data_bool_simple(standard_config_objects::bool_show_keyboard_shortcuts_in_menus, true) ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); } } return 0; //#ifdef INLINE_EDIT case WM_PARENTNOTIFY: { if (wp == WM_DESTROY) { if (m_wnd_edit && (HWND)lp == m_wnd_edit) m_wnd_edit = 0; } } break; case MSG_KILL_INLINE_EDIT: exit_inline_edit(); return 0; #if 1 case WM_COMMAND: switch (wp) { case (EN_CHANGE << 16) | 667: { m_edit_changed = true; } break; } break; #endif case WM_TIMER: { if (wp == EDIT_TIMER_ID) { create_inline_edit_v2(m_edit_index, m_edit_column); if (m_edit_timer) { KillTimer(wnd_playlist, EDIT_TIMER_ID); m_edit_timer = false; } return 0; } } break; //#endif case WM_NOTIFY: switch (((LPNMHDR)lp)->idFrom) { case ID_PLAYLIST_TOOLTIP: switch (((LPNMHDR)lp)->code) { case TTN_SHOW: RECT rc, rc_tt; rc = tooltip; GetWindowRect(g_tooltip, &rc_tt); int offset = MulDiv(get_item_height() - rc_tt.bottom + rc_tt.top, 1, 2); rc.top += offset; SetWindowPos(g_tooltip, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); return TRUE; } break; case 5001: switch (((LPNMHDR)lp)->code) { case HDN_BEGINTRACKA: case HDN_BEGINTRACKW: { return (cfg_nohscroll ? TRUE : FALSE); } case HDN_ENDDRAG: { if (((LPNMHEADERA)lp)->iButton == 0) { if (((LPNMHEADERA)lp)->pitem && (((LPNMHEADERA)lp)->pitem->mask & HDI_ORDER)) { int from = ((LPNMHEADERA)lp)->iItem; int to = ((LPNMHEADERA)lp)->pitem->iOrder; if (to >= 0 && from != to) { int act_from = g_cache.active_column_active_to_actual(from), act_to = g_cache.active_column_active_to_actual(to); columns.move(act_from, act_to); //if (!cfg_nohscroll) g_save_columns(); g_reset_columns(); update_all_windows(); pvt::ng_playlist_view_t::g_on_columns_change(); } } else { } } return (TRUE); } case HDN_DIVIDERDBLCLICK: if (!cfg_nohscroll) { static_api_ptr_t<playlist_manager> playlist_api; HDC hdc; hdc = GetDC(wnd_playlist); int size; pfc::string8 text; SelectObject(hdc, g_font); int w = 0, n, t = playlist_api->activeplaylist_get_item_count(); for (n = 0; n<t; n++) { // playlist_api->format_title(n, text, g_playlist_entries.get_display_spec(((LPNMHEADER)lp)->iItem), NULL); g_cache.active_get_display_name(n, ((LPNMHEADER)lp)->iItem, text); size = ui_helpers::get_text_width_color(hdc, text, text.length()); if (size > w) w = size; } // g_playlist_entries.get_column(((LPNMHEADER)lp)->iItem)->_set_width(w+5); columns[g_cache.active_column_active_to_actual(((LPNMHEADER)lp)->iItem)]->width = w + 15; ReleaseDC(wnd_playlist, hdc); update_all_windows(); g_save_columns(); pvt::ng_playlist_view_t::g_on_column_widths_change(); } return 0; case HDN_ITEMCLICK: { bool des = false; static_api_ptr_t<playlist_manager> playlist_api; unsigned col; bool descending; bool sorted = g_cache.active_get_playlist_sort(col, &descending); if (sorted && col == ((LPNMHEADER)lp)->iItem) des = !descending; g_set_sort(((LPNMHEADER)lp)->iItem, des /*, playlist_api->activeplaylist_get_selection_count(1) && cfg_sortsel != 0*/); } break; case HDN_ITEMCHANGED: { if (!cfg_nohscroll) { if (((LPNMHEADER)lp)->pitem->mask & HDI_WIDTH) columns[g_cache.active_column_active_to_actual(((LPNMHEADER)lp)->iItem)]->width = ((LPNMHEADER)lp)->pitem->cxy; update_all_windows(wnd_header); g_save_columns(); pvt::ng_playlist_view_t::g_on_column_widths_change(); } } break; } break; } } return uDefWindowProc(wnd, msg, wp, lp); }
LRESULT album_list_window::on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_CREATE: { list_wnd.add_item(this); initialised = true; modeless_dialog_manager::g_add(wnd); create_tree(); create_filter(); if (cfg_populate) refresh_tree(); static_api_ptr_t<library_manager_v3>()->register_callback(this); } break; /*case WM_GETMINMAXINFO: { LPMINMAXINFO mmi = LPMINMAXINFO(lp); mmi->ptMinTrackSize.y = cfg_height; return 0; }*/ case WM_SIZE: on_size(LOWORD(lp), HIWORD(lp)); break; /* case DM_GETDEFID: return (DC_HASDEFID<<16|IDOK); case WM_GETDLGCODE: return DLGC_DEFPUSHBUTTON;*/ // break; case WM_TIMER: if (wp == EDIT_TIMER_ID) { refresh_tree(); KillTimer(wnd, wp); m_timer = false; } break; case WM_COMMAND: switch (wp) { case IDC_FILTER | (EN_CHANGE << 16) : if (m_timer) KillTimer(wnd_edit, 500); m_timer = SetTimer(wnd, EDIT_TIMER_ID, 500, NULL) != 0; return TRUE; case IDOK: if (GetKeyState(VK_SHIFT) & KF_UP) do_playlist(p_selection, false); else if (GetKeyState(VK_CONTROL) & KF_UP) do_playlist(p_selection, true, true); else do_playlist(p_selection, true); return 0; } break; case WM_CONTEXTMENU: { enum { ID_SEND = 1, ID_ADD, ID_NEW, ID_AUTOSEND, ID_REMOVE, ID_REMOVEDEAD, ID_REFRESH, ID_FILT, ID_CONF, ID_VIEW_BASE }; HMENU menu = CreatePopupMenu(); POINT pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; service_ptr_t<contextmenu_manager> p_menu_manager; unsigned IDM_MANAGER_BASE = 0; HWND list = wnd_tv; HTREEITEM treeitem = NULL; TVHITTESTINFO ti; memset(&ti, 0, sizeof(ti)); if (pt.x != -1 && pt.y != -1) { ti.pt = pt; ScreenToClient(list, &ti.pt); uSendMessage(list, TVM_HITTEST, 0, (long)&ti); if (ti.hItem && (ti.flags & TVHT_ONITEM)) { //FIX THIS AND AUTOSEND //TreeView_Select(list, ti.hItem, TVGN_DROPHILITE); //uSendMessage(list,TVM_SELECTITEM,TVGN_DROPHILITE,(long)ti.hItem); treeitem = ti.hItem; } } else { treeitem = TreeView_GetSelection(list); RECT rc; if (treeitem && TreeView_GetItemRect(wnd_tv, treeitem, &rc, TRUE)) { MapWindowPoints(wnd_tv, HWND_DESKTOP, (LPPOINT)&rc, 2); pt.x = rc.left; pt.y = rc.top + (rc.bottom - rc.top) / 2; } else { GetMessagePos(&pt); } } TreeView_Select(list, treeitem, TVGN_DROPHILITE); HMENU menu_view = CreatePopupMenu(); unsigned n, m = cfg_view_list.get_count(); string8_fastalloc temp; temp.prealloc(32); uAppendMenu(menu_view, MF_STRING | (!stricmp_utf8(directory_structure_view_name, view) ? MF_CHECKED : 0), ID_VIEW_BASE + 0, directory_structure_view_name); list_t<string_simple, pfc::alloc_fast> views; views.add_item(string_simple(directory_structure_view_name)); for (n = 0; n<m; n++) { temp = cfg_view_list.get_name(n); string_simple item(temp.get_ptr()); if (item) { uAppendMenu(menu_view, MF_STRING | (!stricmp_utf8(temp, view) ? MF_CHECKED : 0), ID_VIEW_BASE + views.add_item(item), temp); } } IDM_MANAGER_BASE = ID_VIEW_BASE + views.get_count(); uAppendMenu(menu, MF_STRING | MF_POPUP, (UINT)menu_view, "View"); if (!m_populated && !cfg_populate) uAppendMenu(menu, MF_STRING, ID_REFRESH, "Populate"); uAppendMenu(menu, MF_STRING | (m_filter ? MF_CHECKED : 0), ID_FILT, "Filter"); uAppendMenu(menu, MF_STRING, ID_CONF, "Settings"); bool show_shortcuts = standard_config_objects::query_show_keyboard_shortcuts_in_menus(); node * p_node = NULL; TVITEMEX tvi; memset(&tvi, 0, sizeof(tvi)); tvi.hItem = treeitem; tvi.mask = TVIF_HANDLE | TVIF_PARAM; TreeView_GetItem(list, &tvi); p_node = (node*)tvi.lParam; if (treeitem && p_node) { uAppendMenu(menu, MF_SEPARATOR, 0, ""); uAppendMenu(menu, MF_STRING, ID_SEND, (show_shortcuts ? "&Send to playlist\tEnter" : "&Send to playlist")); uAppendMenu(menu, MF_STRING, ID_ADD, show_shortcuts ? "&Add to playlist\tShift+Enter" : "&Add to playlist"); uAppendMenu(menu, MF_STRING, ID_NEW, show_shortcuts ? "Send to &new playlist\tCtrl+Enter" : "Send to &new playlist"); uAppendMenu(menu, MF_STRING, ID_AUTOSEND, "Send to &autosend playlist"); if (!static_api_ptr_t<core_version_info_v2>()->test_version(0, 9, 6, 0)) { uAppendMenu(menu, MF_STRING, ID_REMOVE, "&Remove from library"); uAppendMenu(menu, MF_STRING, ID_REMOVEDEAD, "Remove &dead entries (slow)"); } uAppendMenu(menu, MF_SEPARATOR, 0, ""); contextmenu_manager::g_create(p_menu_manager); p_node->sort_entries(); if (p_menu_manager.is_valid()) { p_menu_manager->init_context(p_node->get_entries(), 0); p_menu_manager->win32_build_menu(menu, IDM_MANAGER_BASE, -1); menu_helpers::win32_auto_mnemonics(menu); } } int cmd = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, get_wnd(), 0); DestroyMenu(menu); TreeView_Select(list, NULL, TVGN_DROPHILITE); if (cmd) { if (p_menu_manager.is_valid() && (unsigned)cmd >= IDM_MANAGER_BASE) { p_menu_manager->execute_by_id(cmd - IDM_MANAGER_BASE); } else if (cmd >= ID_VIEW_BASE) { unsigned n = cmd - ID_VIEW_BASE; if (n<views.get_count()) { view = views[n].get_ptr(); refresh_tree(); } } else if (cmd<ID_VIEW_BASE) { unsigned cmd2 = 0; switch (cmd) { case ID_NEW: do_playlist(p_node, true, true); break; case ID_SEND: do_playlist(p_node, true); break; case ID_ADD: do_playlist(p_node, false); break; case ID_AUTOSEND: do_autosend_playlist(p_node, view, true); break; case ID_CONF: { static_api_ptr_t<ui_control>()->show_preferences(g_guid_preferences_album_list_panel); } break; case ID_FILT: { m_filter = !m_filter; create_or_destroy_filter(); } break; case ID_REMOVE: p_node->remove_from_db(); break; case ID_REMOVEDEAD: p_node->remove_dead(); break; case ID_REFRESH: if (!m_populated && !cfg_populate) refresh_tree(); break; } if (cmd2) uSendMessage(get_wnd(), WM_COMMAND, cmd2, 0); } } p_menu_manager.release(); /* if (treeitem_context && (treeitem_context != treeitem) && cfg_autosend) TreeView_SelectItem(wnd_tv,treeitem);*/ } return 0; case WM_NOTIFY: { LPNMHDR hdr = (LPNMHDR)lp; switch (hdr->idFrom) { case IDC_TREE: { if (hdr->code == TVN_ITEMEXPANDING) { LPNMTREEVIEW param = (LPNMTREEVIEW)hdr; if (cfg_picmixer && (param->action == TVE_EXPAND)) { TreeView_CollapseOtherNodes(param->hdr.hwndFrom, param->itemNew.hItem); } } else if (hdr->code == TVN_SELCHANGED) { LPNMTREEVIEW param = (LPNMTREEVIEW)hdr; p_selection = (node*)param->itemNew.lParam; if ((param->action == TVC_BYMOUSE || param->action == TVC_BYKEYBOARD)) { if (cfg_autosend) do_autosend_playlist(p_selection, view); } if (m_selection_holder.is_valid()) { m_selection_holder->set_selection(p_selection.is_valid() ? p_selection->get_entries() : metadb_handle_list()); } #if 0 if (cfg_picmixer) { HTREEITEM ti_parent_old = TreeView_GetParent(param->hdr.hwndFrom, param->itemOld.hItem); HTREEITEM ti_parent_new = TreeView_GetParent(param->hdr.hwndFrom, param->itemNew.hItem); if (/*ti_parent_old != param->itemNew.hItem && */!TreeView_IsChild(param->hdr.hwndFrom, param->itemNew.hItem, param->itemOld.hItem)) { HTREEITEM ti = //TreeView_GetLevel(param->hdr.hwndFrom, param->itemNew.hItem) < TreeView_GetLevel(param->hdr.hwndFrom, param->itemOld.hItem) ? TreeView_GetCommonParentChild(param->hdr.hwndFrom, param->itemOld.hItem, param->itemNew.hItem) //: param->itemOld.hItem ; if (ti && ti != TVI_ROOT) TreeView_Expand(param->hdr.hwndFrom, ti, TVE_COLLAPSE); } if (ti_parent_new) { HTREEITEM child = TreeView_GetChild(param->hdr.hwndFrom, ti_parent_new); while (child) { if (child != param->itemNew.hItem) { } } } } #endif } } break; } } break; case WM_DESTROY: static_api_ptr_t<library_manager_v3>()->unregister_callback(this); modeless_dialog_manager::g_remove(wnd); destroy_tree(); destroy_filter(); m_selection_holder.release(); m_root.release(); p_selection.release(); if (initialised) { list_wnd.remove_item(this); if (list_wnd.get_count() == 0) { DeleteFont(g_font); g_font = 0; } initialised = false; } break; } return DefWindowProc(wnd, msg, wp, lp); }
void CPlaylistWindow_RenameMenu(const int iItem, const int iSubItem) { HWND hWndList; POINT ptItem; RECT rSubItem; HMENU hmMenu; UINT uiMenuCommand; // We want to get the subitem's rect in the co-ordinate space of the dialog hWndList = CLV_GetHWND(globals.m_hPlaylistViewControl); CLV_GetItemSubRect(globals.m_hPlaylistViewControl, &rSubItem, iItem, iSubItem); ptItem.x = rSubItem.left; ptItem.y = rSubItem.bottom; ClientToScreen(hWndList, &ptItem); // Create menu hmMenu = CreatePopupMenu(); AppendMenu(hmMenu, MF_STRING, (DWORD)rwsArtistAlbumNumberTitle, "Rename to <artist> - <album> - <tracknum> - <title>"); AppendMenu(hmMenu, MF_STRING, (DWORD)rwsArtistNumberTitle, "Rename to <artist> - <tracknum> - <title>"); AppendMenu(hmMenu, MF_STRING, (DWORD)rwsAlbumNumberTitle, "Rename to <album> - <tracknum> - <title>"); AppendMenu(hmMenu, MF_STRING, (DWORD)rwsAlbumNumber, "Rename to <album> - <tracknum>"); AppendMenu(hmMenu, MF_STRING, (DWORD)rwsNumberTitle, "Rename to <tracknum> - <title>"); AppendMenu(hmMenu, MF_STRING, (DWORD)rwsTitle, "Rename to <title>"); uiMenuCommand = TrackPopupMenuEx(hmMenu, TPM_NONOTIFY | TPM_RETURNCMD | TPM_RIGHTBUTTON, ptItem.x, ptItem.y, IF_GetHWnd(windows.m_hifPlaylist), NULL); DestroyMenu(hmMenu); if (uiMenuCommand) { int iSearchItemIDX; int iNumberOfErrors; iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM); iNumberOfErrors = 0; while (iSearchItemIDX != CPC_INVALIDITEM) { BOOL bSucceeded; bSucceeded = CPLI_RenameTrack((CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX), (CPe_FilenameFormat)uiMenuCommand); iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX); if (!bSucceeded) iNumberOfErrors++; } if (iNumberOfErrors > 0) { MessageBox(IF_GetHWnd(windows.m_hifPlaylist), "Some files could not be renamed.\n\nThis could be because they are either currently playing or are read-only.", "Error", MB_OK | MB_ICONASTERISK); } } }
/*********************************************************************** * OleUIAddVerbMenuW (OLEDLG.14) */ BOOL WINAPI OleUIAddVerbMenuW(IOleObject *object, LPCWSTR shorttype, HMENU hMenu, UINT uPos, UINT idmin, UINT idmax, BOOL addConvert, UINT idConvert, HMENU *ret_submenu) { IEnumOLEVERB *enumverbs = NULL; LPOLESTR usertype = NULL; OLEVERB firstverb, verb; WCHAR *objecttype; WCHAR resstrW[32]; /* should be enough */ DWORD_PTR args[2]; BOOL singleverb; HMENU submenu; WCHAR *str; TRACE("(%p, %s, %p, %d, %d, %d, %d, %d, %p)\n", object, debugstr_w(shorttype), hMenu, uPos, idmin, idmax, addConvert, idConvert, ret_submenu); if (ret_submenu) *ret_submenu = NULL; if (!hMenu || !ret_submenu) return FALSE; /* check if we can get verbs at all */ if (object) IOleObject_EnumVerbs(object, &enumverbs); LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_OBJECT, resstrW, sizeof(resstrW)/sizeof(WCHAR)); /* no object, or object without enumeration support */ if (!object || !enumverbs) { InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_STRING|MF_GRAYED, idmin, resstrW); return FALSE; } /* root entry string */ if (!shorttype && (IOleObject_GetUserType(object, USERCLASSTYPE_SHORT, &usertype) == S_OK)) objecttype = usertype; else objecttype = (WCHAR*)shorttype; /* iterate through verbs */ /* find first suitable verb */ get_next_insertable_verb(enumverbs, idmin, idmax, &firstverb); singleverb = get_next_insertable_verb(enumverbs, idmin, idmax, &verb) != S_OK; if (singleverb && !addConvert) { LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_SINGLEVERB_OBJECT, resstrW, sizeof(resstrW)/sizeof(WCHAR)); args[0] = (DWORD_PTR)firstverb.lpszVerbName; args[1] = (DWORD_PTR)objecttype; FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_ARGUMENT_ARRAY, resstrW, 0, 0, (WCHAR*)&str, 0, (__ms_va_list*)args); RemoveMenu(hMenu, uPos, MF_BYPOSITION); InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_STRING, idmin, str); CoTaskMemFree(firstverb.lpszVerbName); HeapFree(GetProcessHeap(), 0, str); IEnumOLEVERB_Release(enumverbs); CoTaskMemFree(usertype); return TRUE; } submenu = CreatePopupMenu(); insert_verb_to_menu(submenu, idmin, &firstverb); CoTaskMemFree(firstverb.lpszVerbName); if (!singleverb) { insert_verb_to_menu(submenu, idmin, &verb); CoTaskMemFree(verb.lpszVerbName); } while (get_next_insertable_verb(enumverbs, idmin, idmax, &verb) == S_OK) { insert_verb_to_menu(submenu, idmin, &verb); CoTaskMemFree(verb.lpszVerbName); } /* convert verb is at the bottom of a popup, separated from verbs */ if (addConvert) { LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_CONVERT, resstrW, sizeof(resstrW)/sizeof(WCHAR)); InsertMenuW(submenu, ~0, MF_BYPOSITION|MF_SEPARATOR, 0, NULL); InsertMenuW(submenu, ~0, MF_BYPOSITION|MF_STRING, idConvert, resstrW); } if (submenu) *ret_submenu = submenu; /* now submenu is ready, add root entry to original menu, attach submenu */ LoadStringW(OLEDLG_hInstance, IDS_VERBMENU_OBJECT_WITH_NAME, resstrW, sizeof(resstrW)/sizeof(WCHAR)); args[0] = (DWORD_PTR)objecttype; FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_ARGUMENT_ARRAY, resstrW, 0, 0, (WCHAR*)&str, 0, (__ms_va_list*)args); InsertMenuW(hMenu, uPos, MF_BYPOSITION|MF_POPUP|MF_STRING, (UINT_PTR)submenu, str); HeapFree(GetProcessHeap(), 0, str); IEnumOLEVERB_Release(enumverbs); CoTaskMemFree(usertype); return TRUE; }
LRESULT nsf_window::onCreate(UINT uMsg, WPARAM wParam, LPARAM lParam) { RECT rcClient; GetClientRect(&rcClient); // get nsd/nsf unsigned long params[2]; params[0] = (unsigned long)&nsf; params[1] = (unsigned long)&nsd; SendMessageRoot(MSG_GET_NSD, (WPARAM)0, (LPARAM)params); mainList = new entryList(IDC_MAINTREE, ENTRYLIST_NSF, nsf, nsd, 0, 0, 200, rcClient.bottom, hSelf); globalList = new entryList(IDC_GLOBALTREE, ENTRYLIST_DEFAULT, nsf, nsd, 484, 0, 118, rcClient.bottom, hSelf); lookupList = new entryList(IDC_LOOKUPTREE, ENTRYLIST_NSD, nsf, nsd, 602, 0, 236, rcClient.bottom, hSelf); //484, 354 hCodeMenu = CreatePopupMenu(); AppendMenu(hCodeMenu, MF_STRING, ID_GOOL_VIEW, "Open in Code View"); hModelMenuA = CreatePopupMenu(); AppendMenu(hModelMenuA, MF_STRING, ID_MODEL_VIEW, "Open in Model/Zone View"); AppendMenu(hModelMenuA, MF_SEPARATOR, ID_SEPARATOR, ""); AppendMenu(hModelMenuA, MF_STRING, ID_MODEL_EXPORT_AS_COLLADA, "Export as COLLADA"); hModelMenuB = CreatePopupMenu(); AppendMenu(hModelMenuB, MF_STRING, ID_MODEL_EXPORT_AS_MD3, "Export as .MD3"); CreateWindowEx(0, WC_STATIC, "", WS_CHILD | WS_VISIBLE | SS_ETCHEDFRAME, 210, 10, 250, 110, hSelf, NULL, hInstance, NULL); CreateWindowEx(0, WC_STATIC, "Type: ", WS_CHILD | WS_VISIBLE | SS_CENTER, 220, 25, 110, 22, hSelf, NULL, hInstance, NULL); CreateWindowEx(0, WC_STATIC, "Entry Count: ", WS_CHILD | WS_VISIBLE | SS_CENTER, 220, 55, 110, 22, hSelf, NULL, hInstance, NULL); CreateWindowEx(0, WC_STATIC, "Checksum: ", WS_CHILD | WS_VISIBLE | SS_CENTER, 220, 85, 110, 22, hSelf, NULL, hInstance, NULL); CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE, 320, 25, 100, 22, hSelf, (HMENU)IDC_CHUNKTYPEEDIT, hInstance, NULL); CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE, 320, 55, 100, 22, hSelf, (HMENU)IDC_CHUNKENTRYCOUNTEDIT, hInstance, NULL); CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE, 320, 85, 100, 22, hSelf, (HMENU)IDC_CHUNKCHECKSUMEDIT, hInstance, NULL); CreateWindowEx(0, WC_STATIC, "", WS_CHILD | WS_VISIBLE | SS_ETCHEDFRAME, 210, 130, 250, 110, hSelf, NULL, hInstance, NULL); CreateWindowEx(0, WC_STATIC, "Type: ", WS_CHILD | WS_VISIBLE | SS_CENTER, 220, 145, 110, 22, hSelf, NULL, hInstance, NULL); CreateWindowEx(0, WC_STATIC, "Item Count: ", WS_CHILD | WS_VISIBLE | SS_CENTER, 220, 175, 110, 22, hSelf, NULL, hInstance, NULL); CreateWindowEx(0, WC_STATIC, "n/a: ", WS_CHILD | WS_VISIBLE | SS_CENTER, 220, 205, 110, 22, hSelf, NULL, hInstance, NULL); CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE, 320, 145, 100, 22, hSelf, (HMENU)IDC_ENTRYTYPEEDIT, hInstance, NULL); CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE, 320, 175, 100, 22, hSelf, (HMENU)IDC_ENTRYITEMCOUNTEDIT, hInstance, NULL); CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE, 320, 205, 100, 22, hSelf, (HMENU)IDC_UNUSEDEDIT, hInstance, NULL); mainList->occupy(); lookupList->occupy(); for (int lp=0; lp<MAX_LEVELEIDS; lp++) globalList->lookupAddEntry(nsd->levelEIDs[lp]); return NULL; }
void CPlaylistWindow_TrackStackMenu(iItem) { HWND hWndList; POINT ptItem; RECT rSubItem; HMENU hmMenu; UINT uiMenuCommand; int iSearchItemIDX; CP_HPLAYLISTITEM hClickedItem; CPe_ItemStackState enClickedItemState; BOOL bMultipleSelection; // We want to get the subitem's rect in the co-ordinate space of the dialog hWndList = CLV_GetHWND(globals.m_hPlaylistViewControl); CLV_GetItemSubRect(globals.m_hPlaylistViewControl, &rSubItem, iItem, 0); // Are there multiple items selected? iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM); if (iSearchItemIDX != CPC_INVALIDITEM) iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX); if (iSearchItemIDX != CPC_INVALIDITEM) bMultipleSelection = TRUE; else bMultipleSelection = FALSE; ptItem.x = rSubItem.left; ptItem.y = rSubItem.bottom; ClientToScreen(hWndList, &ptItem); // Create menu hmMenu = CreatePopupMenu(); hClickedItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iItem); enClickedItemState = CPL_Stack_GetItemState(globals.m_hPlaylist, hClickedItem); if (enClickedItemState != issUnstacked) { AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYFROMHERE, "Play from here"); SetMenuDefaultItem(hmMenu, IDC_CMDTS_PLAYFROMHERE, FALSE); if (enClickedItemState != issStacked_Top) { AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNEXT, "Play next"); AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_UNSTACK, "Unstack"); } // Not played yet? if (enClickedItemState == issStacked || enClickedItemState == issStacked_Top) { if (options.repeat_playlist == TRUE) { AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER, "Repeat after this"); AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER_NOREP, "Stop after this (repeat->off)"); } else { AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_STOPAFTER, "Stop after this"); } } if (enClickedItemState != issStacked_Top) AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_QUEUE, "Queue at end"); } else { AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNOW, "Play now"); SetMenuDefaultItem(hmMenu, IDC_CMDTS_PLAYNOW, FALSE); AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_PLAYNEXT, "Play next"); AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_QUEUE, "Queue at end"); } AppendMenu(hmMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_CLEARSTACK, "Clear stack"); AppendMenu(hmMenu, MF_STRING, IDC_CMDTS_RESTACKALL, "Restack all"); uiMenuCommand = TrackPopupMenuEx(hmMenu, TPM_NONOTIFY | TPM_RETURNCMD | TPM_RIGHTBUTTON, ptItem.x, ptItem.y, IF_GetHWnd(windows.m_hifPlaylist), NULL); DestroyMenu(hmMenu); if (uiMenuCommand == IDC_CMDTS_CLEARSTACK) { CPL_Stack_Clear(globals.m_hPlaylist); } else if (uiMenuCommand == IDC_CMDTS_RESTACKALL) { CPL_Stack_RestackAll(globals.m_hPlaylist); } else if (uiMenuCommand == IDC_CMDTS_PLAYFROMHERE) { CPL_Stack_SetCursor(globals.m_hPlaylist, hClickedItem); CPL_PlayItem(globals.m_hPlaylist, TRUE, pmCurrentItem); } else if (uiMenuCommand == IDC_CMDTS_UNSTACK) { iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM); while (iSearchItemIDX != CPC_INVALIDITEM) { CPL_Stack_Remove(globals.m_hPlaylist, (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX)); iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX); } } else if (uiMenuCommand == IDC_CMDTS_PLAYNOW) { CP_HPLAYLISTITEM hFirstItem; CPL_Stack_ClipFromCurrent(globals.m_hPlaylist); iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM); hFirstItem = NULL; while (iSearchItemIDX != CPC_INVALIDITEM) { CP_HPLAYLISTITEM hItem; hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX); if (!hFirstItem) hFirstItem = hItem; CPL_Stack_Append(globals.m_hPlaylist, hItem); iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX); } CPL_Stack_SetCursor(globals.m_hPlaylist, hFirstItem); CPL_PlayItem(globals.m_hPlaylist, TRUE, pmCurrentItem); } else if (uiMenuCommand == IDC_CMDTS_STOPAFTER) { CPL_Stack_ClipFromItem(globals.m_hPlaylist, hClickedItem); } else if (uiMenuCommand == IDC_CMDTS_STOPAFTER_NOREP) { options.repeat_playlist = FALSE; InvalidateRect(windows.wnd_main, NULL, FALSE); CPL_Stack_ClipFromItem(globals.m_hPlaylist, hClickedItem); } else if (uiMenuCommand == IDC_CMDTS_PLAYNEXT) { iSearchItemIDX = CLV_GetPrevSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM); while (iSearchItemIDX != CPC_INVALIDITEM) { CPL_Stack_PlayNext(globals.m_hPlaylist, (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX)); iSearchItemIDX = CLV_GetPrevSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX); } } else if (uiMenuCommand == IDC_CMDTS_QUEUE) { iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, CPC_INVALIDITEM); while (iSearchItemIDX != CPC_INVALIDITEM) { CP_HPLAYLISTITEM hItem; hItem = (CP_HPLAYLISTITEM)CLV_GetItemData(globals.m_hPlaylistViewControl, iSearchItemIDX); CPL_Stack_Remove(globals.m_hPlaylist, hItem); CPL_Stack_Append(globals.m_hPlaylist, hItem); iSearchItemIDX = CLV_GetNextSelectedItem(globals.m_hPlaylistViewControl, iSearchItemIDX); } } }
int spline_win_message(SCREEN *sc,HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam) { extern SPLINE_EDIT spline_edit; typedef enum CMDMENU{ CMD_ADDKEY,CMD_DELKEY }; static int clickx=0,clicky=0,debounce=0; static PARAM_CONTROL *pcdrag=0; static HMENU hmenu=0; static SPLINE_KEY_CONTROL *selected_key=0; PARAM_CONTROL *p; p=spline_edit.plist.list; if(FALSE) if(msg!=WM_PAINT&&msg!=WM_SETCURSOR&&msg!=WM_NCHITTEST&&msg!=WM_ENTERIDLE) { static DWORD tick; if((GetTickCount()-tick)>500) printf("--\n"); printf("spl"); print_msg(msg,lparam,wparam,hwnd); tick=GetTickCount(); } switch(msg){ case WM_CREATE: { hmenu=CreatePopupMenu(); if(hmenu){ InsertMenu(hmenu,0xFFFFFFFF,MF_BYPOSITION,CMD_ADDKEY,"add key"); InsertMenu(hmenu,0xFFFFFFFF,MF_BYPOSITION,CMD_DELKEY,"delete key"); } } break; case WM_CONTEXTMENU: if(hmenu){ POINT point; int x,y; point.x=x=LOWORD(lparam); point.y=y=HIWORD(lparam); MapWindowPoints(NULL,hwnd,&point,1); clickx=x; clicky=y; point.x+=spline_edit.plist.si.hscroll; point.y+=spline_edit.plist.si.vscroll; if(hittest_param(p,point.x,point.y,0)){ TrackPopupMenu(hmenu,TPM_LEFTALIGN,x,y,0,hwnd,NULL); } } break; case WM_KEYFIRST: switch(wparam){ case VK_DELETE: PostMessage(hwnd,WM_COMMAND,CMD_DELKEY,0); break; } break; case WM_COMMAND: { PARAM_CONTROL *pc=0; if(p){ find_param_type(&spline_edit.plist,CSPLINE,&pc); if(pc){ } } switch(LOWORD(wparam)){ case CMD_ADDKEY: { SPLINE_KEY *sk=0; POINT p; p.x=clickx; p.y=clicky; MapWindowPoints(NULL,hwnd,&p,1); p.x+=spline_edit.plist.si.hscroll; p.y+=spline_edit.plist.si.vscroll; add_splinekey(pc,&sk,p.x,p.y); } break; case CMD_DELKEY: del_sel_keys(pc); break; } } break; case WM_MOUSEWHEEL: { POINT point; PARAM_CONTROL *pc=0; point.x=LOWORD(lparam); point.y=HIWORD(lparam); MapWindowPoints(NULL,hwnd,&point,1); point.x+=spline_edit.plist.si.hscroll; point.y+=spline_edit.plist.si.vscroll; if(hittest_param(p,point.x,point.y,&pc) && pc->control.type==CDROPLIST){ signed short deltay=(HIWORD(wparam)); send_mouse_wheel(pc,deltay); update_spline_selection(&spline_edit.plist); } else{ short w=HIWORD(wparam); int key=LOWORD(wparam); int amount=DEFBUTTONH; int control=0; if(key&MK_SHIFT) amount<<=2; if(key&MK_CONTROL) control=1; if(w>0) amount=-amount; scroll_view(hwnd,sc,&spline_edit.plist.si,amount,control); } } break; case WM_MOUSEMOVE: set_focus(hwnd); if(pcdrag){ int x,y,deltax,deltay; int lmb,mmb,rmb,ctrl,shift; lmb=wparam&MK_LBUTTON; mmb=wparam&MK_MBUTTON; rmb=wparam&MK_RBUTTON; shift=wparam&MK_SHIFT; ctrl=wparam&MK_CONTROL; x=LOWORD(lparam); y=HIWORD(lparam); deltax=x-clickx; deltay=y-clicky; if(debounce==0){ int size=4; if((deltax<-size) || (deltax>size)) debounce=1; if((deltay<-size) || (deltay>size)) debounce=1; if(debounce==0) break; else{ if(deltax<0) deltax+=size; else deltax-=size; if(deltay<0) deltay+=size; else deltay-=size; } } send_mouse_move(pcdrag,deltax,deltay,lmb,mmb,rmb,shift,ctrl); if(selected_key && pcdrag->control.type==CSPLINE) handle_spline_key_move(pcdrag->control.data,selected_key,deltax,deltay); clickx=x; clicky=y; } else{ int x,y; x=LOWORD(lparam); y=HIWORD(lparam); if(!(wparam&MK_LBUTTON)){ spline_edit.plist.si.vscroll_pressed=FALSE; spline_edit.plist.si.hscroll_pressed=FALSE; } if(spline_edit.plist.si.vscroll_pressed){ float delta=y-clicky; RECT rect={0}; int h,bh,range,d; GetWindowRect(hwnd,&rect); h=rect.bottom-rect.top; range=sc->h-h; bh=h-(range/3); if(bh<10){ bh=10; if(h<10) bh=h; } d=h-bh; if(d<=0) d=1; delta=delta*range/d; spline_edit.plist.si.vscroll+=(int)delta; clicky=y; } if(spline_edit.plist.si.hscroll_pressed){ float delta=x-clickx; RECT rect={0}; int w,bw,range,d; GetWindowRect(hwnd,&rect); w=rect.right-rect.left; range=sc->w-w; bw=w-(range/3); if(bw<10){ bw=10; if(w<10) bw=w; } d=w-bw; if(d<=0) d=1; delta=delta*range/d; spline_edit.plist.si.hscroll+=(int)delta; clickx=x; } { int x,y; PARAM_CONTROL *pc=0; x=LOWORD(lparam); y=HIWORD(lparam); if(hittest_param(p,x,y,&pc)){ if(pc->control.type==CPOPUPLIST){ handle_popup_list(&spline_edit.plist,pc,WM_MOUSEMOVE,x,y); } } } } break; case WM_LBUTTONUP: if(pcdrag && pcdrag->control.type==CBUTTON){ BUTTON *b=pcdrag->control.data; if(b) b->pressed=FALSE; } spline_edit.plist.si.hscroll_pressed=0; spline_edit.plist.si.vscroll_pressed=0; pcdrag=0; selected_key=0; break; case WM_LBUTTONDOWN: { int x,y; PARAM_CONTROL *pc=0; clickx=x=LOWORD(lparam); clicky=y=HIWORD(lparam); x+=spline_edit.plist.si.hscroll; y+=spline_edit.plist.si.vscroll; debounce=0; if(check_scroll_hit(sc,&spline_edit.plist.si,hwnd,x,y)) break; clear_param_selected(p); if(hittest_param(p,x,y,&pc)){ int list_handled=FALSE; if(pc->control.type==CDROPLIST){ DROPLIST *dl=pc->control.data; handle_drop_list(&spline_edit.plist,pc); list_handled=TRUE; } else if(pc->control.type==CPOPUPLIST){ handle_popup_list(&spline_edit.plist,pc,WM_LBUTTONDOWN,x,y); update_spline_selection(&spline_edit.plist); list_handled=TRUE; } else if(pc->control.type==CBUTTON){ BUTTON *b=pc->control.data; if(b) b->pressed=TRUE; } else if(pc->control.type==CSPLINE){ handle_spline_click(pc->control.data,x,y,&selected_key,wparam); } if(!list_handled) remove_popup(&spline_edit.plist); pc->has_focus=TRUE; pcdrag=pc; } else{ pcdrag=0; remove_popup(&spline_edit.plist); } } break; } return 0; }
MenuPopUp::MenuPopUp(std::string text) : Label(text, 0, 0, 0, 0) { hwnd = (HWND)CreatePopupMenu(); }
BOOL CALLBACK EV_DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: { EV_shared=hwndDlg; EV_list_hwnd=GetDlgItem(hwndDlg, IDC_LIST); } return TRUE; case WM_CLOSE: { EndDialog(hwndDlg, 0); } return TRUE; case WM_BROWSE: { SendMessageA(EV_list_hwnd, LB_RESETCONTENT, 0, 0); strcpy(EV_szFileName, (const char*)wParam); strcpy(EV_program_dir, EV_szFileName); int i=strlen(EV_program_dir); while(EV_program_dir[i]!='\\') i--; EV_program_dir[i]=0; CreateThread(0, 0, EV_DebugThread, 0, 0, 0); } return TRUE; case WM_DROPFILES: { SendMessageA(EV_list_hwnd, LB_RESETCONTENT, 0, 0); DragQueryFileA((HDROP)wParam, 0, EV_szFileName, MAX_PATH); strcpy(EV_program_dir, EV_szFileName); int i=strlen(EV_program_dir); while(EV_program_dir[i]!='\\') i--; EV_program_dir[i]=0; CreateThread(0, 0, EV_DebugThread, 0, 0, 0); } return TRUE; case WM_CONTEXTMENU: { if(GetDlgCtrlID((HWND)wParam)==IDC_LIST) { LeftClick(); LeftClick(); } } return TRUE; case WM_HELP: { char id[10]=""; sprintf(id, "%d", IDS_HELPEVLOG); SetEnvironmentVariableA("HELPID", id); SetEnvironmentVariableA("HELPTITLE", "EVLog Help"); DialogBox(hInst, MAKEINTRESOURCE(DLG_HELP), hwndDlg, DlgHelp); } return TRUE; case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_LIST: { switch(HIWORD(wParam)) { case LBN_DBLCLK: { int cursel=SendMessageA(EV_list_hwnd, LB_GETCURSEL, 0, 0); int count=SendMessageA(EV_list_hwnd, LB_GETCOUNT, 0, 0); if(!count) return TRUE; char line_text[1024]=""; char var_name[512]=""; char var_value[512]=""; SendMessageA(EV_list_hwnd, LB_GETTEXT, cursel, (LPARAM)line_text); int len=strlen(line_text); for(int i=0,j=0,k=0,l=0; i<len; i++) { if(line_text[i]=='=') { i++; j=1; } if(!j) k+=sprintf(var_name+k, "%c", line_text[i]); else l+=sprintf(var_value+l, "%c", line_text[i]); } HMENU myMenu=0; myMenu=CreatePopupMenu(); AppendMenu(myMenu, MF_STRING, 1, "Copy Variable &Name"); if(strcmp(var_value, "(0)")) AppendMenu(myMenu, MF_STRING, 2, "Copy Variable &Value"); AppendMenu(myMenu, MF_STRING, 3, "Copy &Line"); POINT cursorPos; GetCursorPos(&cursorPos); SetForegroundWindow(hwndDlg); UINT MenuItemClicked=TrackPopupMenu(myMenu, TPM_RETURNCMD|TPM_NONOTIFY, cursorPos.x, cursorPos.y, 0, hwndDlg, 0); SendMessage(hwndDlg, WM_NULL, 0, 0); switch(MenuItemClicked) { case 1: CopyToClipboard(var_name); break; case 2: CopyToClipboard(var_value); break; case 3: CopyToClipboard(line_text); break; } } return TRUE; } } return TRUE; case IDC_BTN_DUMP: { char massive_string[32768]="", single_string[255]="Coded by Mr. eXoDia // T.P.o.D.T 2012\r\n\r\n"; int total=SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETCOUNT, 0, 0); for(int i=0; i!=total; i++) { SendDlgItemMessage(hwndDlg, IDC_LIST, LB_GETTEXT, (WPARAM)i, (LPARAM)single_string); sprintf(massive_string, "%s%s\r\n", massive_string, single_string); } char log_filename[MAX_PATH]=""; log_filename[0]=0; OPENFILENAME ofstruct; memset(&ofstruct, 0, sizeof(ofstruct)); ofstruct.lStructSize=sizeof(ofstruct); ofstruct.hwndOwner=hwndDlg; ofstruct.hInstance=hInst; ofstruct.lpstrFilter="Log files (*.log)\0*.log\0\0"; ofstruct.lpstrFile=log_filename; ofstruct.nMaxFile=MAX_PATH; ofstruct.lpstrInitialDir=EV_program_dir; ofstruct.lpstrTitle="Save file"; ofstruct.lpstrDefExt="log"; ofstruct.Flags=OFN_EXTENSIONDIFFERENT|OFN_HIDEREADONLY|OFN_NONETWORKBUTTON|OFN_OVERWRITEPROMPT; GetSaveFileName(&ofstruct); if(!log_filename[0]) return TRUE; HANDLE hFile=CreateFileA(log_filename, GENERIC_ALL, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if(hFile==INVALID_HANDLE_VALUE) { MessageBoxA(hwndDlg, "Could not create the file, maybe it's in use...", "Error!", MB_ICONERROR); return TRUE; } DWORD written=0; if(!WriteFile(hFile, massive_string, strlen(massive_string), &written, 0)) { CloseHandle(hFile); MessageBoxA(hwndDlg, "Could not write to the file, maybe it's in use...", "Error!", MB_ICONERROR); return TRUE; } CloseHandle(hFile); } return TRUE; } } return TRUE; } return FALSE; }
LRESULT splitter_window_impl::on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_NCCREATE: m_wnd = wnd; g_instances.add_item(this); break; case WM_CREATE: if (!g_count++) { g_font_menu_horizontal = uCreateMenuFont(); g_font_menu_vertical = uCreateMenuFont(true); } refresh_children(); break; case WM_DESTROY: destroy_children(); if (!--g_count) { g_font_menu_horizontal.release(); g_font_menu_vertical.release(); } break; case WM_NCDESTROY: g_instances.remove_item(this); m_wnd = NULL; break; case WM_SHOWWINDOW: if (wp == TRUE && lp == 0) { unsigned n, count = m_panels.get_count(); for (n = 0; n<count; n++) { ShowWindow(m_panels[n]->m_wnd_child, SW_SHOWNORMAL); ShowWindow(m_panels[n]->m_wnd, SW_SHOWNORMAL); } RedrawWindow(wnd, 0, 0, RDW_UPDATENOW | RDW_ALLCHILDREN); } break; case WM_WINDOWPOSCHANGED: { LPWINDOWPOS lpwp = (LPWINDOWPOS)lp; if (!(lpwp->flags & SWP_NOSIZE)) { on_size_changed(lpwp->cx, lpwp->cy); } } break; /*case WM_SIZE: on_size_changed(LOWORD(lp), HIWORD(lp)); break;*/ case WM_GETMINMAXINFO: { LPMINMAXINFO lpmmi = (LPMINMAXINFO)lp; lpmmi->ptMinTrackSize.y = 0; lpmmi->ptMinTrackSize.x = 0; lpmmi->ptMaxTrackSize.y = get_orientation() == vertical ? 0 : MAXLONG; lpmmi->ptMaxTrackSize.x = get_orientation() == horizontal ? 0 : MAXLONG; unsigned n, count = m_panels.get_count(); bool b_found = false; for (n = 0; n<count; n++) { MINMAXINFO mmi; memset(&mmi, 0, sizeof(MINMAXINFO)); mmi.ptMaxTrackSize.x = MAXLONG; mmi.ptMaxTrackSize.y = MAXLONG; if (m_panels[n]->m_wnd_child) { b_found = true; unsigned divider_size = get_panel_divider_size(n); unsigned caption_height = m_panels[n]->m_show_caption ? g_get_caption_size() : 0; if (m_panels[n]->m_hidden) { if (get_orientation() == horizontal) { if (m_panels[n]->m_caption_orientation == vertical) { mmi.ptMinTrackSize.x = caption_height; mmi.ptMaxTrackSize.x = caption_height; } } else { if (m_panels[n]->m_caption_orientation == horizontal) { mmi.ptMinTrackSize.y = caption_height; mmi.ptMaxTrackSize.y = caption_height; } } } else { SendMessage(m_panels[n]->m_wnd_child, WM_GETMINMAXINFO, 0, (LPARAM)&mmi); if (caption_height) { if (m_panels[n]->m_caption_orientation == horizontal) { mmi.ptMinTrackSize.y += caption_height; if (mmi.ptMaxTrackSize.y < MAXLONG - (long)caption_height) mmi.ptMaxTrackSize.y += caption_height; else mmi.ptMaxTrackSize.y = MAXLONG; } else { mmi.ptMinTrackSize.x += caption_height; if (mmi.ptMaxTrackSize.x < MAXLONG - (long)caption_height) mmi.ptMaxTrackSize.x += caption_height; else mmi.ptMaxTrackSize.x = MAXLONG; } } } if (m_panels[n]->m_show_toggle_area && !m_panels[n]->m_autohide) { mmi.ptMinTrackSize.x++; if (mmi.ptMaxTrackSize.x < MAXLONG) mmi.ptMaxTrackSize.x++; } if (get_orientation() == vertical) { lpmmi->ptMinTrackSize.y += mmi.ptMinTrackSize.y + divider_size; lpmmi->ptMinTrackSize.x = max(mmi.ptMinTrackSize.x, lpmmi->ptMinTrackSize.x); if (lpmmi->ptMaxTrackSize.y <= MAXLONG - mmi.ptMaxTrackSize.y && lpmmi->ptMaxTrackSize.y + mmi.ptMaxTrackSize.y <= MAXLONG - (long)divider_size) { lpmmi->ptMaxTrackSize.y += mmi.ptMaxTrackSize.y + divider_size; } else { lpmmi->ptMaxTrackSize.y = MAXLONG; } lpmmi->ptMaxTrackSize.x = min(mmi.ptMaxTrackSize.x, lpmmi->ptMaxTrackSize.x); } else { lpmmi->ptMinTrackSize.x += mmi.ptMinTrackSize.x + divider_size; lpmmi->ptMinTrackSize.y = max(mmi.ptMinTrackSize.y, lpmmi->ptMinTrackSize.y); if (lpmmi->ptMaxTrackSize.x <= MAXLONG - mmi.ptMaxTrackSize.x && lpmmi->ptMaxTrackSize.x + mmi.ptMaxTrackSize.x <= MAXLONG - (long)divider_size) { lpmmi->ptMaxTrackSize.x += mmi.ptMaxTrackSize.x + divider_size; } else { lpmmi->ptMaxTrackSize.x = MAXLONG; } lpmmi->ptMaxTrackSize.y = min(mmi.ptMaxTrackSize.y, lpmmi->ptMaxTrackSize.y); } } } if (b_found) { if (get_orientation() == vertical) lpmmi->ptMaxTrackSize.x = max(lpmmi->ptMaxTrackSize.x, lpmmi->ptMinTrackSize.x); else lpmmi->ptMaxTrackSize.y = max(lpmmi->ptMaxTrackSize.y, lpmmi->ptMinTrackSize.y); } else { if (get_orientation() == vertical) lpmmi->ptMaxTrackSize.y = MAXLONG; else lpmmi->ptMaxTrackSize.x = MAXLONG; } if (0) { lpmmi->ptMinTrackSize.y = 0; if (get_orientation() == horizontal) lpmmi->ptMaxTrackSize.x = 0; lpmmi->ptMinTrackSize.x = 0; if (get_orientation() == vertical) lpmmi->ptMaxTrackSize.y = 0; } } return 0; case WM_MOUSEHOVER: { POINT pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; HWND child = RealChildWindowFromPoint(wnd, pt); if (child == wnd) { unsigned p_panel = -1; bool b_have_next = false; bool b_on_divider = false; b_on_divider = find_by_divider_pt(pt, p_panel); if (b_on_divider) { if (p_panel < m_panels.get_count()) { b_have_next = (p_panel + 1 < m_panels.get_count()); } if (is_index_valid(p_panel)) start_autohide_dehide(p_panel); } } } break; case WM_LBUTTONDOWN: case WM_MOUSEMOVE: { if (m_panels.get_count()) { POINT pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; HWND child = RealChildWindowFromPoint(wnd, pt); if (child == wnd) { unsigned p_panel = -1; bool b_have_next = false; bool b_on_divider = false; if (m_panel_dragging_valid) { b_on_divider = true; p_panel = m_panel_dragging; } else b_on_divider = find_by_divider_pt(pt, p_panel); if (b_on_divider) { if (p_panel < m_panels.get_count()) { b_have_next = (p_panel + 1 < m_panels.get_count()); } if (msg == WM_MOUSEMOVE && ((is_index_valid(p_panel) && m_panels[p_panel]->m_autohide) || (b_have_next && m_panels[p_panel + 1]->m_autohide))) { if (cfg_sidebar_use_custom_show_delay && !cfg_sidebar_show_delay) { if ((is_index_valid(p_panel))) { start_autohide_dehide(p_panel); } } else { TRACKMOUSEEVENT tme; memset(&tme, 0, sizeof(TRACKMOUSEEVENT)); tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_QUERY; tme.hwndTrack = wnd; _TrackMouseEvent(&tme); if (!(tme.dwFlags & TME_HOVER)) { memset(&tme, 0, sizeof(TRACKMOUSEEVENT)); tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.hwndTrack = wnd; tme.dwHoverTime = cfg_sidebar_use_custom_show_delay ? cfg_sidebar_show_delay : HOVER_DEFAULT; tme.dwFlags = TME_HOVER; _TrackMouseEvent(&tme); } } } } if (b_on_divider && is_index_valid(p_panel) && can_resize_divider(p_panel)) { SetCursor(LoadCursor(0, get_orientation() == horizontal ? IDC_SIZEWE : IDC_SIZENS)); if (msg == WM_LBUTTONDOWN) { save_sizes(); m_panel_dragging = p_panel; SetCapture(wnd); m_last_position = (get_orientation() == vertical ? pt.y : pt.x); m_panel_dragging_valid = true; } } else { if (!(wp & MK_LBUTTON)) SetCursor(LoadCursor(0, IDC_ARROW)); m_panel_dragging_valid = false; } } if (m_panel_dragging_valid && wp & MK_LBUTTON && is_index_valid(m_panel_dragging)) { int new_height = m_last_position - (get_orientation() == vertical ? pt.y : pt.x); int delta = (get_orientation() == vertical ? pt.y : pt.x) - m_last_position; //console::formatter() << "before or: pt = " << pt.y << "," << pt.x << " lastpos: " << m_last_position << " enddelta: " << delta; auto & p_panel = m_panels[m_panel_dragging]; if (p_panel->m_hidden && delta) { p_panel->m_hidden = false; p_panel->m_size = 0; get_host()->on_size_limit_change(get_wnd(), uie::size_limit_all); } int delta_changed = override_size(m_panel_dragging, delta); m_last_position = (get_orientation() == vertical ? pt.y : pt.x) + delta_changed; on_size_changed(); if (delta + delta_changed) start_autohide_dehide(m_panel_dragging); } } //msg_last = msg; //lp_last = lp; //wp_last = wp; } break; case WM_LBUTTONDBLCLK: { POINT pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; HWND child = ChildWindowFromPoint(wnd, pt); if (child == wnd) { unsigned p_panel = -1; if (find_by_divider_pt(pt, p_panel) && is_index_valid(p_panel)) { bool b_have_next = is_index_valid(p_panel + 1); if (m_panels[p_panel]->m_locked && !m_panels[p_panel]->m_autohide && (!b_have_next || !m_panels[p_panel + 1]->m_locked)) { m_panels[p_panel]->m_hidden = !m_panels[p_panel]->m_hidden; get_host()->on_size_limit_change(get_wnd(), uie::size_limit_all); on_size_changed(); } else if (!m_panels[p_panel]->m_locked && b_have_next && m_panels[p_panel]->m_locked && !m_panels[p_panel]->m_autohide) { m_panels[p_panel + 1]->m_hidden = !m_panels[p_panel]->m_hidden; get_host()->on_size_limit_change(get_wnd(), uie::size_limit_all); on_size_changed(); } } } } break; case WM_LBUTTONUP: if (m_panel_dragging_valid) { m_panel_dragging_valid = false; if (GetCapture() == wnd) ReleaseCapture(); //SetCursor(LoadCursor(0, IDC_ARROW)); } break; #if 0 case WM_PAINT: { PAINTSTRUCT ps; BeginPaint(wnd, &ps); COLORREF cr = GetSysColor(COLOR_3DFACE); gdi_object_t<HBRUSH>::ptr_t br_line = CreateSolidBrush(/*RGB(226, 226, 226)*/cr); t_size n, count = m_panels.get_count(); for (n = 0; n + 1<count; n++) { pfc::refcounted_object_ptr_t<panel> p_item = m_panels.get_item(n); if (p_item->m_wnd_child) { RECT rc_area; GetRelativeRect(p_item->m_wnd_child, m_wnd, &rc_area); if (get_orientation() == vertical) { rc_area.top = rc_area.bottom; rc_area.bottom += 2; //FillRect(ps.hdc, &rc_area, GetSysColorBrush(COLOR_WINDOW)); //rc_area.top++; } else { rc_area.left = rc_area.right; rc_area.right += 2; //FillRect(ps.hdc, &rc_area, GetSysColorBrush(COLOR_WINDOW)); //rc_area.right--; } FillRect(ps.hdc, &rc_area, br_line); } } EndPaint(wnd, &ps); } ; #endif #if 0 case WM_CONTEXTMENU: if ((HWND)wp == wnd) { window_transparent_fill m_trans_fill; if (m_layout_editing_active) { RECT rc; GetRelativeRect(wnd, HWND_DESKTOP, &rc); ShowWindow(m_trans_fill.create(get_wnd(), 0, ui_helpers::window_position_t(rc)), SW_SHOWNORMAL); POINT pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; HMENU menu = CreatePopupMenu(); HMENU menu_add = CreatePopupMenu(); uie::window_info_list_simple panels; g_get_panel_list(panels); enum { ID_CLOSE = 1, ID_ADD_BASE = 2 }; g_append_menu_panels(menu_add, panels, ID_ADD_BASE); pfc::string8 temp; get_name(temp); uAppendMenu(menu, MF_STRING | MF_GRAYED, (UINT_PTR)0, temp); uAppendMenu(menu, MF_MENUBREAK, (UINT_PTR)0, NULL); AppendMenu(menu, MF_STRING | MF_POPUP, (UINT_PTR)menu_add, L"Add panel"); int cmd = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, m_trans_fill.get_wnd(), 0); DestroyMenu(menu); m_trans_fill.destroy(); if (cmd) { if (cmd >= ID_ADD_BASE && cmd < panels.get_count() + ID_ADD_BASE) { pfc::refcounted_object_ptr_t<panel> ptr = new panel; ptr->m_guid = panels[cmd - ID_ADD_BASE].guid; m_panels.add_item(ptr); refresh_children(); get_host()->on_size_limit_change(get_wnd(), uie::size_limit_all); uie::splitter_window_v2_ptr sw2; if (ptr->m_child.is_valid() && ptr->m_child->service_query_t(sw2)) { sw2->enter_layout_editing_mode(); } } } } return 0; } break; #endif } return DefWindowProc(wnd, msg, wp, lp); }
//subclass proc for the list view BOOL CALLBACK PopupsListSubclassProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CONTEXTMENU: { int x = LOWORD(lParam); int y = HIWORD(lParam); int selection; HMENU hMenu = CreatePopupMenu(); AppendMenu(hMenu, MF_STRING, POPUPMENU_TITLE, TranslateT("Copy title to clipboard")); AppendMenu(hMenu, MF_STRING, POPUPMENU_MESSAGE, TranslateT("Copy message to clipboard")); AppendMenu(hMenu, MF_STRING, POPUPMENU_TIMESTAMP, TranslateT("Copy timestamp to clipboard")); selection = TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, x, y, 0, hWnd, NULL); DestroyMenu(hMenu); if (selection) { CopyPopupDataToClipboard(hWnd, selection); } break; } case WM_KEYUP: { switch (wParam) { case 'C': { if (GetKeyState(VK_CONTROL)) { CopyPopupDataToClipboard(hWnd, POPUPMENU_MESSAGE); } break; } case VK_ESCAPE: { SendMessage(GetParent(hWnd), WM_CLOSE, 0, 0); break; } } break; } case WM_SYSKEYDOWN: { if (wParam == 'X') { SendMessage(GetParent(hWnd), WM_CLOSE, 0, 0); } break; } } return CallWindowProc(oldPopupsListProc, hWnd, msg, wParam, lParam); }
/* Main Dialog */ BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { int ret_code = 0; switch(Message) { case WM_INITDIALOG: { int statwidths[] = {130, -1}; HMENU hMenu, hSubMenu; UINT menuflags = MF_STRING; if(config_inst.admin_access == 0) { menuflags = MF_STRING|MF_GRAYED; } hMenu = CreateMenu(); /* Creating management menu */ hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, menuflags, UI_MENU_MANAGE_START,"&Start OSSEC"); AppendMenu(hSubMenu, menuflags, UI_MENU_MANAGE_STOP,"&Stop OSSEC"); AppendMenu(hSubMenu, MF_SEPARATOR, UI_MENU_NONE,""); AppendMenu(hSubMenu, menuflags, UI_MENU_MANAGE_RESTART,"&Restart"); AppendMenu(hSubMenu, menuflags, UI_MENU_MANAGE_STATUS,"&Status"); AppendMenu(hSubMenu, MF_SEPARATOR, UI_MENU_NONE,""); AppendMenu(hSubMenu, MF_STRING,UI_MENU_MANAGE_EXIT,"&Exit"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu,"&Manage"); /* Create view menu */ hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, UI_MENU_VIEW_LOGS, "&View Logs"); AppendMenu(hSubMenu, MF_STRING, UI_MENU_VIEW_CONFIG,"V&iew Config"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu,"&View"); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, UI_MENU_HELP_ABOUT, "A&bout"); AppendMenu(hSubMenu, MF_STRING, UI_MENU_HELP_HELP, "Help"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Help"); AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); SetMenu(hwnd, hMenu); hStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU)IDC_MAIN_STATUS, GetModuleHandle(NULL), NULL); SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths); SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"http://www.ossec.net"); /* Initializing config */ config_read(hwnd); gen_server_info(hwnd); /* Setting the icons */ SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_OSSECICON))); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_OSSECICON))); if(config_inst.admin_access == 0) { MessageBox(hwnd, "Admin access required. Some features may not work properly. \n\n" "**If on Vista (or Server 2008), choose the \"Run as administrator\" option.", "Admin Access Required", MB_OK); break; } } break; case WM_COMMAND: switch(LOWORD(wParam)) { /* In case of SAVE */ case IDC_ADD: { int chd = 0; int len; if(config_inst.admin_access == 0) { MessageBox(hwnd, "Unable to edit configuration. " "Admin access required.", "Error Saving.", MB_OK); break; } /* Getting server ip */ len = GetWindowTextLength(GetDlgItem(hwnd, UI_SERVER_TEXT)); if(len > 0) { char *buf; /* Allocating buffer */ buf = (char*)GlobalAlloc(GPTR, len + 1); if(!buf) { exit(-1); } GetDlgItemText(hwnd, UI_SERVER_TEXT, buf, len + 1); /* If auth key changed, set it */ if(strcmp(buf, config_inst.server) != 0) { if(set_ossec_server(buf, hwnd)) { chd = 1; } } else { GlobalFree(buf); } } /* Getting auth key */ len = GetWindowTextLength(GetDlgItem(hwnd, UI_SERVER_AUTH)); if(len > 0) { char *buf; /* Allocating buffer */ buf = (char*)GlobalAlloc(GPTR, len + 1); if(!buf) { exit(-1); } GetDlgItemText(hwnd, UI_SERVER_AUTH, buf, len + 1); /* If auth key changed, set it */ if(strcmp(buf, config_inst.key) != 0) { int ret; char *tmp_str; char *decd_buf = NULL; char *decd_to_write = NULL; char *id = NULL; char *name = NULL; char *ip = NULL; /* Getting new fields */ decd_buf = decode_base64(buf); if(decd_buf) { decd_to_write = strdup(decd_buf); /* Getting id, name and ip */ id = decd_buf; name = strchr(id, ' '); if(name) { *name = '\0'; name++; ip = strchr(name, ' '); if(ip) { *ip = '\0'; ip++; tmp_str = strchr(ip, ' '); if(tmp_str) { *tmp_str = '\0'; } } } } /* If ip isn't set, it is because we have an invalid * auth key. */ if(!ip) { MessageBox(hwnd, "Unable to import " "authentication key because it was invalid.", "Error -- Failure Saving Auth Key", MB_OK); } else { char mbox_msg[1024 +1]; mbox_msg[1024] = '\0'; snprintf(mbox_msg, 1024, "Adding key for:\r\n\r\n" "Agent ID: %s\r\n" "Agent Name: %s\r\n" "IP Address: %s\r\n", id, name, ip); ret = MessageBox(hwnd, mbox_msg, "Confirm Importing Key", MB_OKCANCEL); if(ret == IDOK) { if(set_ossec_key(decd_to_write, hwnd)) { chd += 2; } } } /* Free used memory */ if(decd_buf) { free(decd_to_write); free(decd_buf); } } else { GlobalFree(buf); } } /* Finished adding AUTH KEY */ /* Re-printing messages */ if(chd) { config_read(hwnd); /* Set status to restart */ if(strcmp(config_inst.status,ST_RUNNING) == 0) { config_inst.status = ST_RUNNING_RESTART; } gen_server_info(hwnd); if(chd == 1) { SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Server IP saved"); } else if(chd == 2) { SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Auth key imported"); } else { SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Auth key and IP saved"); } } } break; case UI_MENU_MANAGE_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; case UI_MENU_VIEW_LOGS: _spawnlp( _P_NOWAIT, "notepad", "notepad " OSSECLOGS, NULL ); break; case UI_MENU_VIEW_CONFIG: _spawnlp( _P_NOWAIT, "notepad", "notepad " CONFIG, NULL ); break; case UI_MENU_HELP_HELP: _spawnlp( _P_NOWAIT, "notepad", "notepad " HELPTXT, NULL ); break; case UI_MENU_HELP_ABOUT: { DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUT), hwnd, AboutDlgProc); } break; case IDC_CANCEL: config_read(hwnd); gen_server_info(hwnd); break; case UI_MENU_MANAGE_START: /* Starting OSSEC -- must have a valid config before. */ if((strcmp(config_inst.key, FL_NOKEY) != 0) && (strcmp(config_inst.server, FL_NOSERVER) != 0)) { ret_code = os_start_service(); } else { ret_code = 0; } if(ret_code == 0) { MessageBox(hwnd, "Unable to start agent (check config)", "Error -- Unable to Start Agent", MB_OK); } else if(ret_code == 1) { config_read(hwnd); gen_server_info(hwnd); SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Started"); MessageBox(hwnd, "Agent started", "Agent Started", MB_OK); } else { MessageBox(hwnd, "Agent already running (try restart)", "Agent Running", MB_OK); } break; case UI_MENU_MANAGE_STOP: /* Stopping OSSEC */ ret_code = os_stop_service(); if(ret_code == 1) { config_read(hwnd); gen_server_info(hwnd); SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Stopped"); MessageBox(hwnd, "Agent stopped", "Agent Stopped", MB_OK); } else { MessageBox(hwnd, "Agent already stopped", "Agent Stopped", MB_OK); } break; case UI_MENU_MANAGE_STATUS: if(CheckServiceRunning()) { MessageBox(hwnd, "Agent running", "Agent Running", MB_OK); } else { MessageBox(hwnd, "Agent stopped", "Agent Stopped", MB_OK); } break; case UI_MENU_MANAGE_RESTART: if((strcmp(config_inst.key, FL_NOKEY) == 0) || (strcmp(config_inst.server, FL_NOSERVER) == 0)) { MessageBox(hwnd, "Unable to restart agent (check config)", "Error -- Unable to Restart Agent", MB_OK); break; } ret_code = os_stop_service(); /* Starting OSSEC */ ret_code = os_start_service(); if(ret_code == 0) { MessageBox(hwnd, "Unable to restart agent (check config)", "Error -- Unable to Restart Agent", MB_OK); } else { config_read(hwnd); gen_server_info(hwnd); SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Restarted"); MessageBox(hwnd, "Agent restarted", "Agent Restarted", MB_OK); } break; } break; case WM_CLOSE: EndDialog(hwnd, 0); break; default: return FALSE; } return TRUE; }
void init(const char *title, unsigned char *imageData, unsigned int imageDataLen) { HWND hWnd; HINSTANCE hInstance = GetModuleHandle(NULL); // get thish shit into windows whide chars or whatever titleWide = (wchar_t*)calloc(strlen(title) + 1, sizeof(wchar_t)); mbstowcs(titleWide, title, strlen(title)); wcscpy((wchar_t*)szTitle, titleWide); wcscpy((wchar_t*)szWindowClass, (wchar_t*)TEXT("MyClass")); MyRegisterClass(hInstance); hWnd = InitInstance(hInstance, FALSE); // Don't show window if (!hWnd) { return; } // Let's load up the tray icon HICON hIcon; { // This is really hacky, but LoadImage won't let me load an image from memory. // So we have to write out a temporary file, load it from there, then delete the file. // From http://msdn.microsoft.com/en-us/library/windows/desktop/aa363875.aspx TCHAR szTempFileName[MAX_PATH+1]; TCHAR lpTempPathBuffer[MAX_PATH+1]; int dwRetVal = GetTempPath(MAX_PATH+1, // length of the buffer lpTempPathBuffer); // buffer for path if (dwRetVal > MAX_PATH+1 || (dwRetVal == 0)) { return; // Failure } // Generates a temporary file name. int uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files TEXT("_tmpicon"), // temp file name prefix 0, // create unique name szTempFileName); // buffer for name if (uRetVal == 0) { return; // Failure } // Dump the icon to the temp file FILE* fIcon = fopen(szTempFileName, "wb"); fwrite(imageData, 1, imageDataLen, fIcon); fclose(fIcon); fIcon = NULL; // Load the image from the file hIcon = LoadImage(NULL, szTempFileName, IMAGE_ICON, 64, 64, LR_LOADFROMFILE); // Delete the temp file remove(szTempFileName); } nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = 100; nid.uCallbackMessage = WM_MYMESSAGE; nid.hIcon = hIcon; strcpy(nid.szTip, title); // MinGW seems to use ANSI nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; Shell_NotifyIcon(NIM_ADD, &nid); hSubMenu = CreatePopupMenu(); }
HRESULT STDMETHODCALLTYPE CSmtShell::QueryContextMenu(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { HMENU SubMenu = CreatePopupMenu(); memset(m_EnvPath, 0, sizeof(m_EnvPath)); if(!IsWorkEvn(m_szFile[0], m_EnvPath)){ if(FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(m_szFile[0])){ if(m_NumFiles <= 1){ InsertMenu(SubMenu, 0, MF_STRING | MF_BYPOSITION, idCmdFirst +101, _T("Set Environment")); InsertMenu(hmenu, indexMenu, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); InsertMenu(hmenu, indexMenu+1, MF_POPUP | MF_BYPOSITION, (UINT)SubMenu, _T("Smt Operate")); InsertMenu(hmenu, indexMenu+2, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); } } } else{ if(IsProductEnv()){ int i = 0; InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +103, _T("Update")); InsertMenu(hmenu, indexMenu, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); InsertMenu(hmenu, indexMenu+1, MF_POPUP | MF_BYPOSITION, (UINT)SubMenu, _T("Smt Operate")); InsertMenu(hmenu, indexMenu+2, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); } else{ if(!IsInCtr()){ int i = 0; if(!IsHaveEnvPath()){ if(m_FathAddFlag){ if(m_CouldAdd){ InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +107, _T("Add")); } else{ InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +108, _T("Revert")); } } else{ InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +102, _T("Check out")); InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +103, _T("Update")); if(IsFatherInCtr()){ InsertMenu(SubMenu, i++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +107, _T("Add")); InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +108, _T("Revert")); } } //InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +110, _T("Import")); InsertMenu(hmenu, indexMenu, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); InsertMenu(hmenu, indexMenu+1, MF_POPUP | MF_BYPOSITION, (UINT)SubMenu, _T("Smt Operate")); InsertMenu(hmenu, indexMenu+2, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); } } else{ int i = 0; if(!IsHaveEnvPath()){ InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +104, _T("Commit")); InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +105, _T("Check in")); InsertMenu(SubMenu, i++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); if(!m_AddFlag){ InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +103, _T("Update")); InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +106, _T("Cancel")); InsertMenu(SubMenu, i++, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +109, _T("Merge")); } InsertMenu(SubMenu, i++, MF_STRING | MF_BYPOSITION, idCmdFirst +108, _T("Revert")); InsertMenu(hmenu, indexMenu, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); InsertMenu(hmenu, indexMenu+1, MF_POPUP | MF_BYPOSITION, (UINT)SubMenu, _T("Smt Operate")); InsertMenu(hmenu, indexMenu+2, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); } } } } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(109 + 1)); }
HMENU user_create_menu(int mid, int flags) { HMENU m = CreatePopupMenu(), c; int i, count, sel_lng; # define addmenu(x, i, v) (InsertMenu(x, (UINT)-1, MF_BYPOSITION | MF_STRING, (i), (v)) ) # define addmenu_chk(x, i, v) (InsertMenu(x, (UINT)-1, MF_BYPOSITION | MF_CHECKED | MF_STRING, (i), (v)) ) # define menugroup(x) (InsertMenu(x, (UINT)-1, MF_BYPOSITION | MF_SEPARATOR, 0, 0) ) # define addchild(x, h, v) (InsertMenu(x, (UINT)-1, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT_PTR)(h), (v)) ) # define menubegin(x) (x = CreatePopupMenu()) # define menuend(x) (DestroyMenu(x)) switch(mid) { case 1: { struct video_dec *vd; letter sub_name[128]; vdata.shared->call_function(call_video_getvdec, 0, &vd, 0); menubegin(c); addmenu(c, 1001, uni("(None)")); count = vd->video_decoder_trans_info(video_get_sub_language_count, 0, 0, 0); /* get primary language id */ sel_lng = vd->video_decoder_trans_info(video_get_sub_language_current, 0, 0, 0); for(i=0; i<count; i++) { vd->video_decoder_trans_info(video_get_sub_language_current, i, 0, sub_name); if(i != sel_lng) addmenu(c, 2000 + i, sub_name); else addmenu_chk(c, 2000 + i, sub_name); } addchild(m, c, uni("Primary")); menubegin(c); addmenu(c, 1002, uni("(None)")); /* get secondary language id */ sel_lng = vd->video_decoder_trans_info(video_get_sub_language_current, 1, 0, 0); for(i=0; i<count; i++) { vd->video_decoder_trans_info(video_get_sub_language_current, i, 0, sub_name); if(i != sel_lng) addmenu(c, 8000 + i, sub_name); else addmenu_chk(c, 8000 + i, sub_name); } addchild(m, c, uni("Secondary")); } break; } return m; }
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; MSG Msg; //Step 1: Registering the Window Class wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = g_szClassName; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)){ MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } DWORD dwExStyle, dwStyle; dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwStyle=(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX); // Step 2: Creating the Window hwnd = CreateWindowEx( dwExStyle, g_szClassName, "Bes Language Editor", dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, 600, 600, NULL, NULL, hInstance, NULL); if(hwnd == NULL){ MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } HICON hIcon, hIconSm; hMenu = CreateMenu(); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, ID_FILE_NEW, "&New\tCtrl + N"); AppendMenu(hSubMenu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, ID_FILE_OPEN, "&Open\tCtrl + O"); AppendMenu(hSubMenu, MF_BYCOMMAND | MF_DISABLED | MF_STRING, ID_FILE_SAVE, "&Save\tCtrl + S"); AppendMenu(hSubMenu, MF_SEPARATOR, ID_FILE_SEPARATOR, ""); AppendMenu(hSubMenu, MF_BYCOMMAND | MF_DISABLED | MF_STRING, ID_FILE_CLOSE, "&Close\tCtrl + C"); AppendMenu(hSubMenu, MF_SEPARATOR, ID_FILE_SEPARATOR, ""); AppendMenu(hSubMenu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, ID_FILE_EXIT, "E&xit\tCtrl + X"); AppendMenu(hMenu, MF_BYCOMMAND | MF_ENABLED | MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File"); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, ID_STUFF_COMPILE, "&Compile\tCtrl + F9"); AppendMenu(hSubMenu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, ID_STUFF_RUN, "&Run\tCtrl + F12"); AppendMenu(hMenu, MF_BYCOMMAND | MF_ENABLED | MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Execute"); SetMenu(hwnd, hMenu); hIcon = LoadImage(NULL, "BesLanguage.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE); if(hIcon) SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); else MessageBox(hwnd, "Could not load large icon!", "Error", MB_OK | MB_ICONERROR); hIconSm = LoadImage(NULL, "BesLanguage.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE); if(hIconSm) SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm); else MessageBox(hwnd, "Could not load small icon!", "Error", MB_OK | MB_ICONERROR); SetFocus(hwnd); ShowWindow(hwnd, SW_MAXIMIZE); UpdateWindow(hwnd); // Step 3: The Message Loop while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }
// Procedure de creation de menu à partir d'une clé de registre HMENU InitLauncherMenu( char * Key ) { HMENU menu ; menu = CreatePopupMenu() ; char KeyName[1024] ; int nbitem = 0,i ; DeleteObject( bmpCheck ) ; bmpCheck = GetMyCheckBitmaps( 1 ) ; DeleteObject( bmpUnCheck ) ; bmpUnCheck = GetMyCheckBitmaps( 2 ) ; if( (IniFileFlag == SAVEMODE_REG)||(IniFileFlag == SAVEMODE_FILE) ) { sprintf( KeyName, "%s\\%s", TEXT(PUTTY_REG_POS), Key ) ; ReadSpecialMenu( menu, KeyName, &nbitem, 0 ) ; } else if( IniFileFlag == SAVEMODE_DIR ) { ReadSpecialMenu( menu, Key, &nbitem, 0 ) ; } if( GetMenuItemCount( menu ) > 0 ) AppendMenu( menu, MF_SEPARATOR, 0, 0 ) ; // Creation du menu bouton gauche DestroyMenu( HideMenu ) ; HideMenu = CreatePopupMenu() ; if( !IsUnique ) { AppendMenu( HideMenu, MF_ENABLED, IDM_LAUNCHER+3, "&Hide all" ) ; AppendMenu( HideMenu, MF_ENABLED, IDM_LAUNCHER+4, "&Unhide all" ) ; //AppendMenu( HideMenu, MF_ENABLED, IDM_LAUNCHER+5, "&Refresh list" ) ; AppendMenu( HideMenu, MF_ENABLED, IDM_LAUNCHER+6, "&Window unique" ) ; CheckMenuItem( HideMenu, IDM_LAUNCHER+6, MF_BYCOMMAND | MF_UNCHECKED) ; } else { AppendMenu( HideMenu, MF_ENABLED, IDM_LAUNCHER+6, "&Window unique" ) ; CheckMenuItem( HideMenu, IDM_LAUNCHER+6, MF_BYCOMMAND | MF_CHECKED) ; } //AppendMenu( HideMenu, MF_ENABLED, IDM_GONEXT, "&Next" ) ; //AppendMenu( HideMenu, MF_ENABLED, IDM_GOPREVIOUS, "&Previous" ) ; if( RefreshWinList( MainHwnd ) > 0 ) { AppendMenu( HideMenu, MF_SEPARATOR, 0, 0 ) ; for( i=0 ; i<NbWin ; i++ ) { AppendMenu( HideMenu, MF_ENABLED, IDM_GOHIDE+i, TabWin[i].name ) ; SetMenuItemBitmaps ( HideMenu, IDM_GOHIDE+i, MF_BYCOMMAND, bmpUnCheck, bmpCheck ) ; if( IsWindowVisible( TabWin[i].hwnd ) ) CheckMenuItem( HideMenu, IDM_GOHIDE+i, MF_BYCOMMAND | MF_CHECKED) ; else CheckMenuItem( HideMenu, IDM_GOHIDE+i, MF_BYCOMMAND | MF_UNCHECKED) ; } } AppendMenu( HideMenu, MF_SEPARATOR, 0, 0 ) ; AppendMenu( HideMenu, MF_ENABLED, IDM_ABOUT, "&About" ) ; AppendMenu( HideMenu, MF_ENABLED, IDM_QUIT, "&Quit" ) ; AppendMenu( menu, MF_POPUP, (UINT_PTR)HideMenu, "&Opened sessions" ) ; AppendMenu( menu, MF_SEPARATOR, 0, 0 ) ; AppendMenu( menu, MF_ENABLED, IDM_LAUNCHER+7, "&Refresh" ) ; AppendMenu( menu, MF_ENABLED, IDM_LAUNCHER+1, "&Configuration" ) ; AppendMenu( menu, MF_ENABLED, IDM_LAUNCHER+2, "&TTY-ed" ) ; AppendMenu( menu, MF_SEPARATOR, 0, 0 ) ; AppendMenu( menu, MF_ENABLED, IDM_ABOUT, "&About" ) ; AppendMenu( menu, MF_ENABLED, IDM_QUIT, "&Quit" ) ; return menu ; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; RECT rcClient; // The parent window's client area. static HMENU hMainMenu, hFileMenu; static HWND hSearchButton; int i; OPENFILENAME ofn; TCHAR szFileName[256] = ""; static struct { TCHAR *name; int width; } columns[] = { { TEXT("Номер телефона:"), 100}, { TEXT("Фамилия:"), 100}, { TEXT("Имя:"), 100}, { TEXT("Отчество:"), 100}, { TEXT("Улица:"), 150}, { TEXT("Дом:"), 100}, { TEXT("Корпус:"), 100}, { TEXT("Квартира:"), 100} }; const int ColumnsCount = _countof(columns); switch (message) { case WM_CREATE: LoadDatabaseDLL(); hMainMenu=CreateMenu(); hFileMenu=CreatePopupMenu(); i=0; CreateMenuItem(hFileMenu,"&Load database",i++,ID_BUTTONLOADDB,NULL,FALSE,MFT_STRING); CreateMenuItem(hFileMenu,"&Show database",i++,ID_BUTTONSHOWDB,NULL,FALSE,MFT_STRING); CreateMenuItem(hFileMenu,"&Exit",i++,IDM_EXIT,NULL,FALSE,MFT_STRING); i=0; CreateMenuItem(hMainMenu,"&File",i++,0,hFileMenu,FALSE,MFT_STRING); SetMenu(hWnd,hMainMenu); DrawMenuBar(hWnd); GetClientRect (hWnd, &rcClient); hListView = CreateWindowEx( WS_EX_STATICEDGE, WC_LISTVIEW, NULL, WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_EDITLABELS, 0, 0, rcClient.right, rcClient.bottom-100, hWnd, NULL, hInst, NULL); ListView_SetExtendedListViewStyle(hListView,LVS_EX_FULLROWSELECT); //adding columns for (int i=0; i<ColumnsCount; i++) { AddColumnToListView(hListView, columns[i].name, i, columns[i].width); } hPhoneLabel = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , 5, 400, 65, 25, hWnd, hMainMenu, hInst, NULL); SendMessage(hPhoneLabel, WM_SETTEXT, NULL, (LPARAM) "Телефон:"); hLastNameLabel = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , 90, 400, 100, 25, hWnd, hMainMenu, hInst, NULL); SendMessage(hLastNameLabel, WM_SETTEXT, NULL, (LPARAM) "Фамилия:"); hNameLabel = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , 190, 400, 100, 25, hWnd, hMainMenu, hInst, NULL); SendMessage(hNameLabel, WM_SETTEXT, NULL, (LPARAM) "Имя:"); hPatronymLabel = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , 290, 400, 100, 25, hWnd, hMainMenu, hInst, NULL); SendMessage(hPatronymLabel, WM_SETTEXT, NULL, (LPARAM) "Отчество:"); hStreetLabel = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , 390, 400, 150, 25, hWnd, hMainMenu, hInst, NULL); SendMessage(hStreetLabel, WM_SETTEXT, NULL, (LPARAM) "Улица"); hHouseLabel = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , 540, 400, 50, 25, hWnd, hMainMenu, hInst, NULL); SendMessage(hHouseLabel, WM_SETTEXT, NULL, (LPARAM) "Дом"); hHousingLabel = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , 590, 400, 60, 25, hWnd, hMainMenu, hInst, NULL); SendMessage(hHousingLabel, WM_SETTEXT, NULL, (LPARAM)"Корпус:"); hApartmentLabel = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , 650, 400, 30, 25, hWnd, hMainMenu, hInst, NULL); SendMessage(hApartmentLabel, WM_SETTEXT, NULL, (LPARAM) "кв:"); hPhoneEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT, 3, 425, 83, 25, hWnd, (HMENU)(101), hInst, NULL); hLastNameEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT, 90, 425, 98, 25, hWnd, (HMENU)(101), hInst, NULL); hNameEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT, 190, 425, 98, 25, hWnd, (HMENU)(101), hInst, NULL); hPatronymEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT, 290, 425, 98, 25, hWnd, (HMENU)(101), hInst, NULL); hStreetEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT, 390, 425, 148, 25, hWnd, (HMENU)(101), hInst, NULL); hHouseEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT, 540, 425, 98, 25, hWnd, (HMENU)(101), hInst, NULL); hHousingEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT, 590, 425, 58, 25, hWnd, (HMENU)(101), hInst, NULL); hApartmentEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT, 650, 425, 28, 25, hWnd, (HMENU)(101), hInst, NULL); hSearchButton = CreateWindowEx( WS_EX_STATICEDGE, WC_BUTTON, NULL, WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_EDITLABELS, 690, 425, 50, 25, hWnd, NULL, hInst, NULL); SendMessage(hSearchButton, WM_SETTEXT, NULL, (LPARAM) "Поиск"); ShowWindow(hWnd, NULL); UpdateWindow(hWnd); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case BN_CLICKED: if ((HWND)lParam == hSearchButton) SearchDB(hWnd, hListView); break; case ID_BUTTONLOADDB: ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFilter = "Text files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.lpstrTitle = "Open File"; ofn.Flags = OFN_PATHMUSTEXIST; ofn.lpstrDefExt = "txt"; if(GetOpenFileName(&ofn)) { LoadDB(szFileName,hWnd); } InvalidateRect(hWnd,NULL,TRUE); UpdateWindow(hWnd); break; case ID_BUTTONSHOWDB: ShowDB(hWnd); break; case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
static void TaskManager_OnTabWndSelChange(void) { int i; HMENU hMenu; HMENU hOptionsMenu; HMENU hViewMenu; HMENU hSubMenu; WCHAR wszLargeIcons[255]; WCHAR wszSmallIcons[255]; WCHAR wszDetails[255]; WCHAR wszWindows[255]; WCHAR wszSelectColumns[255]; WCHAR wszShow16bTasks[255]; WCHAR wszOneGraphAllCPU[255]; WCHAR wszOneGraphPerCPU[255]; WCHAR wszCPUHistory[255]; WCHAR wszShowKernelTimes[255]; LoadStringW(hInst, IDS_VIEW_LARGE, wszLargeIcons, sizeof(wszLargeIcons)/sizeof(WCHAR)); LoadStringW(hInst, IDS_VIEW_SMALL, wszSmallIcons, sizeof(wszSmallIcons)/sizeof(WCHAR)); LoadStringW(hInst, IDS_VIEW_DETAILS, wszDetails, sizeof(wszDetails)/sizeof(WCHAR)); LoadStringW(hInst, IDS_WINDOWS, wszWindows, sizeof(wszWindows)/sizeof(WCHAR)); LoadStringW(hInst, IDS_VIEW_SELECTCOLUMNS, wszSelectColumns, sizeof(wszSelectColumns)/sizeof(WCHAR)); LoadStringW(hInst, IDS_OPTIONS_SHOW16BITTASKS, wszShow16bTasks, sizeof(wszShow16bTasks)/sizeof(WCHAR)); LoadStringW(hInst, IDS_VIEW_CPUHISTORY_ONEGRAPHALL, wszOneGraphAllCPU, sizeof(wszOneGraphAllCPU)/sizeof(WCHAR)); LoadStringW(hInst, IDS_VIEW_CPUHISTORY_ONEGRAPHPERCPU, wszOneGraphPerCPU, sizeof(wszOneGraphPerCPU)/sizeof(WCHAR)); LoadStringW(hInst, IDS_VIEW_CPUHISTORY, wszCPUHistory, sizeof(wszCPUHistory)/sizeof(WCHAR)); LoadStringW(hInst, IDS_VIEW_SHOWKERNELTIMES, wszShowKernelTimes, sizeof(wszShowKernelTimes)/sizeof(WCHAR)); hMenu = GetMenu(hMainWnd); hViewMenu = GetSubMenu(hMenu, 2); hOptionsMenu = GetSubMenu(hMenu, 1); TaskManagerSettings.ActiveTabPage = SendMessageW(hTabWnd, TCM_GETCURSEL, 0, 0); for (i = GetMenuItemCount(hViewMenu) - 1; i > 2; i--) { hSubMenu = GetSubMenu(hViewMenu, i); if (hSubMenu) DestroyMenu(hSubMenu); RemoveMenu(hViewMenu, i, MF_BYPOSITION); } RemoveMenu(hOptionsMenu, 3, MF_BYPOSITION); switch (TaskManagerSettings.ActiveTabPage) { case 0: ShowWindow(hApplicationPage, SW_SHOW); ShowWindow(hProcessPage, SW_HIDE); ShowWindow(hPerformancePage, SW_HIDE); BringWindowToTop(hApplicationPage); AppendMenuW(hViewMenu, MF_STRING, ID_VIEW_LARGE, wszLargeIcons); AppendMenuW(hViewMenu, MF_STRING, ID_VIEW_SMALL, wszSmallIcons); AppendMenuW(hViewMenu, MF_STRING, ID_VIEW_DETAILS, wszDetails); if (GetMenuItemCount(hMenu) <= 4) { hSubMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(IDR_WINDOWSMENU)); InsertMenuW(hMenu, 3, MF_BYPOSITION|MF_POPUP, (UINT_PTR)hSubMenu, wszWindows); DrawMenuBar(hMainWnd); } if (TaskManagerSettings.View_LargeIcons) CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND); else if (TaskManagerSettings.View_SmallIcons) CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND); else CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND); /* * Give the application list control focus */ SetFocus(hApplicationPageListCtrl); break; case 1: ShowWindow(hApplicationPage, SW_HIDE); ShowWindow(hProcessPage, SW_SHOW); ShowWindow(hPerformancePage, SW_HIDE); BringWindowToTop(hProcessPage); AppendMenuW(hViewMenu, MF_STRING, ID_VIEW_SELECTCOLUMNS, wszSelectColumns); AppendMenuW(hOptionsMenu, MF_STRING, ID_OPTIONS_SHOW16BITTASKS, wszShow16bTasks); if (TaskManagerSettings.Show16BitTasks) CheckMenuItem(hOptionsMenu, ID_OPTIONS_SHOW16BITTASKS, MF_BYCOMMAND|MF_CHECKED); if (GetMenuItemCount(hMenu) > 4) { RemoveMenu(hMenu, 3, MF_BYPOSITION); DrawMenuBar(hMainWnd); } /* * Give the process list control focus */ SetFocus(hProcessPageListCtrl); break; case 2: ShowWindow(hApplicationPage, SW_HIDE); ShowWindow(hProcessPage, SW_HIDE); ShowWindow(hPerformancePage, SW_SHOW); BringWindowToTop(hPerformancePage); if (GetMenuItemCount(hMenu) > 4) { RemoveMenu(hMenu, 3, MF_BYPOSITION); DrawMenuBar(hMainWnd); } hSubMenu = CreatePopupMenu(); AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHALL, wszOneGraphAllCPU); AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, wszOneGraphPerCPU); AppendMenuW(hViewMenu, MF_STRING|MF_POPUP, (UINT_PTR)hSubMenu, wszCPUHistory); AppendMenuW(hViewMenu, MF_STRING, ID_VIEW_SHOWKERNELTIMES, wszShowKernelTimes); if (TaskManagerSettings.ShowKernelTimes) CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_CHECKED); else CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_UNCHECKED); if (TaskManagerSettings.CPUHistory_OneGraphPerCPU) CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND); else CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND); /* * Give the tab control focus */ SetFocus(hTabWnd); break; } }
consolewin_info::consolewin_info(debugger_windows_interface &debugger) : disasmbasewin_info(debugger, true, "Debug", nullptr), m_devices_menu(nullptr) { if ((window() == nullptr) || (m_views[0] == nullptr)) goto cleanup; // create the views m_views[1].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_STATE))); if (!m_views[1]->is_valid()) goto cleanup; m_views[2].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_CONSOLE))); if (!m_views[2]->is_valid()) goto cleanup; { // Add image menu only if image devices exist image_interface_iterator iter(machine().root_device()); if (iter.first() != nullptr) { m_devices_menu = CreatePopupMenu(); for (device_image_interface &img : iter) { osd::text::tstring tc_buf = osd::text::to_tstring(string_format("%s : %s", img.device().name(), img.exists() ? img.filename() : "[no image]")); AppendMenu(m_devices_menu, MF_ENABLED, 0, tc_buf.c_str()); } AppendMenu(GetMenu(window()), MF_ENABLED | MF_POPUP, (UINT_PTR)m_devices_menu, TEXT("Images")); } // get the work bounds RECT work_bounds, bounds; SystemParametersInfo(SPI_GETWORKAREA, 0, &work_bounds, 0); // adjust the min/max sizes for the window style bounds.top = bounds.left = 0; bounds.right = bounds.bottom = EDGE_WIDTH + m_views[1]->maxwidth() + (2 * EDGE_WIDTH) + 100 + EDGE_WIDTH; AdjustWindowRectEx(&bounds, DEBUG_WINDOW_STYLE, FALSE, DEBUG_WINDOW_STYLE_EX); set_minwidth(bounds.right - bounds.left); bounds.top = bounds.left = 0; bounds.right = bounds.bottom = EDGE_WIDTH + m_views[1]->maxwidth() + (2 * EDGE_WIDTH) + std::max(m_views[0]->maxwidth(), m_views[2]->maxwidth()) + EDGE_WIDTH; AdjustWindowRectEx(&bounds, DEBUG_WINDOW_STYLE, FALSE, DEBUG_WINDOW_STYLE_EX); set_maxwidth(bounds.right - bounds.left); // position the window at the bottom-right int const bestwidth = (std::min<uint32_t>)(maxwidth(), work_bounds.right - work_bounds.left); int const bestheight = (std::min<uint32_t>)(500, work_bounds.bottom - work_bounds.top); SetWindowPos(window(), HWND_TOP, work_bounds.right - bestwidth, work_bounds.bottom - bestheight, bestwidth, bestheight, SWP_SHOWWINDOW); } // recompute the children set_cpu(*machine().debugger().cpu().get_visible_cpu()); // mark the edit box as the default focus and set it editwin_info::set_default_focus(); return; cleanup: m_views[2].reset(); m_views[1].reset(); m_views[0].reset(); }
void CManageBookmarksDialog::OnListViewHeaderRClick() { DWORD dwCursorPos = GetMessagePos(); POINT ptCursor; ptCursor.x = GET_X_LPARAM(dwCursorPos); ptCursor.y = GET_Y_LPARAM(dwCursorPos); HMENU hMenu = CreatePopupMenu(); int iItem = 0; for each(auto ci in m_pmbdps->m_vectorColumnInfo) { TCHAR szColumn[128]; GetColumnString(ci.ColumnType,szColumn,SIZEOF_ARRAY(szColumn)); MENUITEMINFO mii; mii.cbSize = sizeof(mii); mii.fMask = MIIM_ID|MIIM_STRING|MIIM_STATE; mii.wID = ci.ColumnType; mii.dwTypeData = szColumn; mii.fState = 0; if(ci.bActive) { mii.fState |= MFS_CHECKED; } /* The name column cannot be removed. */ if(ci.ColumnType == CManageBookmarksDialogPersistentSettings::COLUMN_TYPE_NAME) { mii.fState |= MFS_DISABLED; } InsertMenuItem(hMenu,iItem,TRUE,&mii); ++iItem; } int iCmd = TrackPopupMenu(hMenu,TPM_LEFTALIGN|TPM_RETURNCMD,ptCursor.x,ptCursor.y,0,m_hDlg,NULL); DestroyMenu(hMenu); int iColumn = 0; for(auto itr = m_pmbdps->m_vectorColumnInfo.begin();itr != m_pmbdps->m_vectorColumnInfo.end();++itr) { if(itr->ColumnType == iCmd) { HWND hListView = GetDlgItem(m_hDlg,IDC_MANAGEBOOKMARKS_LISTVIEW); if(itr->bActive) { itr->iWidth = ListView_GetColumnWidth(hListView,iColumn); ListView_DeleteColumn(hListView,iColumn); } else { LVCOLUMN lvCol; TCHAR szTemp[128]; GetColumnString(itr->ColumnType,szTemp,SIZEOF_ARRAY(szTemp)); lvCol.mask = LVCF_TEXT|LVCF_WIDTH; lvCol.pszText = szTemp; lvCol.cx = itr->iWidth; ListView_InsertColumn(hListView,iColumn,&lvCol); HWND hTreeView = GetDlgItem(m_hDlg,IDC_MANAGEBOOKMARKS_TREEVIEW); HTREEITEM hSelected = TreeView_GetSelection(hTreeView); CBookmarkFolder &BookmarkFolder = m_pBookmarkTreeView->GetBookmarkFolderFromTreeView(hSelected); int inneriItem = 0; for(auto itrBookmarks = BookmarkFolder.begin();itrBookmarks != BookmarkFolder.end();++itrBookmarks) { TCHAR szColumn[256]; GetBookmarkItemColumnInfo(*itrBookmarks,itr->ColumnType,szColumn,SIZEOF_ARRAY(szColumn)); ListView_SetItemText(hListView,inneriItem,iColumn,szColumn); ++inneriItem; } } itr->bActive = !itr->bActive; break; } else { if(itr->bActive) { ++iColumn; } } } }
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static SERVICE_TABLE_ENTRY service_table[] = { {server_name, (LPSERVICE_MAIN_FUNCTION) ServiceMain}, {NULL, NULL} }; int service_installed; char buf[200], *service_argv[] = {__argv[0], NULL}; POINT pt; HMENU hMenu; switch (msg) { case WM_CREATE: if (__argv[1] != NULL && !strcmp(__argv[1], service_magic_argument)) { start_mongoose(1, service_argv); StartServiceCtrlDispatcher(service_table); exit(EXIT_SUCCESS); } else { start_mongoose(__argc, __argv); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_QUIT: mg_stop(ctx); Shell_NotifyIcon(NIM_DELETE, &TrayIcon); PostQuitMessage(0); break; case ID_EDIT_CONFIG: edit_config_file(); break; case ID_INSTALL_SERVICE: case ID_REMOVE_SERVICE: manage_service(LOWORD(wParam)); break; } break; case WM_USER: switch (lParam) { case WM_RBUTTONUP: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: hMenu = CreatePopupMenu(); AppendMenu(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, server_name); AppendMenu(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); service_installed = manage_service(0); snprintf(buf, sizeof(buf), "NT service: %s installed", service_installed ? "" : "not"); AppendMenu(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, buf); AppendMenu(hMenu, MF_STRING | (service_installed ? MF_GRAYED : 0), ID_INSTALL_SERVICE, "Install"); AppendMenu(hMenu, MF_STRING | (!service_installed ? MF_GRAYED : 0), ID_REMOVE_SERVICE, "Deinstall"); AppendMenu(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); AppendMenu(hMenu, MF_STRING, ID_EDIT_CONFIG, "Edit config file"); AppendMenu(hMenu, MF_STRING, ID_QUIT, "Exit"); GetCursorPos(&pt); SetForegroundWindow(hWnd); TrackPopupMenu(hMenu, 0, pt.x, pt.y, 0, hWnd, NULL); PostMessage(hWnd, WM_NULL, 0, 0); DestroyMenu(hMenu); break; } break; } return DefWindowProc(hWnd, msg, wParam, lParam); }
static LRESULT CALLBACK DialogBoxSubclassProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { int i; EnterCriticalSection(&csDlgBoxSubclass); for (i = 0; i<dlgBoxSubclassCount; i++) if (dlgBoxSubclass[i].hwndDlg == hwndDlg) break; if (i == dlgBoxSubclassCount) { LeaveCriticalSection(&csDlgBoxSubclass); return 0; } WNDPROC pfnWndProc = dlgBoxSubclass[i].pfnOldWndProc; DWORD flags = dlgBoxSubclass[i].flags; if (msg == WM_NCDESTROY) { struct DlgBoxSubclassData *buf; MoveMemory(dlgBoxSubclass + i, dlgBoxSubclass + i + 1, sizeof(struct DlgBoxSubclassData)*(dlgBoxSubclassCount - i - 1)); dlgBoxSubclassCount--; buf = (struct DlgBoxSubclassData*)mir_realloc(dlgBoxSubclass, sizeof(struct DlgBoxSubclassData)*dlgBoxSubclassCount); if (buf != NULL) dlgBoxSubclass = buf; else if (!dlgBoxSubclassCount) dlgBoxSubclass = NULL; } LeaveCriticalSection(&csDlgBoxSubclass); switch (msg) { case WM_INITMENUPOPUP: if (flags&DBSDF_MINIMIZABLE || flags&DBSDF_MAXIMIZABLE) { HMENU hMenu = GetSystemMenu(hwndDlg, FALSE); if ((HMENU)wParam != hMenu) break; int isMin = IsIconic(hwndDlg); int isMax = IsZoomed(hwndDlg); EnableMenuItem(hMenu, SC_RESTORE, MF_BYCOMMAND | (isMin || isMax) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, SC_MINIMIZE, MF_BYCOMMAND | (flags&DBSDF_MINIMIZABLE && !isMin) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, SC_MAXIMIZE, MF_BYCOMMAND | (flags&DBSDF_MAXIMIZABLE && !isMax) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, SC_SIZE, MF_BYCOMMAND | (GetWindowLongPtr(hwndDlg, GWL_STYLE)&WS_THICKFRAME && !isMin && !isMax) ? MF_ENABLED : MF_GRAYED); } break; case WM_MOUSEMOVE: // TrackMouseEvent() would disturb too much if (!settingAutoTipDelay) break; if (cursorPos == lParam) break; cursorPos = lParam; case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEWHEEL: if (!settingAutoTipDelay) break; if (msg != WM_MOUSEMOVE && !idMouseMoveTimer) break; if (openedAutoTip && IsWindow(hwndHelpDlg)) DestroyWindow(hwndHelpDlg); openedAutoTip = 0; hwndMouseMoveDlg = hwndDlg; if (hwndHelpDlg == NULL) idMouseMoveTimer = SetTimer(NULL, idMouseMoveTimer, settingAutoTipDelay, NoMouseMoveForDelayTimerProc); break; case WM_CAPTURECHANGED: if ((HWND)lParam == hwndDlg) break; case WM_SHOWWINDOW: case WM_WINDOWPOSCHANGING: case WM_MOVING: case WM_SIZING: case WM_CANCELMODE: case WM_CHILDACTIVATE: case WM_MOUSEACTIVATE: case WM_ACTIVATEAPP: case WM_ACTIVATE: if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; break; case WM_SYSCOMMAND: if ((UINT)wParam == SC_CONTEXTHELP_DIALOG) { // alt. "What's this dialog?" if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; if (hwndHelpDlg == NULL) { hwndHelpDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_HELP), NULL, HelpDlgProc); if (hwndHelpDlg == NULL) break; } SendMessage(hwndHelpDlg, M_CHANGEHELPCONTROL, 0, (LPARAM)hwndDlg); return 0; } break; case WM_CONTEXTMENU: { POINT pt; struct FindChildAtPointData fcap; // workaround for badly coded plugins that do display a context menu // and pass the message to DefWindowProc afterwards (doing a "break;"). if (GetTickCount() - GetMessageTime()>10) return 0; if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; ZeroMemory(&fcap, sizeof(fcap)); POINTSTOPOINT(pt, MAKEPOINTS(lParam)); // ChildWindowFromPoint() messes up with group boxes fcap.hwnd = NULL; fcap.pt = pt; EnumChildWindows(hwndDlg, FindChildAtPointEnumProc, (LPARAM)&fcap); HWND hwndCtl = fcap.hwnd; if (hwndCtl == NULL) { ScreenToClient(hwndDlg, &pt); hwndCtl = ChildWindowFromPointEx(hwndDlg, pt, CWP_SKIPINVISIBLE); if (hwndCtl == NULL) break; POINTSTOPOINT(pt, MAKEPOINTS(lParam)); } { LONG_PTR flags = (LONG_PTR)GetProp(hwndCtl, PROP_CONTEXTSTATE); if (flags&PROPF_MENUDISABLED) break; else if (!(flags&PROPF_MENUFORCED)) { int type = GetControlType(hwndCtl); // showing a context menu on these looks silly (multi components) if (type == CTLTYPE_TOOLBAR || type == CTLTYPE_LISTVIEW || type == CTLTYPE_TREEVIEW || type == CTLTYPE_STATUSBAR || type == CTLTYPE_CLC) break; } } if (IsRealChild(hwndDlg, hwndCtl)) { HMENU hMenu = CreatePopupMenu(); AppendMenu(hMenu, MF_STRING, SC_CONTEXTHELP, (hwndCtl == hwndDlg) ? TranslateT("&What's this dialog?") : TranslateT("&What's this?")); if (TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_HORPOSANIMATION | TPM_VERPOSANIMATION | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_NONOTIFY, pt.x, pt.y, hwndDlg, NULL)) { if (hwndHelpDlg == NULL) { hwndHelpDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_HELP), NULL, HelpDlgProc); if (hwndHelpDlg == NULL) { DestroyMenu(hMenu); break; } } SendMessage(hwndHelpDlg, M_CHANGEHELPCONTROL, 0, (LPARAM)hwndCtl); } DestroyMenu(hMenu); } return 0; } case WM_HELP: { HELPINFO *hi = (HELPINFO*)lParam; if (hi->iContextType != HELPINFO_WINDOW) break; // fix for SHBrowseForFolder() dialog, which sends unhandled help to parent if (!IsRealChild(hwndDlg, (HWND)hi->hItemHandle)) break; if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; if (!IsWindow(hwndHelpDlg)) { hwndHelpDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_HELP), NULL, HelpDlgProc); if (hwndHelpDlg == NULL) break; } SendMessage(hwndHelpDlg, M_CHANGEHELPCONTROL, 0, (LPARAM)hi->hItemHandle); // we need to eat the next WM_LBUTTONDOWN (if invoked by mouse) if (GetKeyState(GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON) & 0x8000 && hEatNextMouseHook == NULL) hEatNextMouseHook = SetWindowsHookEx(WH_MOUSE, EatNextMouseButtonUpHookProc, NULL, GetCurrentThreadId()); return TRUE; } case WM_NCDESTROY: if (idMouseMoveTimer) KillTimer(NULL, idMouseMoveTimer); idMouseMoveTimer = 0; EnumChildWindows(hwndDlg, RemovePropForAllChildsEnumProc, (LPARAM)PROP_CONTEXTSTATE); { TCHAR text[64]; mir_sntprintf(text, _countof(text), _T("unhooked window 0x%X for context help\n"), hwndDlg); OutputDebugString(text); } SetWindowLongPtr(hwndDlg, GWLP_WNDPROC, (LONG_PTR)pfnWndProc); break; } return CallWindowProc(pfnWndProc, hwndDlg, msg, wParam, lParam); }
void Menu::create(Window *wnd,uint32_t st) { int i,n; char str[257]; #ifdef USE_WIN32 char buf[5]; #ifdef USE_WCHAR wchar_t wstr[257]; #endif #endif MenuItem *m; #ifdef USE_GTK GtkAccelGroup *accel_group = gtk_accel_group_new(); gtk_window_add_accel_group(GTK_WINDOW((GtkWindow *)((Window *)parent)->wnd),accel_group); component = (Component)gtk_menu_bar_new(); #endif #ifdef USE_WIN32 component = (Component)CreateMenu(); #endif window = wnd; for(i=0,m=items; m && i<nitems; ++i) { *str = '\0'; for(n=0; n<m->lvl; ++n) strcat(str,"--> "); strcat(str,m->name); debug_output("Menu::create(menu: index=%d,id='%d',parent='%d',child='%d',menuitem='%s')\n",m->index,m->id,m->parent? m->parent->id : -1,m->child? m->child->id : -1,str); #ifdef USE_GTK if(m->id==-1) { if(m->parent) { m->item = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL((GtkWidget *)m->parent->submenu),m->item); } } else { m->item = gtk_image_menu_item_new_with_label(m->name); if(m->icon) gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(m->item),GTK_WIDGET(gtk_image_new_from_stock(m->icon,GTK_ICON_SIZE_MENU))); if(!m->sensitive) gtk_widget_set_sensitive(m->item,false); if(m->acc!=-1) { gtk_image_menu_item_set_accel_group(GTK_IMAGE_MENU_ITEM(m->item),accel_group); gtk_widget_add_accelerator(m->item,"activate",accel_group,m->acc,(GdkModifierType)m->acc_mod,GTK_ACCEL_VISIBLE); } if(m->child) { m->submenu = (Component)gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(m->item),m->submenu); } if(m->parent) { gtk_menu_shell_append(GTK_MENU_SHELL(m->parent->submenu),m->item); if(!m->child) { debug_output("Menu::create(g_signal_connect: %s - %p)\n",m->name,m); if(event_handler) g_signal_connect(G_OBJECT(m->item),"activate",G_CALLBACK(menuitem_callback),(gpointer)m); } } else { gtk_menu_shell_append(GTK_MENU_SHELL((GtkWidget *)component),m->item); } } #endif #ifdef USE_WIN32 if(m->id==-1) { if(m->parent) AppendMenu((HMENU)m->parent->submenu,MF_SEPARATOR,0,0); } else { strcpy(str,m->name); if(m->acc!=-1) { strcat(str,"\t"); if((m->acc_mod&KEY_CONTROL)) strcat(str,"Ctrl-"); if((m->acc_mod&KEY_ALT)) strcat(str,"Alt-"); if((m->acc_mod&KEY_SHIFT)) strcat(str,"Shift-"); if(m->acc>=KEY_a && m->acc<=KEY_z) sprintf(buf,"%c",m->acc); else if(m->acc>=KEY_F1 && m->acc<=KEY_F12) sprintf(buf,"F%d",m->acc+1-KEY_F1); strcat(str,buf); } if(m->child) { m->submenu = (Component)CreatePopupMenu(); #ifdef USE_WCHAR char2w(wstr,str,256); debug_output("Menu::create(m: %p, wstr: %ls)\n",m,wstr); AppendMenu((HMENU)(m->parent? m->parent->submenu : component),MF_STRING|MF_POPUP,(UINT)m->submenu,wstr); #else AppendMenu((HMENU)(m->parent? m->parent->submenu : component),MF_STRING|MF_POPUP,(UINT)m->submenu,str); #endif } else if(m->parent) { #ifdef USE_WCHAR char2w(wstr,str,256); debug_output("Menu::create(m: %p, parent: %p, submenu: %p, wstr: %ls)\n",m,m->parent,m->parent? m->parent->submenu : 0,wstr); AppendMenu((HMENU)m->parent->submenu,MF_STRING,WIDGET_MAKE_ID(WIDGET_MENU,m->index),wstr); #else AppendMenu((HMENU)m->parent->submenu,MF_STRING,WIDGET_MAKE_ID(WIDGET_MENU,m->index),str); #endif } // if(!m->sensitive) gtk_widget_set_sensitive(m->item,false); // if(m->acc!=-1) { // gtk_image_menu_item_set_accel_group(GTK_IMAGE_MENU_ITEM(m->item),accel_group); // gtk_widget_add_accelerator(m->item,"activate",accel_group,m->acc,(GdkModifierType)m->acc_mod,GTK_ACCEL_VISIBLE); // } } #endif if(i==nitems-1) break; if(m->child) m = m->child; else if(items[m->index+1].parent==m->parent || m->parent) m = &items[m->index+1]; else break; } #ifdef USE_WIN32 SetMenu((HWND)((Window *)parent)->component,(HMENU)component); #endif }
/* * mswin_tw_wm_command() - WM_CONTEXTMENU handler for textwindows */ static void mswin_tw_wm_contextmenu(MSWIN_TEXTWINDOW *mswin_tw, HWND hwnd, HWND hwndContext, int xPos, int yPos) { HMENU hMenu; hMenu = CreatePopupMenu(); if(hMenu) { int i; CHARRANGE cr; MENUITEMINFO mitem; static const struct { UINT wID; LPTSTR dwTypeData; } s_popup_menu[] = { { IDM_EDIT_COPY, TEXT("&Copy") }, { IDM_EDIT_COPY_APPEND, TEXT("Copy &Append") }, { IDM_EDIT_CLEAR, TEXT("Clea&r") }, }; memset(&mitem, 0, sizeof(MENUITEMINFO)); mitem.cbSize = sizeof(MENUITEMINFO); mitem.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; mitem.fType = MFT_STRING; SendMessage(mswin_tw->hwnd_edit, EM_EXGETSEL, (WPARAM)0, (LPARAM)&cr); for(i = 0; i < ARRAYSIZE(s_popup_menu); i++) { switch(s_popup_menu[i].wID) { case IDM_EDIT_CLEAR: // Only enable it if there is a clear callback set. mitem.fState = (mswin_tw->clear_callback) ? MFS_ENABLED : MFS_GRAYED; break; case IDM_EDIT_COPY: case IDM_EDIT_COPY_APPEND: // Only enable if there is a selection. mitem.fState = (cr.cpMax > cr.cpMin) ? MFS_ENABLED : MFS_GRAYED; break; default: mitem.fState = MFS_ENABLED; break; } mitem.wID = s_popup_menu[i].wID; mitem.dwTypeData = s_popup_menu[i].dwTypeData; mitem.cch = (UINT)_tcslen(s_popup_menu[i].dwTypeData); InsertMenuItem(hMenu, i, FALSE, &mitem); } TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_LEFTBUTTON, xPos, yPos, 0, hwnd, NULL); DestroyMenu(hMenu); } }