Reflection .NET API
Walkthrough / Customize the User Interface / Define Context Menus
Define Context Menus

You can define context menus and assign them at runtime. You can also load context menus or switch from one menu to another when specific screens are loaded.  

Define a Context Menu

Switch Context Menus

Define a Context Menu

This sample opens Reflection, creates a new session, and defines and assigns a context menu.

  1. In Visual Studio, create a new Console Application project and add references for the following Reflection assemblies. (Depending on your version of Visual Studio, these can be found either on the .NET tab or under Assemblies | Extensions.)
    Attachmate.Reflection.Framework
    Attachmate.Reflection.Emulation.OpenSystems (if using Open Systems)
    Attachmate.Reflection.Emulation.IbmHosts (if using IBM)
    Attachmate.Reflection
  2. Replace all the code in the Program.cs file with the following code for the terminal you are using. This code creates a new terminal session, and a new context menu, which is assigned to a copy of the existing menu. It creates a menu item and adds it to the menu and removes an item. Then it assigns the new menu as the default menu for the session.  
    Create a context menu
    Copy Code
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Attachmate.Reflection.Framework;
    using Attachmate.Reflection.Emulation.IbmHosts;
    using Attachmate.Reflection.UserInterface;
    using Attachmate.Reflection;
    namespace ContextMenus
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Start a visible instance of Reflection or get the instance running at the given channel name
                Attachmate.Reflection.Framework.Application app = MyReflection.CreateApplication("myWorkspace", true);
    
                //Create a Ibm 3270 terminal
                IIbmTerminal terminal = (IIbmTerminal)app.CreateControl(new Guid("{09E5A1B4-0BA6-4546-A27D-FE4762B7ACE1}"));
    
                //Specify the host name or IP address and connect.
                terminal.HostAddress = "demo:ibm3270.sim";
                terminal.Port = 623;
                terminal.Connect();
    
                //Make the session visible               
                IFrame frame = (IFrame)app.GetObject("Frame");
                frame.CreateView(terminal);
    
                //Get the collection of context menus defined for this session
                IContextMenus menus = (IContextMenus)terminal.ContextMenus;
    
                //Create a menu and assign it to a copy of the existing default menu
                ContextMenu AlternateMenu = new ContextMenu("alternateMenu");
                AlternateMenu = (ContextMenu)menus.DefaultContextMenu;
    
                //Create an action and add it to a menu item
                InputMapAction action = new InputMapAction(InputMapActionID.EmailMessageAction, null);
                InputMapActionSequence sequence = new InputMapActionSequence();
                sequence.Add(action);
                ContextMenuItem item = new ContextMenuItem("Create Email", ContextMenuItemType.MenuItem, sequence);
    
                //Add a line separator and the menu item to the alternate menu
                AlternateMenu.AddSeparator();
                AlternateMenu.AddMenuItem(item);
    
                //Remove the Cut item in the alternate menu based on its position in the menu
                AlternateMenu.RemoveItem(2);
    
                //assign the Alternate menu as the context menu for this session
                menus.DefaultContextMenu = AlternateMenu;
    
                Console.ReadKey();
            }
        }
    }
                                       
    
      

To test this project

  1. Press F5 to compile and run the project.
  2. In the Reflection session, right-click to open the context sensitive menu and verify that it has a Create Email item and does not have a Cut item.

Switch the Context Menu Back and Forth

