Tree Node Tool Tips

Can you have tooltips on a tree node that are node specific?
Version 10.1.2.3
Thanks
Edited by: ngac_uk on 02-Oct-2012 07:54

No, not with the standard tree.

Similar Messages

  • How to set Tool Tip Text to Tree Node?

    Hi,
    How to set Tool Tip Text to Tree Node in JTree?
    Pls somebody help me to solve it.

    bsampeieri,
    Been here a long time myself. I don't agree with the one post is enough per se. That is to say, sometimes, it helps to post in several groups so that more eyes may see it. A number of forum posters linger in specific forum topics and may not see the post in another forum.
    Now, if in the previous post you/others answered the question and then the OP posted here later, I could see the complaint.
    For the OP, the better way to cross-post is to have one "main" post, then have all the other posts refer back to that one (link to it) so that people aren't duplicating the effort to answer your question(s). A simple "I have cross-posted this to get more eyes on it. Please reply to this question at this post <link here>"

  • Create a dynamic tool tip

    Hi All,
    I am working in an application where I am using the treeview widget. My requirement is to add a dynamic tool tip to the tree nodes. I read in a forum that I have to look into IID_ITIP. But I am still not clear as to how will I create a tool tip and associate the same to the node widget in the treeview. Any help or clues would be appreciated.
    Thanks in Advance
    JRS.

    Hi All,
    I am still not be to get this done. Could anyone guide me or refer some sample code existing?
    Thanks,
    JRS.

  • Determine if mouse is over tree node

    hi.
    I recently added some code from this forum on
    highlighting a node when the mouse is over it.
    I am taking this futher and setting a Border around the nodehowever it draws a border around every node.
    I want to only draw the border when the mouse is over the node.
    the example i got does this to set the foreground
    ((JLabel)result).setForeground(Color.red);
    i do this to set the border
    ((JLabel)result).setBorder
    (BorderFactory.createLineBorder(Color.black));
    i ve tried getting the positions of both the mouse and the jlabel but am having trouble determining if the position of the mouse is within the position of the node in the tree.
    Ive used methods like the contains method but it doesnt work for me . can anyone give me a hint as to how to see if the points of the mouse are on the Jlabel?

    This is very close to your solution. Last month, I implement ToolTip Text on every Tree Node so when Mouse goes on to the Node, It shows the Tool Tip Text. Have a look at this code and try to change it accordingly.
    This code is in the Constructor in your class.
    tree.setCellRenderer(new IDETreeCellRenderer());
    tree.setToolTipText("");Class: IDETreeCellRenderer - Cell Renderer for the Tree
    package tv.izone.ide.tree;
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    import tv.izone.core.*;
    import tv.izone.ide.guiutilities.*;
    import tv.izone.izml.data.*;
    public class IDETreeCellRenderer
        extends DefaultTreeCellRenderer {
       DefaultTreeCellRenderer label;
        * Override TreeCellRendererComponent, used for changing Tree Node for comments.
        * @param tree Tree to be used
        * @param value Value of the Node
        * @param selected true, if selected
        * @param expanded true, if expanded
        * @param leaf true, if it is a leaf
        * @param row Row Number
        * @param hasFocus True, if has Focus
        * @return Component, Tree
       public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
                                      boolean leaf, int row, boolean hasFocus) {
          try {
          label = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row,
                                                      hasFocus);
          label.setToolTipText(dataObject.getToolTipText());
    // Instead of setToolTipText(), try setBackgroundColor() or setBorder()
         return label;
          } catch (Exception ex) {
          // NullPointerException, usually comes at the start of the Application
          // when the Tree is empty.
          return this;
    }Hope this Helps
    Regards
    Raheel

  • ToolTip for tree node

    I am using DefaultMutableTreeNode object as tree node
    But for this object there is no method for setting tToolTipText
    So anybody know that how to set tool tip for tree node

    You're going to want to look at the cell renderer. That secretly returns a jlabel.
    The JLabel can have a tooltip set for it.

  • Context menu for tree node cannot be accessed in IE 8 (Jdev 11.1.2)

    We use an af:tree with context menus for performing operations on each node. In IE 8 when you hover over a node before right clicking, "tooltip" text appears which basically just re-displays the text of the node. Even though the tooltip text is annoying, the context menu worked fine in 11.1.1.4, but now in 11.1.2 when you right-click on that tooltip text you get the "normal" browser context menu for text -- we no longer get our custom context menu.
    You can see this same problem on the tree in the rich faces demo: http://jdevadf.oracle.com/adf-richclient-demo/
    Sometimes, if you're quick enough, you can get the custom context menu to work, but it seems that once you've hovered long enough over one node to get the standard context menu, you're stuck and any node you click on will display the browser's normal context menu.
    This is a big problem for us because we rely on these context menus and most of our administrative users are on IE 8. Is there a workaround or can the tooltip text somehow be shut off? It doesn't appear in Firefox so Firefox works fine.
    Thanks.
    -Ed

    Hi,
    if this works on IE 7 you can force the app to run in IE7 compatibility mode
    See "Run ADF Faces applications with IE 9 in IE 8 compatibility mode" http://www.oracle.com/technetwork/developer-tools/adf/learnmore/april2011-otn-harvest-367335.pdf
    Works the same for IE8 to IE7. This then gives you a solution for until the issue is solved
    Btw.: If users click onto the folder icon (not the text, which brings up the tool tip) then the context menu work. I'll file a bug anyway
    Frank

  • Read Selected Tree Node value.  Jdeveloper Jdeveloper 11.1.2.1.0 11.1.2.1.0

    Version: Jdeveloper 11.1.2.1.0
    how to get programmatically tree node value.
    i have tried but cann't read value from selected node.
    please help me.
    here is my application creation steps:
    1. New Application
    2. Fusion Web Application (ADF) Template
    3. Create View Object VOTreeMst
    Query:
         Select Department_Name,Department_Id
         From Departments
    4. Create View Object VOTreeChd
    Query:
         Select Last_Name,Employee_Id,Department_Id
         From Employees
    5. Create View Link VLTreeMstChd
         VOTreeMst.DepartmentId=VOTreeChd.DepartmentId
         And Add to Application Module
    6. Create page page1 in ViewController
         New-->Web Tier-->JSF/Facelets-->Page
         Selected Document Type JSP XML
    7. Drag VOTreeMst1 From Data Controls into page1
    and select Tree-->ADF Tree
    8. ADD java Code into selection Listener
    public void nodeSelect(SelectionEvent selectionEvent) {
    //original selection listener set by ADF
    String adfSelectionListener = "#{bindings.VOTreeMst1.treeModel.makeCurrent}";
    //make sure the default selection listener functionality is preserved.
    //you don't need to do this for multi select trees as the ADF binding
    //only supports single current row selection
    /* START PRESERVER DEFAULT ADF SELECT BEHAVIOR */
    FacesContext fctx = FacesContext.getCurrentInstance();
    Application application = fctx.getApplication();
    ELContext elCtx = fctx.getELContext();
    ExpressionFactory exprFactory = application.getExpressionFactory();
    MethodExpression me = null;
    me = exprFactory.createMethodExpression(elCtx, adfSelectionListener, Object.class,
    new Class[] { SelectionEvent.class });
    me.invoke(elCtx, new Object[] { selectionEvent });
    /* END PRESERVER DEFAULT ADF SELECT BEHAVIOR */
    RichTree tree = (RichTree)selectionEvent.getSource();
    TreeModel model = (TreeModel)tree.getValue();
    //get selected nodes
    RowKeySet rowKeySet = selectionEvent.getAddedSet();
    Iterator rksIterator = rowKeySet.iterator();
    //for single select configurations, thi sonly is called once
    while (rksIterator.hasNext()) {
    List key = (List)rksIterator.next();
    JUCtrlHierBinding treeBinding = null;
    CollectionModel collectionModel = (CollectionModel)tree.getValue();
    treeBinding = (JUCtrlHierBinding)collectionModel.getWrappedData();
    JUCtrlHierNodeBinding nodeBinding = treeBinding.findNodeByKeyPath(key);
    Row rw = nodeBinding.getRow();
    //print first row attribute. Note that in a tree you have to determine the node
    //type if you want to select node attributes by name and not index
    String rowType = rw.getStructureDef().getDefName();
    if(rowType.equalsIgnoreCase("VOTreeMst")){
    System.out.println("This row is a department: " + rw.getAttribute("DepartmentId"));
    else if(rowType.equalsIgnoreCase("VOTreeChd")){
    System.out.println("This row is an employee: " + rw.getAttribute("EmployeeId"));
    else{
    System.out.println("Huh ????");
    // ... do more usefuls stuff here
    9. when i click on first node it is working but i click on second node it is not working
    error message::
    <LifecycleImpl> <_handleException> ADF_FACES-60098:Faces lifecycle receives unhandled exceptions in phase INVOKE_APPLICATION 5
    javax.el.ELException: java.lang.NullPointerException
         at com.sun.el.parser.AstValue.invoke(Unknown Source)
         at com.sun.el.MethodExpressionImpl.invoke(Unknown Source)
         at org.apache.myfaces.trinidad.component.UIXComponentBase.broadcastToMethodExpression(UIXComponentBase.java:1589)
         at org.apache.myfaces.trinidad.component.UIXTree.broadcast(UIXTree.java:237)
    <RegistrationConfigurator> <handleError> ADF_FACES-60096:Server Exception during PPR, #1
    javax.el.ELException: java.lang.NullPointerException
    I have also tried using following code but same problem
    public void onTreeSelect(SelectionEvent selectionEvent) {
    //original selection listener set by ADF
    String adfSelectionListener = "#{bindings.VOTreeMst1.treeModel.makeCurrent}";
    //make sure the default selection listener functionality is preserved.
    //you don't need to do this for multi select trees as the ADF binding
    //only supports single current row selection
    /* START PRESERVER DEFAULT ADF SELECT BEHAVIOR */
    FacesContext fctx = FacesContext.getCurrentInstance();
    Application application = fctx.getApplication();
    ELContext elCtx = fctx.getELContext();
    ExpressionFactory exprFactory = application.getExpressionFactory();
    MethodExpression me = null;
    me = exprFactory.createMethodExpression(elCtx, adfSelectionListener, Object.class,
    new Class[] { SelectionEvent.class });
    me.invoke(elCtx, new Object[] { selectionEvent });
    /* END PRESERVER DEFAULT ADF SELECT BEHAVIOR */
    RichTree tree = (RichTree)selectionEvent.getSource();
    TreeModel model = (TreeModel)tree.getValue();
    //get selected nodes
    RowKeySet rowKeySet = selectionEvent.getAddedSet();
    Iterator rksIterator = rowKeySet.iterator();
    //for single select configurations, thi sonly is called once
    while (rksIterator.hasNext()) {
    List key = (List)rksIterator.next();
    JUCtrlHierBinding treeBinding = null;
    treeBinding = (JUCtrlHierBinding)((CollectionModel)tree.getValue()).getWrappedData();
    JUCtrlHierNodeBinding nodeBinding = treeBinding.findNodeByKeyPath(key);
    Row rw = nodeBinding.getRow();
    //print first row attribute. Note that in a tree you have to determine the node
    //type if you want to select node attributes by name and not index
    System.out.println("row: " + rw.getAttribute(0));
    But
    If i create .jspx page From
    Web Tier->Jsp->page Then it is working fine
    when i create .jspx page From
    Web Tier->JSF\Facelets->page Then it is not working
    i need to get value from "Web Tier->JSF\Facelets->page"
    is there any help please?

    You should try Franks generic selectionListener http://www.oracle.com/technetwork/developer-tools/adf/learnmore/25-generic-tree-selection-listener-169164.pdf. For help on hoe to get the selected tree node data check http://www.oracle.com/technetwork/developer-tools/adf/learnmore/26-get-selected-tree-node-data-169165.pdf
    Timo

  • How-to synchronize edit forms for a single View Object tree node entrie

    Hi all,
    I created a tree from a single View Object,
    follow this [http://www.oracle.com/technetwork/developer-tools/adf/learnmore/32-tree-table-from-single-vo-169174.pdf]
    then i want to create and synchronize edit forms for tree node entries,
    follow this [http://www.oracle.com/technetwork/developer-tools/adf/learnmore/50-synchromize-form-treeselection-169192.pdf]
    but it not working when i click child node!!
    i found the latter tree from many View Object ,but the former tree from single View Object.
    what should i do?
    Thanks in advance

    Hi,
    say the tree is built from ViewObject1. In the AM model, create a second View Object instance for this. Say ViewObject2. Create the form from ViewObject2 and the tree from ViewObject1. When creating the tree, use the"Target Data Source" option at the bottom to reference the iterator of ViewObject2. Then create a PartialTrigger on the paneFormLayout that holds the synch form. In the partial trigger property, reference the tree so that when the tree selection changes, the form is updated. Then create a PartialTrigger property on the tree and point it to the submit button of the form so you can show updated values in the tree.
    Frank

  • Help with building a JTree using tree node and node renderers

    Hi,
    I am having a few problems with JTree's. basically I want to build JTree from a web spider. The webspide searches a website checking links and stores the current url that is being processed as a string in the variable msg. I wan to use this variable to build a JTree in a new class and then add it to my GUI. I have created a tree node class and a renderer node class, these classes are built fine. can someone point me in the direction for actually using these to build my tree in a seperate class and then displaying it in a GUI class?
    *nodeRenderer.java
    import javax.swing.*;
    import javax.swing.tree.*;
    import java.awt.*;
    import java.net.*;
    public class nodeRenderer extends DefaultTreeCellRenderer
                                       implements TreeCellRenderer
    public static Icon icon= null;
    public nodeRenderer() {
    icon = new ImageIcon(getClass().getResource("icon.gif"));
    public Component getTreeCellRendererComponent(
    JTree tree,
    Object value,
    boolean sel,
    boolean expanded,
    boolean leaf,
    int row,
    boolean hasFocus) {
    super.getTreeCellRendererComponent(
    tree, value, sel,
    expanded, leaf, row,
    hasFocus);
    treeNode node = (treeNode)(((DefaultMutableTreeNode)value).getUserObject());
    if(icon != null) // set a custom icon
    setOpenIcon(icon);
    setClosedIcon(icon);
    setLeafIcon(icon);
         return this;
    *treeNode.java
    *this is the class to represent a node
    import javax.swing.*;
    import javax.swing.tree.*;
    import java.util.*;
    import java.net.*;
    * Class used to hold information about a web site that has
    * been searched by the spider class
    public class treeNode
    *Url from the WebSpiderController Class
    *that is currently being processed
    public String msg;
    treeNode(String urlText)
         msg = urlText;
    String getUrlText()
         return msg;
    //gui.java
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    import java.net.*;
    import java.io.*;
    import java.util.*;
    public class gui extends JFrame implements Runnable
         *declare variable, boolean
         *thread, a object and a center
         *pane
         protected URL urlInput;
         protected Thread bgThread;
         protected boolean run = false;
         protected WebSpider webSpider;
         public gui()
              *create the gui here
              setTitle("Testing Tool");
         setSize(600,600);
         //add Buttons to the tool bar
         start.setText("Start");
         start.setActionCommand("Start");
         toolBar.add(start);
         ButtonListener startListener = new ButtonListener();
              start.addActionListener(startListener);
              cancel.setText("Cancel");
         cancel.setActionCommand("Cancel");
         toolBar.add(cancel);
         ButtonListener cancelListener = new ButtonListener();
              cancel.addActionListener(cancelListener);
              close.setText("Close");
         close.setActionCommand("Close");
         toolBar.add(close);
         ButtonListener closeListener = new ButtonListener();
              close.addActionListener(closeListener);
              //creat a simple form
              urlLabel.setText("Enter URL:");
              urlLabel.setBounds(100,36,288,24);
              formTab.add(urlLabel);
              url.setBounds(170,36,288,24);
              formTab.add(url);
              current.setText("Currently Processing: ");
              current.setBounds(100,80,288,24);
              formTab.add(current);
         //add scroll bars to the error messages screen and website structure
         errorPane.setAutoscrolls(true);
         errorPane.setHorizontalScrollBarPolicy(javax.swing.
         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
         errorPane.setVerticalScrollBarPolicy(javax.swing.
         ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
         errorPane.setOpaque(true);
         errorTab.add(errorPane);
         errorPane.setBounds(0,0,580,490);
         errorText.setEditable(false);
         errorPane.getViewport().add(errorText);
         errorText.setBounds(0,0,600,550);
         treePane.setAutoscrolls(true);
         treePane.setHorizontalScrollBarPolicy(javax.swing.
         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
         treePane.setVerticalScrollBarPolicy(javax.swing.
         ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
         treePane.setOpaque(true);
         treeTab.add(treePane);
         treePane.setBounds(0,0,580,490);
         treeText.setEditable(false);
         treePane.getViewport().add(treeText);
         treeText.setBounds(0,0,600,550);
         //create the tabbed window           
    centerPane.setBorder(new javax.swing.border.EtchedBorder());
    formTab.setLayout(null);
    errorTab.setLayout(null);
    treeTab.setLayout(null);
    centerPane.addTab("Search Parameters", formTab);
    centerPane.addTab("Error Messages", errorTab);
    centerPane.addTab("Website Structure", treeTab);
              //add the tool bar and tabbed pane
              getContentPane().add(toolBar, java.awt.BorderLayout.NORTH);
    getContentPane().add(centerPane, java.awt.BorderLayout.CENTER);                    
              *create the tool bar pane, a center pane, add the buttons,
              *labels, tabs, a text field for user input here
              javax.swing.JPanel toolBar = new javax.swing.JPanel();
              javax.swing.JButton start = new javax.swing.JButton();
              javax.swing.JButton cancel = new javax.swing.JButton();
              javax.swing.JButton close = new javax.swing.JButton();      
              javax.swing.JTabbedPane centerPane = new javax.swing.JTabbedPane();
              javax.swing.JPanel formTab = new javax.swing.JPanel();
              javax.swing.JLabel urlLabel = new javax.swing.JLabel();
              javax.swing.JLabel current = new javax.swing.JLabel();
              javax.swing.JTextField url = new javax.swing.JTextField();
              javax.swing.JPanel errorTab = new javax.swing.JPanel();
              javax.swing.JTextArea errorText = new javax.swing.JTextArea();
              javax.swing.JScrollPane errorPane = new javax.swing.JScrollPane();
              javax.swing.JPanel treeTab = new javax.swing.JPanel();
              javax.swing.JTextArea treeText = new javax.swing.JTextArea();
              javax.swing.JScrollPane treePane = new javax.swing.JScrollPane();
              javax.swing.JTree searchTree = new javax.swing.JTree();
              *show the gui
              public static void main(String args[])
              (new gui()).setVisible(true);
         *listen for the button presses and set the
         *boolean flag depending on which button is pressed
         class ButtonListener implements ActionListener
              public void actionPerformed(ActionEvent event)
                   Object object = event.getSource();
                   if (object == start)
                        run = true;
                        startActionPerformed(event);
                   if (object == cancel)
                        run = false;
                        startActionPerformed(event);
                   if (object == close)
                        System.exit(0);
         *this method is called when the start or
         *cancel button is pressed.
         void startActionPerformed (ActionEvent event)
              if (run == true && bgThread == null)
                   bgThread = new Thread(this);
                   bgThread.start();
              if (run == false && bgThread != null)
                   webSpider.cancel();
         *this mehtod will start the background thred.
         *the background thread is required so that the
         *GUI is still displayed
         public void run()
              try
                   webSpider = new WebSpider(this);
                   webSpider.clear();
                   urlInput = new URL(url.getText());
                   webSpider.addURL(urlInput);
                   webSpider.run();
                   bgThread=null;
              catch (MalformedURLException e)
                   addressError addErr = new addressError();
                   addErr.addMsg = "URL ERROR - PLEASE CHECK";
                   SwingUtilities.invokeLater(addErr);
              *this method is called by the web spider
              *once a url is found. Validation of navigation
              *happens here.
              public boolean urlFound(URL urlInput,URL url)
                   CurrentlyProcessing pro = new CurrentlyProcessing();
              pro.msg = url.toString();
              SwingUtilities.invokeLater(pro);
              if (!testLink(url))
                        navigationError navErr = new navigationError();
                        navErr.navMsg = "Broken Link "+url+" caused on "+urlInput+"\n";
                        return false;
              if (!url.getHost().equalsIgnoreCase(urlInput.getHost()))
                   return false;
              else
                   return true;
              *this method is called internally to check
         *that a link works
              protected boolean testLink(URL url)
              try
                   URLConnection connection = url.openConnection();
                   connection.connect();
                   return true;
              catch (IOException e)
                   return false;
         *this method is called when an error is
         *found.
              public void URLError(URL url)
              *this method is called when an email
              *address is found
              public void emailFound(String email)
              /*this method will update any errors found inc
              *address errors and broken links
              class addressError implements Runnable
                   public String addMsg;
                   public void run()
                        errorText.append(addMsg);
                        current.setText("Currently Processing: "+ addMsg);
              class navigationError implements Runnable
                   public String navMsg;
                   public void run()
                        errorText.append(navMsg);
              *this method will update the currently
              *processing field on the GUI
              class CurrentlyProcessing implements Runnable
              public String msg;
              public void run()
                   current.setText("Currently Processing: " + msg );
    //webspider.java
    import java.util.*;
    import java.net.*;
    import java.io.*;
    import javax.swing.text.*;
    import javax.swing.text.html.*;
    import javax.swing.tree.*;
    import javax.swing.*;
    *this class implements the spider.
    public class WebSpider extends HTMLEditorKit
         *make a collection of the URL's
         protected Collection urlErrors = new ArrayList(3);
         protected Collection urlsWaiting = new ArrayList(3);
         protected Collection urlsProcessed = new ArrayList(3);
         //report URL's to this class
         protected gui report;
         *this flag will indicate whether the process
         *is to be cancelled
         protected boolean cancel = false;
         *The constructor
         *report the urls to the wui class
         public WebSpider(gui report)
         this.report = report;
         *get the urls from the above declared
         *collections
         public Collection getUrlErrors()
         return urlErrors;
         public Collection getUrlsWaiting()
         return urlsWaiting;
         public Collection getUrlsProcessed()
         return urlsProcessed;
         * Clear all of the collections.
         public void clear()
         getUrlErrors().clear();
         getUrlsWaiting().clear();
         getUrlsProcessed().clear();
         *Set a flag that will cause the begin
         *method to return before it is done.
         public void cancel()
         cancel = true;
         *add the entered url for porcessing
         public void addURL(URL url)
         if (getUrlsWaiting().contains(url))
              return;
         if (getUrlErrors().contains(url))
              return;
         if (getUrlsProcessed().contains(url))
              return;
         /*WRITE TO LOG FILE*/
         log("Adding to workload: " + url );
         getUrlsWaiting().add(url);
         *process a url
         public void processURL(URL url)
         try
              /*WRITE TO LOGFILE*/
              log("Processing: " + url );
              // get the URL's contents
              URLConnection connection = url.openConnection();
              if ((connection.getContentType()!=null) &&
         !connection.getContentType().toLowerCase().startsWith("text/"))
              getUrlsWaiting().remove(url);
              getUrlsProcessed().add(url);
              log("Not processing because content type is: " +
         connection.getContentType() );
                   return;
         // read the URL
         InputStream is = connection.getInputStream();
         Reader r = new InputStreamReader(is);
         // parse the URL
         HTMLEditorKit.Parser parse = new HTMLParse().getParser();
         parse.parse(r,new Parser(url),true);
    catch (IOException e)
         getUrlsWaiting().remove(url);
         getUrlErrors().add(url);
         log("Error: " + url );
         report.URLError(url);
         return;
    // mark URL as complete
    getUrlsWaiting().remove(url);
    getUrlsProcessed().add(url);
    log("Complete: " + url );
    *start the spider
    public void run()
    cancel = false;
    while (!getUrlsWaiting().isEmpty() && !cancel)
         Object list[] = getUrlsWaiting().toArray();
         for (int i=0;(i<list.length)&&!cancel;i++)
         processURL((URL)list);
    * A HTML parser callback used by this class to detect links
    protected class Parser extends HTMLEditorKit.ParserCallback
    protected URL urlInput;
    public Parser(URL urlInput)
    this.urlInput = urlInput;
    public void handleSimpleTag(HTML.Tag t,MutableAttributeSet a,int pos)
    String href = (String)a.getAttribute(HTML.Attribute.HREF);
    if((href==null) && (t==HTML.Tag.FRAME))
    href = (String)a.getAttribute(HTML.Attribute.SRC);
    if (href==null)
    return;
    int i = href.indexOf('#');
    if (i!=-1)
    href = href.substring(0,i);
    if (href.toLowerCase().startsWith("mailto:"))
    report.emailFound(href);
    return;
    handleLink(urlInput,href);
    public void handleStartTag(HTML.Tag t,MutableAttributeSet a,int pos)
    handleSimpleTag(t,a,pos); // handle the same way
    protected void handleLink(URL urlInput,String str)
    try
         URL url = new URL(urlInput,str);
    if (report.urlFound(urlInput,url))
    addURL(url);
    catch (MalformedURLException e)
    log("Found malformed URL: " + str);
    *log the information of the spider
    public void log(String entry)
    System.out.println( (new Date()) + ":" + entry );
    I have a seperate class for parseing the HTML. Any help would be greatly appreciated
    mrv

    Hi Sorry to be a pain again,
    I have re worked the gui class so it looks like this now:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    import javax.swing.event.*;
    import java.net.*;
    import java.io.*;
    import java.util.*;
    public class gui extends JFrame implements Runnable
         *declare variable, boolean
         *thread, a object and a center
         *pane
         protected URL urlInput;
         protected Thread bgThread;
         protected boolean run = false;
         protected WebSpider webSpider;
         public String msgInfo;
         public String brokenUrl;
         public String goodUrl;
         public String deadUrl;
         protected DefaultMutableTreeNode rootNode;
    protected DefaultTreeModel treeModel;
         public gui()
              *create the gui here
              setTitle("Testing Tool");
         setSize(600,600);
         //add Buttons to the tool bar
         start.setText("Start");
         start.setActionCommand("Start");
         toolBar.add(start);
         ButtonListener startListener = new ButtonListener();
              start.addActionListener(startListener);
              cancel.setText("Cancel");
         cancel.setActionCommand("Cancel");
         toolBar.add(cancel);
         ButtonListener cancelListener = new ButtonListener();
              cancel.addActionListener(cancelListener);
              close.setText("Close");
         close.setActionCommand("Close");
         toolBar.add(close);
         ButtonListener closeListener = new ButtonListener();
              close.addActionListener(closeListener);
              //creat a simple form
              urlLabel.setText("Enter URL:");
              urlLabel.setBounds(100,36,288,24);
              formTab.add(urlLabel);
              url.setBounds(170,36,288,24);
              formTab.add(url);
              current.setText("Currently Processing: ");
              current.setBounds(100,80,288,24);
              formTab.add(current);
         //add scroll bars to the error messages screen and website structure
         errorPane.setAutoscrolls(true);
         errorPane.setHorizontalScrollBarPolicy(javax.swing.
         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
         errorPane.setVerticalScrollBarPolicy(javax.swing.
         ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
         errorPane.setOpaque(true);
         errorTab.add(errorPane);
         errorPane.setBounds(0,0,580,490);
         errorText.setEditable(false);
         errorPane.getViewport().add(errorText);
         errorText.setBounds(0,0,600,550);
         treePane.setAutoscrolls(true);
         treePane.setHorizontalScrollBarPolicy(javax.swing.
         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
         treePane.setVerticalScrollBarPolicy(javax.swing.
         ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
         treePane.setOpaque(true);
         treeTab.add(treePane);
         treePane.setBounds(0,0,580,490);
         treeText.setEditable(false);
         treePane.getViewport().add(treeText);
         treeText.setBounds(0,0,600,550);
         //JTree
         // NEW CODE
         rootNode = new DefaultMutableTreeNode("Root Node");
         treeModel = new DefaultTreeModel(rootNode);
         treeModel.addTreeModelListener(new MyTreeModelListener());
         tree = new JTree(treeModel);
         tree.setEditable(true);
         tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.setShowsRootHandles(true);
         treeText.add(tree);
         //create the tabbed window           
    centerPane.setBorder(new javax.swing.border.EtchedBorder());
    formTab.setLayout(null);
    errorTab.setLayout(null);
    treeTab.setLayout(null);
    centerPane.addTab("Search Parameters", formTab);
    centerPane.addTab("Error Messages", errorTab);
    centerPane.addTab("Website Structure", treeTab);
              //add the tool bar and tabbed pane
              getContentPane().add(toolBar, java.awt.BorderLayout.NORTH);
    getContentPane().add(centerPane, java.awt.BorderLayout.CENTER);     
              *create the tool bar pane, a center pane, add the buttons,
              *labels, tabs, a text field for user input here
              javax.swing.JPanel toolBar = new javax.swing.JPanel();
              javax.swing.JButton start = new javax.swing.JButton();
              javax.swing.JButton cancel = new javax.swing.JButton();
              javax.swing.JButton close = new javax.swing.JButton();      
              javax.swing.JTabbedPane centerPane = new javax.swing.JTabbedPane();
              javax.swing.JPanel formTab = new javax.swing.JPanel();
              javax.swing.JLabel urlLabel = new javax.swing.JLabel();
              javax.swing.JLabel current = new javax.swing.JLabel();
              javax.swing.JTextField url = new javax.swing.JTextField();
              javax.swing.JPanel errorTab = new javax.swing.JPanel();
              javax.swing.JTextArea errorText = new javax.swing.JTextArea();
              javax.swing.JScrollPane errorPane = new javax.swing.JScrollPane();
              javax.swing.JPanel treeTab = new javax.swing.JPanel();
              javax.swing.JTextArea treeText = new javax.swing.JTextArea();
              javax.swing.JScrollPane treePane = new javax.swing.JScrollPane();
              javax.swing.JTree tree = new javax.swing.JTree();
              *show the gui
              public static void main(String args[])
              (new gui()).setVisible(true);
         *listen for the button presses and set the
         *boolean flag depending on which button is pressed
         class ButtonListener implements ActionListener
              public void actionPerformed(ActionEvent event)
                   Object object = event.getSource();
                   if (object == start)
                        run = true;
                        startActionPerformed(event);
                   if (object == cancel)
                        run = false;
                        startActionPerformed(event);
                   if (object == close)
                        System.exit(0);
         *this method is called when the start or
         *cancel button is pressed.
         void startActionPerformed (ActionEvent event)
              if (run == true && bgThread == null)
                   bgThread = new Thread(this);
                   bgThread.start();
                   //new line of code
                   treeText.addObject(msgInfo);
              if (run == false && bgThread != null)
                   webSpider.cancel();
         *this mehtod will start the background thred.
         *the background thread is required so that the
         *GUI is still displayed
         public void run()
              try
                   webSpider = new WebSpider(this);
                   webSpider.clear();
                   urlInput = new URL(url.getText());
                   webSpider.addURL(urlInput);
                   webSpider.run();
                   bgThread = null;
              catch (MalformedURLException e)
                   addressError addErr = new addressError();
                   addErr.addMsg = "URL ERROR - PLEASE CHECK";
                   SwingUtilities.invokeLater(addErr);
              *this method is called by the web spider
              *once a url is found. Validation of navigation
              *happens here.
              public boolean urlFound(URL urlInput,URL url)
                   CurrentlyProcessing pro = new CurrentlyProcessing();
              pro.msg = url.toString();
              SwingUtilities.invokeLater(pro);
              if (!testLink(url))
                        navigationError navErr = new navigationError();
                        navErr.navMsg = "Broken Link "+url+" caused on "+urlInput+"\n";
                        brokenUrl = url.toString();
                        return false;
              if (!url.getHost().equalsIgnoreCase(urlInput.getHost()))
                   return false;
              else
                   return true;
              *this method is returned if there is no link
              *on a web page, e.g. there us a dead end
              public void urlNotFound(URL urlInput)
                        deadEnd dEnd = new deadEnd();
                        dEnd.dEMsg = "No links on "+urlInput+"\n";
                        deadUrl = urlInput.toString();               
              *this method is called internally to check
         *that a link works
              protected boolean testLink(URL url)
              try
                   URLConnection connection = url.openConnection();
                   connection.connect();
                   goodUrl = url.toString();
                   return true;
              catch (IOException e)
                   return false;
         *this method is called when an error is
         *found.
              public void urlError(URL url)
              *this method is called when an email
              *address is found
              public void emailFound(String email)
              /*this method will update any errors found inc
              *address errors and broken links
              class addressError implements Runnable
                   public String addMsg;
                   public void run()
                        current.setText("Currently Processing: "+ addMsg);
                        errorText.append(addMsg);
              class navigationError implements Runnable
                   public String navMsg;
                   public void run()
                        errorText.append(navMsg);
              class deadEnd implements Runnable
                   public String dEMsg;
                   public void run()
                        errorText.append(dEMsg);
              *this method will update the currently
              *processing field on the GUI
              public class CurrentlyProcessing implements Runnable
                   public String msg;
              //new line
              public String msgInfo = msg;
              public void run()
                   current.setText("Currently Processing: " + msg );
         * NEW CODE
         * NEED THIS CODE SOMEWHERE
         * treeText.addObject(msgInfo);
         public DefaultMutableTreeNode addObject(Object child)
         DefaultMutableTreeNode parentNode = null;
         TreePath parentPath = tree.getSelectionPath();
         if (parentPath == null)
         parentNode = rootNode;
         else
         parentNode = (DefaultMutableTreeNode)
    (parentPath.getLastPathComponent());
         return addObject(parentNode, child, true);
         public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
    Object child)
         return addObject(parent, child, false);
         public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
         Object child,boolean shouldBeVisible)
         DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child);
         if (parent == null)
         parent = rootNode;
         treeModel.insertNodeInto(childNode, parent, parent.getChildCount());
         if (shouldBeVisible)
         tree.scrollPathToVisible(new TreePath(childNode.getPath()));
              return childNode;
         public class MyTreeModelListener implements TreeModelListener
              public void treeNodesChanged (TreeModelEvent e)
                   DefaultMutableTreeNode node;
                   node = (DefaultMutableTreeNode)
                   (e.getTreePath().getLastPathComponent());
                   try
                        int index = e.getChildIndices()[0];
                        node = (DefaultMutableTreeNode)
                        (node.getChildAt(index));
                   catch (NullPointerException exc)
              public void treeNodesInserted(TreeModelEvent e)
              public void treeStructureChanged(TreeModelEvent e)
              public void treeNodesRemoved(TreeModelEvent e)
    I beleive that this line of code is required:
    treeText.addObject(msgInfo);
    I have placed it where the action events start the spider, but i keep getting this error:
    cannot resolve symbol
    symbol : method addObject (java.lang.String)
    location: class javax.swing.JTextArea
    treeText.addObject(msgInfo);
    Also the jtree is not showing the window that I want it to and I am not too sure why. could you have a look to see why? i think it needs a fresh pair of eyes.
    Many thanks
    MrV

  • Dynamic Values in Business Graphics Tool Tip

    hi,
    I am using business graphics ui element in my webdynpro application.I am able to get the graghical output correctly.I want to have tool tip in my graph so when I place the cursor on a point, the tool tip should give the corresponding value.I have used the following code
    try
         String[] catLabels = {
                        "Team 1", "\1Tomoko Akino", "\1Hans Bosch", "\1Marvin Smith",
                        "Team 2", "\1Jose Vega", "\1Bao Yin", "Out of office" };
            String[][] pointCustomizing = {
                        { "approved", "cancelled", "approvedPartTime" },
                        { "approved" },
                        { "approved" },
                        { "sent", "approvedPartTime", "notsentPartTime", "notsent"},
                        { "approved", "zSeveralEntries", "zSeveralEntries",
                          "zSeveralEntries", "zSeveralEntries", "zSeveralEntries",
                          "zSeveralEntries" },
                        { "outOfOffice", "outOfOffice", "outOfOffice", "outOfOffice",
                          "outOfOffice", "outOfOffice", "outOfOffice", "outOfOffice",
                          "outOfOffice", "outOfOffice", "outOfOffice", "outOfOffice",
                          "outOfOffice", "outOfOffice", "outOfOffice" }
            String[][] pointLabels = {
                        { "1", "2", "2", "2", "4", "3", "3", "3", "1", "1", "2", "1",
                          "2", "1", "1" }
            String[][][] timeValues = {
                        { { "20020528", "20020606" }, { "20020606", "20020608" },
                          { "20020610", "20020611" } },
                        { { "20020531", "20020606" } },
                        { { "20020607", "20020613" } },
                        { { "20020527", "20020601" }, { "20020606", "20020607" },
                          { "20020612", "20020613" }, { "20020617", "20020619"} },
                        { { "20020531", "20020606" }, { "20020531", "20020601" },
                          { "20020601", "20020602" }, { "20020602", "20020603" },
                          { "20020603", "20020604" }, { "20020604", "20020605" },
                          { "20020605", "20020606" } },
                        { { "20020527", "20020528" }, { "20020528", "20020529" },
                          { "20020529", "20020530" }, { "20020530", "20020531" },
                          { "20020531", "20020601" }, { "20020603", "20020604" },
                          { "20020604", "20020605" }, { "20020605", "20020606" },
                          { "20020606", "20020607" }, { "20020607", "20020608" },
                          { "20020610", "20020611" }, { "20020611", "20020612" },
                          { "20020612", "20020613" }, { "20020617", "20020618" },
                          { "20020618", "20020619" }}
            String s[]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","a1","a2","a3","a4","a5","a6","a7","a8","a9","a10","a11","a12","a13","a14",};
            IPrivateSBusinessGraphicsSampleView.ICategoryNode catNode = wdContext.nodeCategory();
            for (int catIndex = 0; catIndex < catLabels.length; ++catIndex)
               IPrivateSBusinessGraphicsSampleView.ICategoryElement  catElement = catNode.createCategoryElement();
               catNode.addElement(catElement);
               catElement.setDescription(catLabels[catIndex]);
            // loop over series
            IPrivateSBusinessGraphicsSampleView.ISeriesNode seriesNode = wdContext.nodeSeries();
            for (int seriesIndex = 0; seriesIndex < timeValues.length; ++seriesIndex)
               IPrivateSBusinessGraphicsSampleView.ISeriesElement seriesElement = seriesNode.createSeriesElement();
               seriesNode.addElement(seriesElement);
               // set series attributes (...)
               IPrivateSBusinessGraphicsSampleView.IPointNode pointNode = seriesElement.nodePoint();
               // loop over points
               for (int pointIndex = 0; pointIndex < timeValues[seriesIndex].length; ++pointIndex)
                 IPrivateSBusinessGraphicsSampleView.IPointElement
                           pointElement = pointNode.createPointElement();
                 pointNode.addElement(pointElement); 
                 String ename = s[pointIndex];
                 wdComponentAPI.getMessageManager().reportSuccess("name:"+ename);
                 pointElement.setStartValue(timeValues[seriesIndex][pointIndex][0]);
                 pointElement.setEndValue(timeValues[seriesIndex][pointIndex][1]);
                 pointElement.setCuId(pointCustomizing[seriesIndex][pointIndex]);
                 pointElement.setLabel(pointLabels[seriesIndex][pointIndex]);    
                 pointElement.setToolTip(ename );
         catch(Exception e)
                 wdComponentAPI.getMessageManager().reportSuccess("exc2:"+e);
    By the above code ,I am getting the tool tip with the value "a" in all locations.
    But I need to have different values in the tooltip corresponding to the location.
    Please Help....
    Thanks in advance,
    Shamila

    hi,
    Still  I did not get the dynamic tool tip..........
    In wdDoInit() I have written the following code
    try
         String[] catLabels = { "Team 1", "\1Tomoko Akino", "\1Hans Bosch", "\1Marvin Smith",
                   "Team 2", "\1Jose Vega", "\1Bao Yin", "Out of office" };
            String[][] pointCustomizing = {
                        { "approved", "cancelled", "approvedPartTime" },
                        { "approved" },
                        { "approved" },
                        { "sent", "approvedPartTime", "notsentPartTime", "notsent"},
                        { "approved", "zSeveralEntries", "zSeveralEntries",
                          "zSeveralEntries", "zSeveralEntries", "zSeveralEntries",
                          "zSeveralEntries" },
                        { "outOfOffice", "outOfOffice", "outOfOffice", "outOfOffice",
                          "outOfOffice", "outOfOffice", "outOfOffice", "outOfOffice",
                          "outOfOffice", "outOfOffice", "outOfOffice", "outOfOffice",
                          "outOfOffice", "outOfOffice", "outOfOffice" }  };
                    String[][] pointLabels = {{ " ", " ", " " },{ " " },{ " " },{ " ", " ", " ", " "},{ " ", " ", " ", " ", " ", " ", " " },
                                  { "1", "2", "2", "2", "4", "3", "3", "3", "1", "1", "2", "1", "2", "1", "1" } };
                  String[][][] timeValues = {{        { "20020528", "20020606" },
                          { "20020606", "20020608" },
                          { "20020610", "20020611" } },
                        {  { "20020531", "20020606" } },
                        {   { "20020607", "20020613" }  },
                        {   { "20020527", "20020601" },
                          { "20020606", "20020607" },
                          { "20020612", "20020613" },
                          { "20020617", "20020619"} },
                        { { "20020531", "20020606" }, { "20020531", "20020601" },
                          { "20020601", "20020602" }, { "20020602", "20020603" },
                          { "20020603", "20020604" }, { "20020604", "20020605" },
                          { "20020605", "20020606" } },
                        { { "20020527", "20020528" }, { "20020528", "20020529" },
                          { "20020529", "20020530" }, { "20020530", "20020531" },
                          { "20020531", "20020601" }, { "20020603", "20020604" },
                          { "20020604", "20020605" }, { "20020605", "20020606" },
                          { "20020606", "20020607" }, { "20020607", "20020608" },
                          { "20020610", "20020611" }, { "20020611", "20020612" },
                          { "20020612", "20020613" }, { "20020617", "20020618" },
                          { "20020618", "20020619" }}  };
            String s[]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","a1","a2","a3","a4","a5","a6","a7","a8","a9","a10","a11","a12","a13","a14",};
            IPrivateSBusinessGraphicsSampleView.ICategoryNode catNode = wdContext.nodeCategory();
            IPrivateSBusinessGraphicsSampleView.ICategoryElement  catElement;
            for (int catIndex = 0; catIndex < catLabels.length; ++catIndex)
                catElement = catNode.createCategoryElement();
               catNode.addElement(catElement);
               catElement.setDescription(catLabels[catIndex]);
             // loop over series
            IPrivateSBusinessGraphicsSampleView.ISeriesNode seriesNode = wdContext.nodeSeries();
            for (int seriesIndex = 0; seriesIndex < timeValues.length; ++seriesIndex)
               IPrivateSBusinessGraphicsSampleView.ISeriesElement seriesElement = seriesNode.createSeriesElement();
               seriesNode.addElement(seriesElement);
               // set series attributes (...)
               IPrivateSBusinessGraphicsSampleView.IPointNode pointNode = seriesElement.nodePoint();
               IPrivateSBusinessGraphicsSampleView.IPointElement  pointElement;
               // loop over points
               for (int pointIndex = 0; pointIndex < timeValues[seriesIndex].length; pointIndex++)
                 //IPrivateSBusinessGraphicsSampleView.IPointElement
                 pointElement = pointNode.createPointElement();
                 pointNode.addElement(pointElement); 
                 String ename = s[pointIndex];
                  wdComponentAPI.getMessageManager().reportSuccess("name:"+ename);
                 pointElement.setStartValue(timeValues[seriesIndex][pointIndex][0]);
                 pointElement.setEndValue(timeValues[seriesIndex][pointIndex][1]);
                 pointElement.setCuId(pointCustomizing[seriesIndex][pointIndex]);
                 pointElement.setLabel(pointLabels[seriesIndex][pointIndex]);    
                  pointElement.setToolTip(ename );
    catch(Exception e){        wdComponentAPI.getMessageManager().reportSuccess("exc2:"+e);    }
    In wdDoModifyView() I have written the following code
    try
         IWDBusinessGraphics graph = (IWDBusinessGraphics)view.getElement("BusinessGraphics");
         IWDAbstractSeries allSeries[] = graph.getSeriesList();
         IWDSimpleSeries series;
         wdThis.wdGetAPI().getComponent().getMessageManager().reportSuccess("length : "+allSeries.length+" value:"+allSeries[0]);
         for(int j=0;j<allSeries.length;j++)
           series = (IWDSimpleSeries)allSeries[j];
          for(int i=0;j<wdContext.nodeSeries().size();i++)
              wdContext.nodeSeries().setLeadSelection(i);
              series.setTooltip(series.getValue());
      catch(Exception e)
         wdThis.wdGetAPI().getComponent().getMessageManager().reportSuccess("exc modify :"+e);
    The node structure is
    Root Node
    >Category>Description
    >Series>Point-->CuId
    >Series>Point-->endvalue
    >Series>Point -->Startvalue
    >Series>Point -->label
    >Series>Point --->Tooltip
    In BusinessGraphis seriesSource-Series node ,tooltip-Series.Point.ToolTip is mapped
    In Category description-Category.Description is mapped
    In Series pointsource-Series.Point, tooltip-series.point.tooltip is mapped
    In Point CustomisingId-eries.point.cuId.label-Series.label, tooltip-series.point.Tooltip,valuesource -series.point is mapped
    In Numericvalue value-series.point.startvalue is mapped
    In Numericvalue value-series.point.endvalue is mapped
    When I deploy my application I am getting <b>java.lang.ClassCastException</b> Exception at the line  <b>series = (IWDSimpleSeries)allSeries[j];</b>
    What is reaseon?.....
    Please help..............
    I want to get dynamic value in the tool tip of the graph.
    Thanks in advance,
    Shamila,

  • Tool tip to not move

    Hi I'm a big fan. long time lurker first time poster
    Currently the position of the tool tip depends on where the cursor first hovers over the image.  Is there a way for the tool tip to appear in the same place no mater where the image is hovered?
    below is the js and css
    thanks
    // SpryTooltip.js - version 0.9 - Spry 1.6.1
    (function() { // BeginSpryComponent
    if (typeof Spry == "undefined") window.Spry = {}; if (!Spry.Widget) Spry.Widget = {};
    Spry.Widget.BrowserSniff = function()
    var b = navigator.appName.toString();
    var up = navigator.platform.toString();
    var ua = navigator.userAgent.toString();
    this.mozilla = this.ie = this.opera = this.safari = false;
    var re_opera = /Opera.([0-9\.]*)/i;
    var re_msie = /MSIE.([0-9\.]*)/i;
    var re_gecko = /gecko/i;
    var re_safari = /(applewebkit|safari)\/([\d\.]*)/i;
    var r = false;
    if ( (r = ua.match(re_opera))) {
    this.opera = true;
    this.version = parseFloat(r[1]);
    } else if ( (r = ua.match(re_msie))) {
    this.ie = true;
    this.version = parseFloat(r[1]);
    } else if ( (r = ua.match(re_safari))) {
    this.safari = true;
    if(parseFloat(r[2]) < 420)
    this.version = 2;
    else
    this.version = 3;
    } else if (ua.match(re_gecko)) {
    var re_gecko_version = /rv:\s*([0-9\.]+)/i;
    r = ua.match(re_gecko_version);
    this.mozilla = true;
    this.version = parseFloat(r[1]);
    this.windows = this.mac = this.linux = false;
    this.Platform = ua.match(/windows/i) ? "windows" :
    (ua.match(/linux/i) ? "linux" :
    (ua.match(/mac/i) ? "mac" :
    ua.match(/unix/i)? "unix" : "unknown"));
    this[this.Platform] = true;
    this.v = this.version;
    if (this.safari && this.mac && this.mozilla) {
    this.mozilla = false;
    Spry.is = new Spry.Widget.BrowserSniff();
    Spry.Widget.Tooltip = function(tooltip_element, trigger_selector, options)
    options = Spry.Widget.Utils.firstValid(options, {});
    this.init(trigger_selector, tooltip_element, options);
    if (Spry.Widget.Tooltip.onloadDidFire)
    this.attachBehaviors();
    Spry.Widget.Tooltip.loadQueue.push(this);
    Spry.Widget.Tooltip.prototype.init = function(trigger_element, tooltip_element, options)
    var Utils = Spry.Widget.Utils;
    this.triggerElements = Utils.getElementsByClassName(trigger_element);
    this.tooltipElement = Utils.getElement(tooltip_element);
    options.showDelay = parseInt(Utils.firstValid(options.showDelay, 0), 10);
    options.hideDelay = parseInt(Utils.firstValid(options.hideDelay, 0), 10);
    if (typeof this.triggerElements == 'undefined' || !(this.triggerElements.length > 0))
    this.showError('The element(s) "' + trigger_element + '" do not exist in the page');
    return false;
    if (typeof this.tooltipElement == 'undefined' || !this.tooltipElement)
    this.showError('The element "' + tooltip_element + '" do not exists in the page');
    return false;
    this.listenersAttached = false;
    this.hoverClass = "";
    this.followMouse = false;
    this.offsetX = 15;
    this.offsetY = 15;
    this.closeOnTooltipLeave = false;
    this.useEffect = false;
    Utils.setOptions(this, options);
    this.animator = null;
    for (var i =0; i < this.triggerElements.length; i++)
    if (!this.triggerElements[i].className)
    this.triggerElements[i].className = '';
    if (this.useEffect){
    switch (this.useEffect.toString().toLowerCase()){
    case 'blind': this.useEffect = 'Blind'; break;
    case 'fade': this.useEffect = 'Fade'; break;
    default:
    this.useEffect = false;
    this.visibleTooltip = false;
    // Hack for FF 3 - Safari 3: force painting of the element, in order to have the correct display
    this.tooltipElement.offsetHeight;
    // Optimisation: save browser work if display is already 'none'
    if (Spry.Widget.Utils.getStyleProperty(this.tooltipElement, 'display') != 'none')
    this.tooltipElement.style.display = 'none';
    if (typeof this.offsetX != 'numeric')
    this.offsetX = parseInt(this.offsetX, 10);
    if (isNaN(this.offsetX))
    this.offsetX = 0;
    if (typeof this.offsetY != 'numeric')
    this.offsetY = parseInt(this.offsetY, 10);
    if (isNaN(this.offsetY))
    this.offsetY = 0;
    this.tooltipElement.style.position = 'absolute';
    this.tooltipElement.style.top = '0px';
    this.tooltipElement.style.left = '0px';
    Spry.Widget.Tooltip.onloadDidFire = false;
    Spry.Widget.Tooltip.loadQueue = [];
    Spry.Widget.Tooltip.addLoadListener = function(handler)
    if (typeof window.addEventListener != 'undefined')
    window.addEventListener('load', handler, false);
    else if (typeof document.addEventListener != 'undefined')
    document.addEventListener('load', handler, false);
    else if (typeof window.attachEvent != 'undefined')
    window.attachEvent('onload', handler);
    Spry.Widget.Tooltip.processLoadQueue = function(handler)
    Spry.Widget.Tooltip.onloadDidFire = true;
    var q = Spry.Widget.Tooltip.loadQueue;
    var qlen = q.length;
    for (var i = 0; i < qlen; i++)
    if (!q[i].listenersAttached)
    q[i].attachBehaviors();
    Spry.Widget.Tooltip.addLoadListener(Spry.Widget.Tooltip.processLoadQueue);
    Spry.Widget.Tooltip.prototype.addClassName = function(ele, className)
    if (!ele || !className)
    return;
    if (ele.className.indexOf(className) == -1)
    ele.className += (ele.className ? " " : "") + className;
    Spry.Widget.Tooltip.prototype.removeClassName = function(ele, className)
    if (!ele || !className )
    return;
    ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
    Spry.Widget.Tooltip.prototype.showTooltip = function()
    if (!this.visibleTooltip)
    this.tooltipElement.style.visibility = 'hidden';
    this.tooltipElement.style.zIndex = '9999';
    this.tooltipElement.style.display = 'block';
    Spry.Widget.Utils.putElementAt(this.tooltipElement, this.pos, {x:this.offsetX, y:this.offsetY}, true);
    if(Spry.is.ie && Spry.is.version == '6')
    this.createIframeLayer(this.tooltipElement);
    if (!this.visibleTooltip)
    if (this.useEffect)
    if (typeof this.showEffect == 'undefined')
    this.showEffect = new Spry.Widget.Tooltip[this.useEffect](this.tooltipElement, {from: 0, to: 1});
    this.showEffect.start();
    else
    this.tooltipElement.style.visibility = 'visible';
    this.visibleTooltip = true;
    Spry.Widget.Tooltip.prototype.hideTooltip = function(quick)
    if (this.useEffect && !quick)
    if (typeof this.hideEffect == 'undefined')
    this.hideEffect = new Spry.Widget.Tooltip[this.useEffect](this.tooltipElement, {from: 1, to: 0});
    this.hideEffect.start();
    else
    if (typeof this.showEffect != 'undefined')
    this.showEffect.stop();
    this.tooltipElement.style.display = 'none';
    if(Spry.is.ie && Spry.is.version == '6')
    this.removeIframeLayer(this.tooltipElement);
    if (this.hoverClass && !this.hideTimer)
    for (var i = 0; i < this.triggerElements.length; i++)
    this.removeClassName(this.triggerElements[i], this.hoverClass);
    this.visibleTooltip = false;
    Spry.Widget.Tooltip.prototype.displayTooltip = function(show) {
    if (this.tooltipElement)
    if (this.hoverClass){
    for (var i = 0; i < this.triggerElements.length; i++)
    this.removeClassName(this.triggerElements[i], this.hoverClass);
    if (show)
    if (this.hideTimer)
    clearInterval(this.hideTimer);
    delete(this.hideTimer);
    if (this.hoverClass)
    if (typeof this.triggerHighlight != 'undefined')
    this.addClassName(this.triggerHighlight, this.hoverClass);
    var self = this;
    this.showTimer = setTimeout(function(){self.showTooltip()}, this.showDelay);
    else
    if (this.showTimer)
    clearInterval(this.showTimer);
    delete(this.showTimer);
    var self = this;
    this.hideTimer = setTimeout(function(){self.hideTooltip();}, this.hideDelay);
    this.refreshTimeout();
    Spry.Widget.Tooltip.prototype.onMouseOverTrigger = function(e)
    var target = '';
    if (Spry.is.ie)
    target = e.srcElement;
    else
    target = e.target;
    var contains = Spry.Widget.Utils.contains;
    for (var i = 0; i < this.triggerElements.length; i++)
    if (contains(this.triggerElements[i], target))
    target = this.triggerElements[i];
    break;
    if (i == this.triggerElements.length) return;
    if (this.visibleTooltip && this.triggerHighlight && this.triggerHighlight == target)
    if (this.hideTimer)
    clearInterval(this.hideTimer);
    delete(this.hideTimer);
    if (this.hoverClass)
    if (typeof this.triggerHighlight != 'undefined')
    this.addClassName(this.triggerHighlight, this.hoverClass);
    return;
    var pos = Spry.Widget.Utils.getAbsoluteMousePosition(e);
    this.pos = {x: pos.x + this.offsetX, y: pos.y + this.offsetY};
    this.triggerHighlight = target;
    Spry.Widget.Tooltip.closeAll();
    this.displayTooltip(true);
    Spry.Widget.Tooltip.prototype.onMouseMoveTrigger = function(e)
    var pos = Spry.Widget.Utils.getAbsoluteMousePosition(e);
    this.pos = {x: pos.x + this.offsetX, y: pos.y + this.offsetY};
    if (this.visibleTooltip)
    this.showTooltip();
    Spry.Widget.Tooltip.prototype.onMouseOutTrigger = function(e)
    var target = '';
    if (Spry.is.ie)
    target = e.toElement;
    else
    target = e.relatedTarget;
    var contains = Spry.Widget.Utils.contains;
    for (var i=0; i < this.triggerElements.length; i++)
    if (contains(this.triggerElements[i], target))
    return;
    this.displayTooltip(false);
    Spry.Widget.Tooltip.prototype.onMouseOutTooltip = function(e)
    var target = '';
    if (Spry.is.ie)
    target = e.toElement;
    else
    target = e.relatedTarget;
    var contains = Spry.Widget.Utils.contains;
    if (contains(this.tooltipElement, target))
    return;
    this.displayTooltip(false);
    Spry.Widget.Tooltip.prototype.onMouseOverTooltip = function(e)
    if (this.hideTimer)
    clearInterval(this.hideTimer);
    delete(this.hideTimer);
    if (this.hoverClass)
    if (typeof this.triggerHighlight != 'undefined')
    this.addClassName(this.triggerHighlight, this.hoverClass);
    Spry.Widget.Tooltip.prototype.refreshTimeout = function()
    if (Spry.Widget.Tooltip.refreshTimeout != null)
    clearTimeout(Spry.Widget.Tooltip.refreshTimeout);
    Spry.Widget.Tooltip.refreshTimeout = null;
    Spry.Widget.Tooltip.refreshTimeout = setTimeout(Spry.Widget.Tooltip.refreshAll, 100);
    Spry.Widget.Tooltip.prototype.destroy = function()
    for (var k in this)
    try{
    if (typeof this.k == 'object' && typeof this.k.destroy == 'function') this.k.destroy();
    delete this.k;
    }catch(err){}
    Spry.Widget.Tooltip.prototype.checkDestroyed = function()
    // checks the parent node. If it exists, then the element is still in the DOM
    if (!this.tooltipElement || this.tooltipElement.parentNode == null)
    return true;
    return false;
    Spry.Widget.Tooltip.prototype.attachBehaviors = function()
    var self = this;
    var ev = Spry.Widget.Utils.addEventListener;
    for (var i=0; i< this.triggerElements.length; i++)
    ev(this.triggerElements[i], 'mouseover', function(e) {self.onMouseOverTrigger(e || event); return true;}, false);
    ev(this.triggerElements[i], 'mouseout', function(e) {self.onMouseOutTrigger(e || event); return true;}, false);
    if (this.followMouse)
    ev(this.triggerElements[i], 'mousemove', function(e) {self.onMouseMoveTrigger(e || event); return true;}, false);
    if (this.closeOnTooltipLeave)
    ev(this.tooltipElement, 'mouseover', function(e){self.onMouseOverTooltip(e || event); return true;}, false);
    ev(this.tooltipElement, 'mouseout', function(e){self.onMouseOutTooltip(e || event); return true;}, false);
    this.listenersAttached = true;
    // createIframeLayer for Tooltip
    // creates an IFRAME underneath a tooltip element so that it will show above form controls and ActiveX
    Spry.Widget.Tooltip.prototype.createIframeLayer = function(tooltip)
    if (typeof this.iframeLayer == 'undefined')
    var layer = document.createElement('iframe');
    layer.tabIndex = '-1';
    layer.src = 'javascript:"";';
    layer.scrolling = 'no';
    layer.frameBorder = '0';
    layer.className = 'iframeTooltip';
    tooltip.parentNode.appendChild(layer);
    this.iframeLayer = layer;
    this.iframeLayer.style.left = tooltip.offsetLeft + 'px';
    this.iframeLayer.style.top = tooltip.offsetTop + 'px';
    this.iframeLayer.style.width = tooltip.offsetWidth + 'px';
    this.iframeLayer.style.height = tooltip.offsetHeight + 'px';
    this.iframeLayer.style.display = 'block';
    // removeIframeLayer for Tooltip Element
    // removes an IFRAME underneath a tooltip to reveal any form controls and ActiveX
    Spry.Widget.Tooltip.prototype.removeIframeLayer =  function(tooltip)
    if (this.iframeLayer)
    this.iframeLayer.style.display = 'none';
    Spry.Widget.Tooltip.prototype.showError = function(msg)
    alert('Spry.Widget.Tooltip ERR: ' + msg);
    Spry.Widget.Tooltip.refreshAll = function()
    var q = Spry.Widget.Tooltip.loadQueue;
    var qlen = q.length;
    for (var i = 0; i < qlen ; i++)
    if (q[i].checkDestroyed())
    // the trigger element is no longer in the dom, we should remove the current widget.
    q[i].destroy();
    q.splice(i, 1);
    i--;
    qlen = q.length;
    Spry.Widget.Tooltip.closeAll = function()
    var q = Spry.Widget.Tooltip.loadQueue;
    var qlen = q.length;
    for (var i = 0; i < qlen ; i++)
    if (q[i].visibleTooltip)
    q[i].hideTooltip(true);
    if (q[i].showTimer)
    clearTimeout(q[i].showTimer);
    if (q[i].hideTimer)
    clearTimeout(q[i].hideTimer);
    Spry.Widget.Tooltip.Animator = function(element, opts)
    this.timer = null;
    this.fps = 60;
    this.duration = 500;
    this.startTime = 0;
    this.transition = Spry.Widget.Tooltip.Animator.defaultTransition;
    this.onComplete = null;
    if (typeof element == 'undefined') return;
    this.element = Spry.Widget.Utils.getElement(element);
    Spry.Widget.Utils.setOptions(this, opts, true);
    this.interval = this.duration / this.fps;
    Spry.Widget.Tooltip.Animator.defaultTransition = function(time, begin, finish, duration) { time /= duration; return begin + ((2 - time) * time * finish); };
    Spry.Widget.Tooltip.Animator.prototype.start = function()
    var self = this;
    this.startTime = (new Date).getTime();
    this.beforeStart();
    this.timer = setInterval(function() { self.stepAnimation(); }, this.interval);
    Spry.Widget.Tooltip.Animator.prototype.stop = function()
    if (this.timer)
    clearTimeout(this.timer);
    this.timer = null;
    Spry.Widget.Tooltip.Animator.prototype.stepAnimation = function(){};
    Spry.Widget.Tooltip.Animator.prototype.beforeStart = function(){};
    Spry.Widget.Tooltip.Animator.prototype.destroy = function()
    for (var k in this)
    try
    delete this.k;
    }catch(err){}
    Spry.Widget.Tooltip.Fade = function(element, opts)
    Spry.Widget.Tooltip.Animator.call(this, element, opts);
    if (Spry.is.ie)
    this.origOpacity = this.element.style.filter;
    else
    this.origOpacity = this.element.style.opacity;
    Spry.Widget.Tooltip.Fade.prototype = new Spry.Widget.Tooltip.Animator();
    Spry.Widget.Tooltip.Fade.prototype.constructor = Spry.Widget.Tooltip.Fade;
    Spry.Widget.Tooltip.Fade.prototype.stepAnimation = function()
    var curTime = (new Date).getTime();
    var elapsedTime = curTime - this.startTime;
    var i, obj;
    if (elapsedTime >= this.duration)
    this.beforeStop();
    this.stop();
    return;
    var ht = this.transition(elapsedTime, this.from, this.to - this.from, this.duration);
    if (Spry.is.ie)
    var filter = this.element.style.filter.replace(/alpha\s*\(\s*opacity\s*=\s*[0-9\.]{1,3}\)/, '');
    this.element.style.filter = filter + 'alpha(opacity=' + parseInt(ht * 100, 10) + ')';
    else
    this.element.style.opacity = ht;
    this.element.style.visibility = 'visible';
    this.element.style.display = 'block';
    Spry.Widget.Tooltip.Fade.prototype.beforeStop = function()
    if (this.from > this.to)
    this.element.style.display = 'none';
    if (Spry.is.mozilla)
    this.element.style.filter = this.origOpacity;
    else
    this.element.style.opacity = this.origOpacity;
    Spry.Widget.Tooltip.Blind = function(element, opts)
    this.from = 0;
    this.to = 100;
    Spry.Widget.Tooltip.Animator.call(this, element, opts);
    this.element.style.visibility = 'hidden';
    this.element.style.display = 'block';
    this.origHeight = parseInt(Spry.Widget.Utils.getStyleProperty(this.element, 'height'),10);
    if (isNaN(this.origHeight))
    this.origHeight = this.element.offsetHeight;
    if (this.to == 0)
    this.from = this.origHeight;
    else
    this.to = this.origHeight;
    Spry.Widget.Tooltip.Blind.prototype = new Spry.Widget.Tooltip.Animator();
    Spry.Widget.Tooltip.Blind.prototype.constructor = Spry.Widget.Tooltip.Blind;
    Spry.Widget.Tooltip.Blind.prototype.beforeStart = function()
    this.origOverflow = Spry.Widget.Utils.getStyleProperty(this.element, 'overflow');
    this.element.style.overflow = 'hidden';
    Spry.Widget.Tooltip.Blind.prototype.stepAnimation = function()
    var curTime = (new Date).getTime();
    var elapsedTime = curTime - this.startTime;
    var i, obj;
    if (elapsedTime >= this.duration)
    this.beforeStop();
    this.stop();
    return;
    var ht = this.transition(elapsedTime, this.from, this.to - this.from, this.duration);
    this.element.style.height = Math.floor(ht) + 'px';
    this.element.style.visibility = 'visible';
    this.element.style.display = 'block';
    Spry.Widget.Tooltip.Blind.prototype.beforeStop = function()
    this.element.style.overflow = this.origOverflow;
    if (this.from > this.to)
    this.element.style.display = 'none';
    this.element.style.height = this.origHeight + 'px';
    // Spry.Widget.Utils
    if (!Spry.Widget.Utils) Spry.Widget.Utils = {};
    Spry.Widget.Utils.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
    if (!optionsObj)
    return;
    for (var optionName in optionsObj)
    if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
    continue;
    obj[optionName] = optionsObj[optionName];
    Spry.Widget.Utils.getElement = function(ele)
    if (ele && typeof ele == "string")
    return document.getElementById(ele);
    return ele;
    Spry.Widget.Utils.getElementsByClassName = function(sel)
    if (!sel.length > 0)
    return null;
    var selectors = sel.split(',');
    var el = [];
    for (var i =0; i < selectors.length; i++)
    var cs = selectors[i];
    var chunk = cs.split(' ');
    var parents = [];
    parents[0] = [];
    parents[0][0] = document.body;
    for (var j = 0; j < chunk.length; j++)
    var tokens = Spry.Widget.Utils.getSelectorTokens(chunk[j]);
    for (var k =0; k < parents[j].length; k++)
    var childs = parents[j][k].getElementsByTagName('*');
    parents[j+1] = [];
    for (var l=0; l < childs.length; l++)
    if (Spry.Widget.Utils.hasSelector(childs[l], tokens))
    parents[j+1].push(childs[l]);
    if (parents[j])
    for (var k = 0; k < parents[j].length; k++)
    el.push(parents[j][k]);
    return el;
    Spry.Widget.Utils.firstValid = function()
    var ret = null;
    var a = Spry.Widget.Utils.firstValid;
    for(var i=0; i< a.arguments.length; i++)
    if (typeof(a.arguments[i]) != 'undefined')
    ret = a.arguments[i];
    break;
    return ret;
    Spry.Widget.Utils.getSelectorTokens = function(str)
    str = str.replace(/\./g, ' .');
    str = str.replace(/\#/g, ' #');
    str = str.replace(/^\s+|\s+$/g,"");
    return str.split(' ');
    Spry.Widget.Utils.hasSelector = function(el, tokens)
    for (var i =0; i< tokens.length; i++)
    switch (tokens[i].charAt(0))
    case '.': if (!el.className || el.className.indexOf(tokens[i].substr(1)) == -1) return false; break;
    case '#': if (!el.id || el.id != tokens[i].substr(1)) return false; break;
    default: if (el.nodeName.toLowerCase != tokens[i]) return false; break;
    return true;
    Spry.Widget.Utils.addEventListener = function(element, eventType, handler, capture)
    try
    if (element.addEventListener)
    element.addEventListener(eventType, handler, capture);
    else if (element.attachEvent)
    element.attachEvent("on" + eventType, handler);
    catch (e) {}
    Spry.Widget.Utils.getStyleProperty = function(element, prop)
    var value;
    var camelized = Spry.Widget.Utils.camelize(prop);
    try
    if (element.style)
    value = element.style[camelized];
    if (!value)
    if (document.defaultView && document.defaultView.getComputedStyle)
    var css = document.defaultView.getComputedStyle(element, null);
    value = css ? css.getPropertyValue(prop) : null;
    else if (element.currentStyle)
    value = element.currentStyle[camelized];
    catch (e) {}
    return value == 'auto' ? null : value;
    Spry.Widget.Utils.camelize = function(str)
    if (str.indexOf('-') == -1)
    return str;
    var oStringList = str.split('-');
    var isFirstEntry = true;
    var camelizedString = '';
    for(var i=0; i < oStringList.length; i++)
    if(oStringList[i].length>0)
    if(isFirstEntry)
    camelizedString = oStringList[i];
    isFirstEntry = false;
    else
    var s = oStringList[i];
    camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
    return camelizedString;
    * Spry.Widget.Utils.getPixels
    * returns the value of a CSS property as Int, converting medium to 2
    * @param {DOMElement} m - elements
    * @param {String} s -
    Spry.Widget.Utils.getPixels = function (m, s)
    var v = Spry.Widget.Utils.getStyleProperty(m, s);
    if (v == "medium") {
    v = 2;
    } else {
    v = parseInt(v, 10);
    v = isNaN(v)?0:v;
    return v;
    Spry.Widget.Utils.getAbsoluteMousePosition = function(ev)
    var pos = {x:0, y:0};
    if (ev.pageX)
    pos.x = ev.pageX;
    else if (ev.clientX)
    pos.x = ev.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
    if (isNaN(pos.x)) pos.x = 0;
    if (ev.pageY)
    pos.y = ev.pageY;
    else if (ev.clientY)
    pos.y = ev.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
    if (isNaN(pos.y)) pos.y = 0;
    return pos;
    * Spry.Widget.Utils.getBorderBox
    * returns a border box object (x,y,width,height) which perfectly covers the el element and its borders
    * the x, y are absolute coordinates measured from from the window viewport
    * use the box as the second parameter in Spry.Widget.Utils.setBorderBox
    * @param {DOMElement or String} el -
    * @param {DOMDocument,optional} doc -
    Spry.Widget.Utils.getBorderBox = function (el, doc)
    doc = doc || document;
    if (typeof el == 'string')
    el = doc.getElementById(el);
    if (!el)
    return false;
    if (el.parentNode === null || Spry.Widget.Utils.getStyleProperty(el, 'display') == 'none')
    //element must be visible to have a box
    return false;
    var ret = {x:0, y:0, width:0, height:0};
    var parent = null;
    var box;
    if (el.getBoundingClientRect) { // IE
    box = el.getBoundingClientRect();
    var scrollTop = doc.documentElement.scrollTop || doc.body.scrollTop;
    var scrollLeft = doc.documentElement.scrollLeft || doc.body.scrollLeft;
    ret.x = box.left + scrollLeft;
    ret.y = box.top + scrollTop;
    ret.width = box.right - box.left;
    ret.height = box.bottom - box.top;
    } else if (doc.getBoxObjectFor) { // gecko
    box = doc.getBoxObjectFor(el);
    ret.x = box.x;
    ret.y = box.y;
    ret.width = box.width;
    ret.height = box.height;
    var btw = Spry.Widget.Utils.getPixels(el, "border-top-width");
    var blw = Spry.Widget.Utils.getPixels(el, "border-left-width");
    ret.x -= blw;
    ret.y -= btw;
    } else { // safari/opera
    ret.x = el.offsetLeft;
    ret.y = el.offsetTop;
    ret.width = el.offsetWidth;
    ret.height = el.offsetHeight;
    parent = el.offsetParent;
    if (parent != el)
    while (parent)
    ret.x += parent.offsetLeft;
    ret.y += parent.offsetTop;
    parent = parent.offsetParent;
    var blw = Spry.Widget.Utils.getPixels(el, "border-left-width");
    var btw = Spry.Widget.Utils.getPixels(el, "border-top-width");
    ret.x -= blw;
    ret.y -= btw;
    // opera & (safari absolute) incorrectly account for body offsetTop
    var ua = navigator.userAgent.toLowerCase();
    if (Spry.is.opera || Spry.is.safari && Spry.Widget.Utils.getStyleProperty(el, 'position') == 'absolute')
    ret.y -= doc.body.offsetTop;
    if (el.parentNode)
    parent = el.parentNode;
    else
    parent = null;
    while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML')
    ret.x -= (isNaN(parent.scrollLeft) ? 0 : parent.scrollLeft);
    ret.y -= (isNaN(parent.scrollTop)  ? 0 : parent.scrollTop);
    if (parent.parentNode)
    parent = parent.parentNode;
    else
    parent = null;
    return ret;
    * Spry.Widget.Utils.setBorderBox
    * puts the element el to the location specified by box
    * @param {DOMElement} el - the element to be placed
    * @param {Object} box - hash containing the x and y coordinates where to put el
    Spry.Widget.Utils.setBorderBox = function (el, box) {
    var pos = Spry.Widget.Utils.getBorderBox(el, el.ownerDocument);
    if (pos === false)
    return false;
    var delta = {
    x:Spry.Widget.Utils.getPixels(el, 'left'),
    y:Spry.Widget.Utils.getPixels(el, 'top')
    var new_pos = {x:0, y:0, w:0, h:0};
    if (typeof box.x == 'number') {
    new_pos.x = box.x - pos.x + delta.x;
    if (typeof box.y == 'number') {
    new_pos.y = box.y - pos.y + delta.y;
    if (typeof box.x == 'number') {
    el.style.left = new_pos.x + 'px';
    if (typeof box.y == 'number') {
    el.style.top = new_pos.y + 'px';
    return true;
    Spry.Widget.Utils.putElementAt = function (source, target, offset, biv)
    biv = Spry.Widget.Utils.firstValid(biv, true);
    var source_box = Spry.Widget.Utils.getBorderBox(source, source.ownerDocument);
    Spry.Widget.Utils.setBorderBox(source, target);
    if (biv)
    Spry.Widget.Utils.bringIntoView(source);
    return true;
    * Spry.Widget.Utils.bringIntoView
    * set the position of the source element so it is completely visible in the window
    * @param {DOMElemenet} source - the element to be
    Spry.Widget.Utils.bringIntoView = function (source) {
    var box = Spry.Widget.Utils.getBorderBox(source, source.ownerDocument);
    if (box === false) {
    return false;
    var current = {
    x:Spry.Widget.Utils.getPixels(source, 'left'),
    y:Spry.Widget.Utils.getPixels(source, 'top')
    var delta = {x:0, y:0};
    var offset_fix = {x:0, y:0};
    var strictm = source.ownerDocument.compatMode == "CSS1Compat";
    var doc = (Spry.is.ie && strictm || Spry.is.mozilla)?source.ownerDocument.documentElement:source.ownerDocument.body;
    offset_fix.x = Spry.Widget.Utils.getPixels(doc, 'border-left-width');
    offset_fix.y = Spry.Widget.Utils.getPixels(doc, 'border-top-width');
    var st = doc.scrollTop;
    var ch = self.innerHeight ? self.innerHeight : doc.clientHeight;
    var t = box.y + (Spry.is.ie?-offset_fix.y:offset_fix.y);
    var b = box.y + box.height + (Spry.is.ie?-offset_fix.y:offset_fix.y);
    if ( b - st > ch) {
    delta.y = ch - (b - st);
    if (t + delta.y < st) {
    delta.y = st-t;
    } else if (t < st) {
    delta.y = st - t;
    if (delta.y != 0) {
    source.style.top = (current.y + delta.y) + 'px';
    var sl = doc.scrollLeft;
    var cw = doc.clientWidth;
    var l = box.x + (Spry.is.ie?-offset_fix.x:offset_fix.x);
    var r = box.x + box.width + (Spry.is.ie?-offset_fix.x:offset_fix.x);
    if ( r - sl > cw) {
    delta.x = cw - (r - sl);
    if (l + delta.x < sl) {
    delta.x = sl-l;
    } else if (l < sl) {
    delta.x = sl - l;
    if (delta.x != 0) {
    source.style.left = (current.x + delta.x) + 'px';
    Spry.Widget.Utils.contains = function (who, what) {
    if (typeof who.contains == 'object') {
    return what && who && (who == what || who.contains(what));
    } else {
    var el = what;
    while(el) {
    try{
    if (el == who) {
    return true;
    el = el.parentNode;
    }catch(a){return false;}
    return false;
    })(); // EndSpryComponent
    @charset "UTF-8";
    /* SpryTooltip.css - version 0.2 - Spry 1.6.1 */
    /* Copyright (c) 2006. Adobe Systems Incorporated. All rights reserved. */
    /* HACK FOR IE: to make sure the tooltips show above form controls, we underlay each tooltip with an iframe */
    .iframeTooltip
    position: absolute;
    z-index: 1010;
    filter:alpha(opacity:0.1);
    .tooltipContent
    font-size: 11px;
    font-style: italic;
    color: #332c40;
    width: 96px;
    height: 51px;
    background: url(../_images/recipe/bubble2.png) no-repeat;
    font-family: "Comic Sans MS", cursive;
    margin: 0px;
    left: -200px;
    top: -200px;
    padding-top: 5px;
    vertical-align: middle;
    position: fixed;

    I couldn't get this script to work with my code:
    <a id="greensource" href="a"><img src="images/greensource.png" alt="Greensource Initiative" width="193" height="71" border="0" usemap="#Map7" id="sprytrigger6" title="Greensource Initiative" />
    <map name="Map7" id="Map7">
    <area shape="rect" coords="-22,-15,197,79" href="#" />
    </map>
    </a>
    <div class="tooltipContent" id="green">
    <div class="secondback">
    <div style="padding: 15px;">
    <h1>GREENSOURCE</h1>
    <h2>INITIATIVE&#8482;</h2>
    <p>Manufactred within Greensource Initiative&#8482; guildelines for use of recycled materials, renewable energy and non-hazardous packaging materials. RoHS Compliant.</p>
    <p class="morebutton"><a href="#">LEARN MORE</a></p>
    </div>
    </div>
    </div>
    <script type="text/javascript">
    <!--
    var sprytooltip7 = new Spry.Widget.Tooltip("green", "#greensource");
    //-->
    </script>
    Maybe someone can point out my problem?
    CSS:
    .tooltipContent
        margin: 0;
        padding: 0;
        background: #FFF url(../images/bottom-gradient.png) repeat-x bottom left;
        font-family: "Myriad Pro", Tahoma, Geneva, sans-serif;
        text-align: left;
        box-shadow: 2px 2px 4px #b6b5b6;
        -webkit-box-shadow: 2px 2px 4px #b6b5b6;
        -moz-box-shadow: 2px 2px 4px #b6b5b6;
        position: fixed;
    #green {
        position: absolute;
        border: none;
        top: 200px;
        left: 200px;

  • How to highlight a tree node programmatically

    Problem
    =====
    Just like a typical management software, I have a navigation tree presenting a list of objects (let's say toasters) on the left panel. The content panel on the right side presents the details of a toaster, when the user selects the toaster on the navigation tree. On the toaster details panel, I would like to have a hyper link referring to another toaster - associated to the selected toaster. On clicking on the hyperlink, I would like to display the details of the associated toaster and the navigation tree node for the associated toaster being highlighted.
    For example, BUI presents the following now:
    + Toasters | Toaster 1 Details [Refresh]
    + <toaster1> |
    + toaster2 | ... toaster3
    + toaster3 |
    toaster1 is selected on the navigation tree. The contents panel displays Toaster 1 details, which has a hyper link for toaster3.
    When the user click on toster3 on the contents panel, I would like to see the following
    + Toasters | Toaster 3 Details [Refresh]
    + toaster1 |
    + toaster2 | ...
    + <toaster3> |
    My Trial
    =====
    ADF Rich Client 11.1.2.3 is used for my development.
    Jspx code for the navigation tree looks like this:
    <af:tree id="navTree" ...>
    <f:facet name="nodeStamp">
    <af:panelGroupLayout id="nodePgl">
    <af:switcher facetName="#{stamp.outcome!=null?'actnode':'noactnode'}" ...>
    <f:facet name="actnode">
    <af:commandLink id="leafLink" text="#{stamp.label}" action="#{stamp.actionOutcome}">
    <af:setActionListener from="#{stamp.key}" to="#{treeHandler.selectedMenuItem}"/>
    </af:commandLink>
    </f:facet>
    <f:facet name="noactnode">
    <af:outputText id="notLeafText" value="#{stamp.label}"/>
    </f:facet>
    </af:switcher>
    </af:panelGroupLayout>
    </f:facet>
    </af:tree>
    The hyper link on the contents panel looks like this:
    <af:iterator var="toaster" value="#{toastData.toasters}">
    <af:commandLink text="#{toaster}" action="#{toasterHandler.goToToaster}">
    <f:param name="toasterId" value="#{toaster}"/>
    <af:setActionListener from="#{toaster}" to="#{treeHandler.selectedToaster}"/>
    </af:commandLink>
    </af:iterator>
    I got some tips from this forum (cannot find thread at the moment) and implemented the treeHandler.selectedToaster method as follows:
    // getSelectionState returns selStat, which is instantiated like the following:
    // RowKeySet selStat = new RowKeySetTreeImpl();
    // TreeModel model = (TreeModel) menuModel.getWrappedData();
    // selStat.setCollectionModel(model);
    // selStat.setContained(true);
    RowKeySet rowKeySet = getSelectionState();
    rowKeySet.removeAll();
    // synthesize the rowKey for the selected toaster
    // if the toaster found in the toaster node list,
    // rowKey should look like [0, <rowIdx of toaster>]
    ArrayList<Integer> rowKey = new ArrayList<Integer>();
    rowKey.add(0);
    rowKey.add(new Integer(rowIdx));
    TreeModel model = (TreeModel) menuModel.getWrappedData();
    model.setRowKey(rowKey);
    model.setRowIndex(rowIdx);
    rowKeySet.add();
    This seems to work most of times except when I refresh the contents details panel using partial page rendering.
    I get NullPointerException on the call to rowKeySet.removeAll().
    Caused by: java.lang.NullPointerException
         at org.apache.myfaces.trinidad.model.RowKeySetTreeImpl._selectAll(RowKeySetTreeImpl.java:459)
         at org.apache.myfaces.trinidad.model.RowKeySetTreeImpl.removeAll(RowKeySetTreeImpl.java:146)
    In my observation, this NPE happens when rowKeySet.size() returns 1 but rowKeySet.iterator() does not return any entries.
    I suspect this is a bug on RowKeySetTreeImpl but not sure.
    Help Need
    =======
    1. What is the reasonably right way to highlight the tree node for my problem?
    2. If my trial is one way to do it, how can I get around the NPE? I cannot change ADF Rich Client library at this point.
    Any help/suggestion/advise would be appreciated.
    Thanks,
    Jeongtae

    I did this, to programmatically expand a tree node, you can try the same and set the row key to highlight.
    private RowKeySet disclosedTreeRowKeySet = new RowKeySetImpl();
    public void rowDisclosureListener(RowDisclosureEvent rowDisclosureEvent)
    Iterator added = rowDisclosureEvent.getAddedSet().iterator();
    if (added!=null)
    while (added.hasNext())
    Object rowKey = added.next();
    //disclosedTreeRowKeySet.clear();
    List path = (List)rowKey;
    for( int i=0; i< path.size(); i++ )
    List<Object> nodePath = new ArrayList<Object>();
    for( int j=0; j<i; j++ )
    nodePath.add( path.get( j ) );
    disclosedTreeRowKeySet.add( nodePath );
    disclosedTreeRowKeySet.add( rowKey );
    System.out.println( "disclosed Keys...... " + disclosedTreeRowKeySet );
    private void expandSelectedNode(RowKeySet addedObj) {
    if (sourceTreeTable != null) {
    Iterator added = (Iterator)addedObj.iterator();
    if (added!=null)
    while (added.hasNext())
    Object rowKey = added.next();
    List path = (List)rowKey;
    for( int i=0; i< path.size(); i++ )
    List<Object> nodePath = new ArrayList<Object>();
    for( int j=0; j<i; j++ )
    nodePath.add( path.get( j ) );
    disclosedTreeRowKeySet.add( nodePath );
    disclosedTreeRowKeySet.add( rowKey );
    sourceTreeTable.setDisclosedRowKeys(disclosedTreeRowKeySet);
    }

  • Invalid B-tree node size

    So I used techtool 4 to try to improve my performance. There weren't any problems before, but I figured "Hey, I might as well." Suddenly both drives disappeared and techtool 4 told me they aren't there. I tried Disk Utility, but it gave me the error message "Invalid B-tree node size." I have no idea what that means and I have some extremely valuable information on that drive that I haven't backed up yet. I don't have $100 to throw away on Disk Warrior either. Is there any other solution that I can do to fix this problem that techtool 4 seemed to have caused.

    You analyzed it with Disk Utility but it won't mount? Did you try to mount it with Disk Utility?
    Try using an application such as [Data Rescue II|http://www.prosofteng.com/products/data_rescue.php] or [FileSalvage|http://subrosasoft.com/OSXSoftware/index.php?mainpage=product_info&productsid=1]. Both have free trial versions that let you see if the software will help before you decide to buy. You will also need a second hard drive equal to or larger in size than your first drive.
    There is also this free tool which supposedly runs on OSX and does recovery of popular media and Office files. http://www.cgsecurity.org/wiki/TestDisk_Download
    I have not seen any reports from anybody who has actually used this tool and the documentation is not terribly clear so it really is an unknown as far as I am concerned.

  • Navigation from tree node to page

    Hi
    plz suggest me from where should i start. I have similar use case as given in this link
    http://jdevadf.oracle.com/adf-richclient-demo/faces/index.jspx
    left side i have tree and right side pages .Whenever i click on tree node corresponding page should display.
    How can i achieve this ?
    Thanks
    nitesh

    You know that the sample you are referring to comes with the source code. You just have to click on the page source link to get to the source.
    One way to archive this is to use a link element to render the node. The link can directly navigate to the right target or show the right region.
    If you need something not sophisticated you can use a selection listener (http://www.oracle.com/technetwork/developer-tools/adf/learnmore/november2011-otn-harvest-1389769.pdf) and to everything from a bean method.
    As you did not give any information about your Jdev version and how the tree is connected to the navigation it's hard to give more advice.
    Timo

  • Tree Node Links

    Hello,
    I am trying to configure a Tree in APEX 4.1 and I'm not sure if what I am trying to do is possible. Here is the situation: I work for a university that has the following colleges:
    College of Arts & Communication
    College of Business Administration
    College of Education
    College of Liberal Arts
    College of Professional Studies
    College of Sciences
    Each of the above listed colleges have multiple majors that are unique to that college.
    So my tree uses the college name for the parent node and each of the majors for that college as the child nodes. Each Major has a major code assigned to it, so when a user clicks on a major, a page loads with information about the students in that major. Colleges, however, do not have a major code and so if the user clicks on the college name in the tree, the page loads but has no data. So, what I would like is that if a user clicks on a mjor, the pages loads like currently set up, but if the user clicks on a college name, a different page loads with information about that college.
    So the question is: Is it possible to have one page load, say Page 21, when a major (child node) is selected, and another page, Page 22, when a college (parent node) is selected?
    Thanks,
    Bob

    Yes, that is very much possible to call different urls/pages from different tree nodes. You need to format your query to use independent select statements (for each node) and finally use UNION to form the tree.
    For example, you can do something like this:
    SELECT CASE WHEN connect_by_isleaf = 1 THEN 0
                WHEN level = 1             THEN 1
                ELSE                           -1
           END as status
    ,      level
    ,      name as title
    ,      icon
    ,      id as value
    ,      tip as tooltip
    ,      url as link
    ,      seq as display
    from
    -- select statement for the parent node
    UNION
    -- select statement for the first/immediate child node
    UNION
    -- select statement for the level 2 child
    start with parent is null
    connect by NOCYCLE prior id = parent
    order siblings by displayIn each select statement, you can specify the required link/url.
    I hope this helps.

Maybe you are looking for