The context menu is not a control itself - it is part of existing controls. Context menus are supported by the following controls:
TEXTGRID2
TEXTGRIDSSS2
TREENODE2
CLIENTTREE
FIELD
All these controls have items that are represented by corresponding objects on the server side:
For the text grid controls, each row of the grid is represented by a
certain object on the server side that is managed inside a
TEXTGRIDCollection
.
For the tree controls, each node of the tree is represented by a
certain object (derived from NODEInfo
) that is managed
inside a TREECollection
.
When the user right-clicks on an item, the method
reactOnContextMenuRequest()
is called inside the
item's server-side object. When the user right-clicks in a FIELD control for
which "myfield" has been defined with the
valueprop
property, the default name of the called
method is reactOnContextMenuMyfield
. In principle,
your server-side implementation could do anything as reaction inside the
implementation of the method - i.e. you do not have to open a context menu, but
you can also do every other thing that you are able to do inside an adapter
implementation.
To open a context menu, you proceed as follows:
You define a tree collection.
You add menu nodes to the tree collection - exactly in the same way as you do it with a normal MENU control.
You pass the tree collection to the adapter via its method
showPopupMenu()
.
This document covers the following topics:
There is no special specification necessary inside the layout definition
of the corresponding TEXTGRID2/ TEXTGRIDSSS2 control. All you have to do is to
implement the reactOnContextMenuRequest()
method
inside the class representing the items of the grid:
public class MenuAdapter extends Model { // ------------------------------------------------------------------------ // inner classes // ------------------------------------------------------------------------ /** class used for pop-up menu. */ public class MyMenuNodeInfo extends MENUNODEInfo { public MyMenuNodeInfo(String text) { super(text); } public MyMenuNodeInfo(String text, String image) { super(text, image); } public void reactOnSelect() { outputMessage("S", "Menu Item \"" + getText() + "\" selected!"); } } /** class represents one row within the text grid. */ public class Line { String m_name; CTimeStamp m_htmlChange; CTimeStamp m_xmlChange; public Line(String name, CTimeStamp xmlChange, CTimeStamp htmlChange) { m_name = name; m_xmlChange = xmlChange; m_htmlChange = htmlChange; } public String getName() { return m_name; } public CTimeStamp getHtmlChange() { return m_htmlChange; } public CTimeStamp getXmlChange() { return m_xmlChange; } /** This method will be called if the line will be clicked with * the right mouse button.*/ public void reactOnContextMenuRequest() { // prepare the appropriate popu menu content TREECollection menu = new TREECollection(); menu.addTopNode(new MyMenuNodeInfo( "Open in Layout Painter", "../HTMLBasedGUI/images/open.gif"),true); menu.addTopNode(new MyMenuNodeInfo( "Generate Adapter Code", "../HTMLBasedGUI/images/java.gif"),true); menu.addTopNode(new MyMenuNodeInfo( "Maintain Literals", "../HTMLBasedGUI/images/literals.gif"),true); menu.addTopNode(new MyMenuNodeInfo( "&SEPARATOR"),true); menu.addTopNode(new MyMenuNodeInfo( "Remove (XML & HTML)", "../HTMLBasedGUI/images/remove.gif"),true); // open the poup menu showPopupMenu(menu); } } ... ... ... ... ... }
Pay attention: the showPopupMenu()
method is
provided by the class Adapter
- in the implementation
example, it is directly accessed from the class Line
.
The class Line
is an inner class and consequently has
full access to all the methods of its surrounding class.
The implementation of a context menu in the tree is absolutely the same
as with a text grid - this time you have to implement the
reactOnContextMenuRequest()
method inside the class
representing one tree node.