/******************************************************************************* * pvmenu.cpp * * This module implements menu-related routines for the Windows build of POV. * * Author: Christopher J. Cason. * * --------------------------------------------------------------------------- * Persistence of Vision Ray Tracer ('POV-Ray') version 3.7. * Copyright 1991-2013 Persistence of Vision Raytracer Pty. Ltd. * * POV-Ray is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * POV-Ray is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * --------------------------------------------------------------------------- * POV-Ray is based on the popular DKB raytracer version 2.12. * DKBTrace was originally written by David K. Buck. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins. * --------------------------------------------------------------------------- * $File: //depot/public/povray/3.x/windows/pvmenu.cpp $ * $Revision: #1 $ * $Change: 6069 $ * $DateTime: 2013/11/06 11:59:40 $ * $Author: chrisc $ *******************************************************************************/ // REMOVAL OF NON-EXPERT MENUS (August 1998) ... the 'non-expert menus' option // was removed. This leaves some of this code redundant, but here it is anyhow ... #define POVWIN_FILE #define _WIN32_IE COMMONCTRL_VERSION #include #include #include #include #include "pvengine.h" #include "resource.h" #include "pvedit.h" #include "pvdisplay.h" #ifdef RTR_SUPPORT #include "rtrsupport.h" #endif // this must be the last file included #include "syspovdebug.h" namespace povwin { bool MenuBarDraw = false ; char WindowList[MAX_EDITORS + 1][_MAX_PATH]; HMENU hMainMenu ; HMENU hMenuBar ; HMENU hPopupMenus ; HMENU hFileMenu ; HMENU hEditMenu ; HMENU hRenderMenu ; HMENU hOptionsMenu ; HMENU hToolsMenu ; HMENU hPluginsMenu ; HMENU hHelpMenu ; HMENU hOldRenderwinMenu ; HMENU hNewRenderwinMenu ; HMENU hVidcapMenu ; HACCEL hAccelerators ; extern HWND main_window ; extern HWND toolbar_window ; extern bool RenderwinIsChild ; extern bool preserve_bitmap ; extern bool rendering ; extern bool render_auto_close ; extern bool IsVista ; extern unsigned renderwin_8bits ; bool PVEnableMenuItem (UINT idItem, UINT state) { EnableMenuItem (hPopupMenus, idItem, state) ; EnableMenuItem (hMenuBar, idItem, state) ; SendMessage (toolbar_window, TB_ENABLEBUTTON, idItem, MAKELONG (state == MF_ENABLED, 0)) ; if (idItem == CM_RENDERCLOSE) { SendMessage (toolbar_window, TB_HIDEBUTTON, CM_RENDERSHOW, MAKELONG (state == MF_ENABLED, 0)) ; SendMessage (toolbar_window, TB_HIDEBUTTON, CM_RENDERCLOSE, MAKELONG (state != MF_ENABLED, 0)) ; } return (true) ; } bool PVCheckMenuItem (UINT idItem, UINT state) { CheckMenuItem (hPopupMenus, idItem, state) ; CheckMenuItem (hMenuBar, idItem, state) ; return (true) ; } bool PVCheckMenuRadioItem (UINT idFirst, UINT idLast, UINT idItem) { CheckMenuRadioItem (hPopupMenus, idFirst, idLast, idItem, MF_BYCOMMAND) ; CheckMenuRadioItem (hMenuBar, idFirst, idLast, idItem, MF_BYCOMMAND) ; return (true) ; } bool PVModifyMenu (UINT idItem, UINT flags, UINT idNewItem, LPCSTR lpNewItem) { ModifyMenu (hPopupMenus, idItem, flags, idNewItem, lpNewItem) ; ModifyMenu (hMenuBar, idItem, flags, idNewItem, lpNewItem) ; MenuBarDraw = true ; return (true) ; } bool PVDeleteMenuItem (UINT idItem) { DeleteMenu (hPopupMenus, idItem, MF_BYCOMMAND) ; DeleteMenu (hMenuBar, idItem, MF_BYCOMMAND) ; return (true) ; } int find_menuitem (HMENU hMenu, LPCSTR title) { int max = GetMenuItemCount (hMenu) ; char str [256] ; if (title[0] == '\0') return (-1); for (int i = 0 ; i < 64 ; i++) if (GetMenuString (hMenu, i, str, sizeof (str) - 1, MF_BYPOSITION) > 0) if (strcmp (title, str) == 0) return (i) ; return (-1) ; } void init_menus (void) { hPopupMenus = LoadMenu (hInstance, MAKEINTRESOURCE (POPUP_MENUS32)) ; hAccelerators = LoadAccelerators (hInstance, MAKEINTRESOURCE (PVENGINE_MENU)) ; hMenuBar = LoadMenu (hInstance, MAKEINTRESOURCE (PVENGINE_MENU32)) ; hFileMenu = GetSubMenu (hMenuBar, 0) ; hEditMenu = GetSubMenu (hMenuBar, 1) ; hRenderMenu = GetSubMenu (hMenuBar, 2) ; hOptionsMenu = GetSubMenu (hMenuBar, 3) ; hToolsMenu = GetSubMenu (hMenuBar, 4) ; hHelpMenu = GetSubMenu (hMenuBar, 5) ; hOldRenderwinMenu = GetSubMenu (hPopupMenus, 2) ; hNewRenderwinMenu = GetSubMenu (hPopupMenus, 3) ; int n = find_menuitem(hOptionsMenu, "&Other Settings") ; assert(n != -1) ; hVidcapMenu = GetSubMenu(GetSubMenu(hOptionsMenu, n), 0) ; n = find_menuitem(hOptionsMenu, "GU&I-Extensions") ; assert(n != -1) ; hPluginsMenu = GetSubMenu(hOptionsMenu, n); if (!IsVista) { RemoveMenu (hRenderMenu, CM_RENDERPRIORITY_BACKGROUND, MF_BYCOMMAND); RemoveMenu (hPopupMenus, CM_RENDERPRIORITY_BACKGROUND, MF_BYCOMMAND); } #if POV_RAY_IS_OFFICIAL != 1 n = find_menuitem(hOptionsMenu, "&Update Checks") ; assert(n != -1) ; RemoveMenu (hOptionsMenu, n, MF_BYPOSITION); RemoveMenu (hHelpMenu, CM_CHECKUPDATENOW, MF_BYCOMMAND); #endif } void set_newuser_menu (HMENU hMenu, UINT ID, bool hide, bool separator) { if (GetMenuItemID (hMenu, 0) != ID) { if (hide) return ; if (separator) InsertMenu (hMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, NULL) ; InsertMenu (hMenu, 0, MF_BYPOSITION, ID, "&Help On This Menu") ; } else { if (!hide) return ; DeleteMenu (hMenu, 0, MF_BYPOSITION) ; if (separator) DeleteMenu (hMenu, 0, MF_BYPOSITION) ; } } void set_newuser_menus (bool hide) { set_newuser_menu (hFileMenu, CM_FILEMENUHELP, hide, true) ; set_newuser_menu (hEditMenu, CM_EDITMENUHELP, hide, true) ; set_newuser_menu (hRenderMenu, CM_RENDERMENUHELP, hide, true) ; set_newuser_menu (hOptionsMenu, CM_OPTIONSMENUHELP, hide, true) ; set_newuser_menu (hToolsMenu, CM_TOOLSMENUHELP, hide, false) ; set_newuser_menu (hToolsMenu, CM_WINDOWMENUHELP, hide, true) ; set_newuser_menu (GetSubMenu (hPopupMenus, 0), CM_MESSAGEWINMENUHELP, hide, true) ; set_newuser_menu (GetSubMenu (hPopupMenus, 1), CM_RENDERWINMENUHELP, hide, true) ; EditPassOnMessage (NULL, HIDE_NEWUSER_HELP_MESSAGE, hide, 0, NULL) ; } void clear_menu (HMENU hMenu) { while (RemoveMenu (hMenu, 0, MF_BYPOSITION)) ; } void setup_menus (bool have_editor) { if (have_editor) AppendMenu (hOptionsMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetOptionsMenu), "&Editor Window") ; #ifdef RTR_SUPPORT std::vector vidSources; size_t numSources = GetVideoSourceNames(vidSources); if (numSources > 0) { DeleteMenu (hVidcapMenu, 0, MF_BYPOSITION) ; if (numSources > CM_LASTVIDEOSOURCE - CM_FIRSTVIDEOSOURCE + 1) numSources = CM_LASTVIDEOSOURCE - CM_FIRSTVIDEOSOURCE + 1 ; for (int i = 0; i < numSources; i++) InsertMenu (hVidcapMenu, -1, MF_BYPOSITION, CM_FIRSTVIDEOSOURCE + i, vidSources[i].c_str()) ; CheckMenuRadioItem(hVidcapMenu, CM_FIRSTVIDEOSOURCE, CM_LASTVIDEOSOURCE, CM_FIRSTVIDEOSOURCE, MF_BYCOMMAND); int n = find_menuitem (hVidcapMenu, GetVideoSourceName().c_str()); if (n != -1) CheckMenuRadioItem(hVidcapMenu, CM_FIRSTVIDEOSOURCE, CM_LASTVIDEOSOURCE, CM_FIRSTVIDEOSOURCE + n, MF_BYCOMMAND); else SetVideoSourceName(vidSources[0].c_str()); } #endif DrawMenuBar (main_window) ; } // build the menu displayed when the message window is selected void build_main_menu (HMENU hMenu, bool have_editor) { clear_menu (hMenu) ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) (have_editor ? EditGetMenu (GetFileMenu) : hFileMenu), "&File") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hEditMenu, "&Edit") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hRenderMenu, "&Render") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hOptionsMenu, "&Options") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hToolsMenu, "&Tools") ; if (EditGetMenu (GetWindowMenu) != NULL) AppendMenu (hMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetWindowMenu), "&Window") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hHelpMenu, "&Help") ; DrawMenuBar (main_window) ; } // build the menu displayed when an editor window is selected void build_editor_menu (HMENU hMenu) { clear_menu (hMenu) ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetFileMenu), "&File") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetEditMenu), "&Edit") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetSearchMenu), "Se&arch") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetTextMenu), "&Text") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetOptionsMenu), "E&ditor") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetInsertMenu), "&Insert") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hRenderMenu, "&Render") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hOptionsMenu, "&Options") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hToolsMenu, "Too&ls") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) EditGetMenu (GetWindowMenu), "&Window") ; AppendMenu (hMenu, MF_POPUP, (UINT_PTR) hHelpMenu, "&Help") ; DrawMenuBar (main_window) ; } }