How to add your own items to the default Codejock Context menu
Question
Each DEO control has its own popup menu. In the old days (when FormFloatingPopupMenu was used), we could add our own items to the default menu.
How can we do that now the cCJContextMenu class is being used?
So when a user right clicks a dbForm, I'd like to show the default context menu but add my own item(s) to the bottom of the menu.
Answer
by John Tuohy
We didn't make these menus classes because we wanted to show an example of how you can build context menus with objects and how they can be visually modeled. Load oDEOEditContextMenu.pkg and you can visually model it.
Rather than augmenting our menus I might suggest that you create your own, usingoDEOEditContextMenu.pkg as a model. You could make this with objects (which are visually modeled) or you can do it with a sub-class. Then change the handle of Default_dbFloating_Menu_ID to point to your own custom object. This really doesn't add much code to your application and it gives you complete control of your default menu.
For example, you could add your custom menu in the middle as follows:
Use Windows.pkg Use cCJStandardMenuItemClasses.pkg Use cCJDeoMenuItemClasses.pkg Class cMenuTest is a cCJMenuItem Procedure Construct_Object Forward Send Construct_Object Set psCaption to "Testing" End_Procedure Procedure OnExecute Variant vCommandBarControl Showln "Hi" End_Procedure End_Class Object oMyCoolDEOEditContextMenu is a cCJContextMenu Move Self to Default_dbFloating_Menu_ID Object oUndoMenuItem is a cCJUndoMenuItem End_Object Object oCutMenuItem is a cCJCutMenuItem Set pbControlBeginGroup to True End_Object Object oCopyMenuItem is a cCJCopyMenuItem End_Object Object oPasteMenuItem is a cCJPasteMenuItem End_Object Object oDeleteItem is a cCJDeleteEditMenuItem End_Object Object oSelectAllMenuItem is a cCJSelectAllMenuItem Set pbControlBeginGroup to True End_Object Object oMyCoolMenu a cMenuTest Set pbControlBeginGroup to True End_Object Object oPromptMenuItem is a cCJPromptMenuItem Set pbControlBeginGroup to True End_Object Object oFindNextMenu is a cCJFindNextMenuItem Set pbControlBeginGroup to True End_Object Object oFindPreviousMenu is a cCJFindPreviousMenuItem End_Object Object oClearMenuItem is a cCJClearMenuItem Set pbControlBeginGroup to True End_Object Object oClearAllMenu is a cCJClearAllMenuItem End_Object Object oSaveMenu is a cCJSaveMenuItem End_Object Object oDeleteMenu is a cCJDeleteMenuItem End_Object End_Object
If you've built your own menu you can do a similar thing inside of Popup. You can do whatever you want before you forward Popup (like create new items) and you can do whatever you want after you forward Popup (like remove some items). It's actually a lot easier than regular menus. I thought this was documented somewhere, but I can't find it.
And, finally, if you really just want to change an existing context menu, it's actually pretty easy. It's a lot easier than creating dynamic menus because the objects are not activated so all you have to do is to add the objects. You can do something like this:
Class cMenuTest is a cCJMenuItem Procedure Construct_Object Forward Send Construct_Object Set psCaption to "Testing" End_Procedure Procedure OnExecute Variant vCommandBarControl Showln "Hi" End_Procedure End_Class Procedure DoAddItemsToContextMenu Handle hoMenu hoMenu1 If (Default_dbFloating_Menu_ID <> 0) Begin Move Default_dbFloating_Menu_ID to hoMenu Get Create of hoMenu (RefClass(cMenuTest)) to hoMenu1 Set pbControlBeginGroup of hoMenu1 to True End End_Procedure Send DoAddItemsToContextMenu