RFC Name : ... |
Editor(s): ... |
About this document
This is an official Request for Comment (RFC) for adding tooltip and context menu functionality to the Cytoscape 2.3 renderer.
For details on RFCs in general, check out the [http://www.answers.com/main/ntquery?method=4&dsid=2222&dekey=Request+for+Comments&gwp=8&curtab=2222_1&linktext=Request%20for%20Comments Wikipedia Entry: Request for Comments (RFCs)]
Status
revised 19 May 2006 (Allan Kuchinsky)
How to Comment
To view/add comments, click on any of 'Comment' links below. By adding your ideas to the Wiki directly, we can more easily organize everyone's ideas, and keep clear records. Be sure to include today's date and your name for each comment. Here is an example to get things started: ["/Comment"].
Try to keep your comments as concrete and constructive as possible. For example, if you find a part of the RFC makes no sense, please say so, but don't stop there. Take the extra step and propose alternatives.
Proposal
Context Menus
Cytoscape 2.3 will feature a redesigned scheme for context menus which are designed to work with the new renderer.
The scheme is based upon two new interfaces called NodeContextMenuListener and EdgeContextMenuListener, each of which has one method for adding menu items to a context menu:
void addNodeContextMenuItems (NodeView nodeView, JPopupMenu menu); void addEdgeContextMenuItems (EdgeView edgeView, JPopupMenu menu);
The CyNetwork interface defines methods for adding node and edge context listeners, so when you have a class that implements these interfaces, you add objects of that class to the current network view, e.g.
Cytoscape.getCurrentNetworkView().addNodeContextMenuListener(this); Cytoscape.getCurrentNetworkView().addNodeContextMenuListener(this);
The routines for building the context menus are in the InnerCanvas class. Basic idea is that the InnerCanvas instantiates the popup menu, then, depending upon whether a NodeView or EdgeView is the object right-clicked upon, calls the addNodeContextMenuItems() method on each NodeContextMenuListener or the addEdgeContextMenuItems() method on each EdgeContextMenuListener , then shows the menu.
Each NodeContextMenuListener and EdgeContextMenuListener can add JMenuItems, separators, basically do whatever it wants with the JPopupMenu that is passed in to it, all of this using the conventional swing methods for building up menu items. Under the current scheme, each NodeContextMenuListener is responsible for checking whether the JMenuItem already exists on the menu and doing other sanity checks. I am considering whether some global management of the JPopupMenu should be done in the InnerCanvas routine that instantiates and shows the menu, but I'm not sure if that makes sense.
I think this is a more direct and simpler scheme than what has been done for context menus under Cytoscape 2.2.
Tooltips
It appears possible to add tooltip functionality to the renderer without requiring any changes to plugins and other code that uses tooltips.
The renderer's InnerCanvas class is a JComponent, thus one can setToolTipText() on it. I modified the DNodeView class -- not a JComponent -- to maintain an instance variable that is set whenever a call to setToolTip() is made, e.g. when the literature search calls NodeView.setToolTip(). Then, when the mouse hovers over a node on the canvas, the canvas does a call to DNodeView.getToolTip() for that node, then does a setToolTipText() on itself using the text retrieved from the DNodeView.
Biological Questions / Use Cases
General Notes
For testing purposes, an experimental version of the renderer's view package, ding.view, can be obtained in the attachment attachment:ding.jar Place this ding.jar file in the cytoscape/lib directory and rebuild cytoscape.
An experimental version of the CytoscapeEditor, which contains context menu items and has been updated to drag and drop Nodes and Edges to the ding InnerCanvas, can be obtained in the attachment attachment:CytoscapeEditor.jar Place the CytoscapeEditor.jar file in the cytoscape/plugins/core directory.
Requirements
Deferred Items
Open Issues
Are we supposed to use the m_spacial index in DGraphView to figure out which node(s) have been clicked on? Is that the right approach?
How do we figure out what edges have been clicked on?
What's with all of the bitwise complements? Why are these necessary?
What is the reason for the star shaped polygon requirement?
Backward Compatibility
Expected growth and plan for growth
References
Implementation Plan
- ["/Implementation Plan"]