You can create an alternate menu and use only on specific screens.

  1. In Visual Studio, create a new Console Application project and add references for the following Reflection assemblies. (Depending on your version of Visual Studio, these can be found either on the .NET tab or under Assemblies | Extensions.)Attachmate.Reflection.Framework
    Attachmate.Reflection.Emulation.OpenSystems (if using Open Systems)
    Attachmate.Reflection.Emulation.IbmHosts (if using IBM)
    Attachmate.Reflection
  2. Replace all the code in the Program.cs file with the following code for the terminal you are using. This code adds properties for the two menus we will create; an Alternate menu that we can customize and a copy of the Default menu.
    Add properties for menus
    Copy Code
                                    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Attachmate.Reflection.Framework;
    using Attachmate.Reflection.Emulation.IbmHosts;
    using Attachmate.Reflection.UserInterface;
    using Attachmate.Reflection;
    namespace ContextMenus
    {
        class Program
        {
            private IContextMenu _alternateMenu;
            private IContextMenu _defaultMenu;
            public IContextMenu AlternateMenu
            {
                get { return this._alternateMenu; }
                set { this._alternateMenu = value; }
            }
            public IContextMenu DefaultMenu
            {
                get { return this._defaultMenu; }
                set { this._defaultMenu = value; }
            }
            static void Main(string[] args)
            {
    
            }
        }
    }
    
  3. Add the following code to create the menus. This code opens a session and creates two copies of the original menu—an Alternate menu that we can customize and a Default menu that we can reference when we need to switch back to the default. Then it creates a menu item mapped to an email action and adds it to the AlternateMenu. It also removes the Cut item from the menu.  Finally, it creates event handlers that we'll use to swap menus for specific screens and to make sure the session is set to use the default menu if it is automatically saved when it is closed.
    Create the menus
    Copy Code
    static void Main(string[] args)
    {
        Program SwitchMenus = new Program();
        //Start a visible instance of Reflection or get the instance running at the given channel name
        Attachmate.Reflection.Framework.Application app = MyReflection.CreateApplication("myWorkspace", true);
      
          
        //Create an IBM 3270 terminal
        string sessionFilePath = System.Environment.GetEnvironmentVariable("USERPROFILE") + @"\Documents\Micro Focus\Reflection\demoSession.rd3x";
        IIbmTerminal terminal = (IIbmTerminal)app.CreateControl(sessionFilePath);
    
        //Make the session visible              
        IFrame frame = (IFrame)app.GetObject("Frame");
        frame.CreateView(terminal);
    
        //Get the collection of context menus defined for this session
        IContextMenus menus = (IContextMenus)terminal.ContextMenus;
    
        //Initialize two menus as copies of the existing default menu
        SwitchMenus.AlternateMenu = new ContextMenu("alternateMenu");
        SwitchMenus.AlternateMenu = menus.DefaultContextMenu;
        SwitchMenus.DefaultMenu = new ContextMenu("defaultMenu");
        SwitchMenus.DefaultMenu = menus.DefaultContextMenu;
    
        //Create an action and add it to a menu item
        InputMapAction action = new InputMapAction(InputMapActionID.EmailMessageAction, null);
        InputMapActionSequence sequence = new InputMapActionSequence();
        sequence.Add(action);
        ContextMenuItem item = new ContextMenuItem("Create Email", ContextMenuItemType.MenuItem, sequence);
    
        //Add the menu item to the alternate menu
        SwitchMenus.AlternateMenu.AddSeparator();
        SwitchMenus.AlternateMenu.AddMenuItem(item);
    
        //Remove an item in the alternate menu based its position in the menu
        SwitchMenus.AlternateMenu.RemoveItem(2);
    
        //Set event handler for NewScreenReady event so we can identify screens and swap menus for specific screens
        IIbmScreen screen = terminal.Screen;
        screen.NewScreenReady += SwitchMenus.screen_NewScreenReady;
    
        //Set event handler for BeforeDisconnect event to make sure session is saved with the correct default menu
        terminal.BeforeDisconnect += SwitchMenus.terminal_BeforeDisconnect;
    
        Console.ReadKey();
    }
    
  4. Set up the first event to switch menus when a specific command is recognized (for Open Systems) or when a certain screen is recognized.       
    Handle NewScreenReady event to swap menus
    Copy Code
    public void screen_NewScreenReady(object sender, EventArgs e)
    {
        IIbmScreen screen = (IIbmScreen)sender;
        IIbmTerminal terminal = screen.Parent;
    
        //Get a string that is unique to the second screen in the demo and use it to identify this screen
        string screenID1 = screen.GetText(1, 1, 5);
    
        //Use the alternate menu only on this screen
        if (screenID1 == "LOGON")
        {
            terminal.ContextMenus.DefaultContextMenu = this.AlternateMenu;
        }
        else
        {
            terminal.ContextMenus.DefaultContextMenu = this.DefaultMenu;
        }
    }
    
  5. Set up the second event to make sure the session is set to use the default menu when it is saved. We need to handle this event to prevent changing the default menu settings if the Reflection workspace is set to save document settings automatically when closing a document. (In our sample, if the session is closed when the alternate menu is used, the alternate menu is saved as the default menu for this session unless we handle this event.)         
    Save before disconnecting
    Copy Code
    //Set the session to use the default menu and save it before disconnecting or closing
    private void terminal_BeforeDisconnect(object sender, EventArgs e)
    {
        IIbmTerminal terminal = (IIbmTerminal)sender;
        terminal.ContextMenus.DefaultContextMenu = this.DefaultMenu;
        terminal.Save();
    }
    

To test this project

  1. Press F5 to run the sample
  2. When the session opens, right-click on the screen to view the context menu and verify that the default menu is displayed.
  3. Enter any credentials to log on to the demo.
  4. If you are using Open Systems, enter "demodata" to go to a data screen.
  5. Right-click on the screen and verify that it has a Create Email item and does not have a Cut item.