2010-03-15 6 views
2

Lorsque j'utilise HelpBroker.setCurrentID("[some help id]"), JavaHelp affiche correctement la page souhaitée, mais le sujet associé n'est pas automatiquement sélectionné/mis en surbrillance dans la table des matières. Cela rend difficile pour un utilisateur de savoir où se trouve la page actuelle dans l'arborescence.Sélection de la rubrique JavaHelp dans la table des matières lors de l'utilisation de setCurrentID

Est-il possible de mettre en surbrillance par programme le sujet actuel dans la table des matières lorsque j'utilise un HelpBroker pour accéder à une page d'aide spécifique?

Notez que lorsque l'utilisateur suit les liens dans le système d'aide Java, le nouveau sujet est correctement sélectionné dans la table des matières.

+0

Ajouté une prime. Je voudrais vraiment une résolution à ce problème bientôt. – dcstraw

+0

Il m'est apparu que je pourrais probablement utiliser un objet JHelp directement pour implémenter l'aide en ligne sans passer par un HelpBroker. Cela me permettrait d'accéder au JTree au besoin en utilisant une variation du code de Matt ci-dessous. Quelqu'un a-t-il l'expérience de l'implémentation de l'aide Java sans HelpBroker? Est-ce une solution viable? – dcstraw

Répondre

1

Vous devriez être en mesure d'appeler simplement la fonction navigate(), le reste sont des aides. id est l'identifiant bien sûr, et nodeLabel est le texte visible sur le nœud que vous souhaitez sélectionner. Notez que ce code ne vérifie pas les erreurs, à savoir empêcher d'essayer d'aller quelque part qui n'existe pas.

import java.awt.Component; 
import java.util.Enumeration; 
import javax.help.*; 
import javax.help.plaf.basic.BasicTOCNavigatorUI; 
import javax.swing.JTree; 
import javax.swing.JScrollPane; 
import javax.swing.tree.TreeModel; 
import javax.swing.tree.TreePath; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class Nav 
{ 
    private static DefaultMutableTreeNode match = null; 

    private Nav() 
    { 
    } 

    public static void navigate(HelpSet set, HelpBroker broker, String id, String nodeLabel) 
    { 
     broker.setCurrentID(id); 
     JHelp jhelp = new JHelp(set); 
     JHelpNavigator nav = getNavigator(jhelp); 
     JTree tree = getTree(nav); 
     TreeModel model = tree.getModel(); 
     Object root = model.getRoot(); 
     match = null; 
     findNode(model, root, nodeLabel); 
     TreePath path = new TreePath(match.getPath()); 
     tree.setSelectionPath(path); 
     tree.scrollPathToVisible(path); 
    } 

    //http://www.google.com/codesearch/p?hl=en#WiboLAWeTd0/xena/ext/src/javahelp/jhMaster/JavaHelp/src/new/javax/help/WindowPresentation.java&t=0&d=30&l=272 
    private static JHelpNavigator getNavigator(JHelp jhelp) 
    { 
     JHelpNavigator nav = null; 
     for (Enumeration e = jhelp.getHelpNavigators(); e.hasMoreElements();) 
     { 
      nav = (JHelpNavigator) e.nextElement(); 
      if (nav.getNavigatorName().equals("TOC")) 
      { 
       return nav; 
      } 
     } 
     return null; 
    } 

    //http://forums.sun.com/thread.jspa?threadID=350180#1459484 
    private static JTree getTree(JHelpNavigator nav) 
    { 
     JTree tree = null; 
     Component[] components = nav.getComponents(); 
     int count = components.length; 
     int i = 0; 
     while(i < count && !(components[i] instanceof JScrollPane)) 
     { 
      i++; 
     } 
     if(i < count) 
     { 
      JScrollPane sp = (JScrollPane) components[i]; 
      components = sp.getViewport().getComponents(); 
      count = components.length; 
      i = 0; 
      while(i < count && !(components[i] instanceof JTree)) 
      { 
       i++; 
      } 
      tree = (JTree) components[i]; 
     } 
     return tree; 
    } 

    //http://www.rkcole.com/articles/swing/TraverseJtree-2000-11-17.html 
    private static void findNode(TreeModel model, Object o, String search) 
    { 
     if(match != null) 
      return; 

     int count = model.getChildCount(o); 
     for(int i=0; i < count; i++) 
     { 
      Object child = model.getChild(o, i); 
      if ( model.isLeaf(child)) 
      { 
       if(search.equals(((TOCItem)((DefaultMutableTreeNode)child).getUserObject()).getName())) 
       { 
        match = (DefaultMutableTreeNode)child; 
        return; 
       } 
      } 
      else 
       findNode(model, child, search); 
     } 
    } 
} 
+0

Merci pour la solution possible. Je ne suis pas certain que je puisse le faire fonctionner car il faudrait connaître les étiquettes des nœuds. Je suis préoccupé par le fait que cela rend le mappage des sujets beaucoup plus complexe et difficile à maintenir, et je devrais faire quelque chose pour comprendre comment supporter la localisation des étiquettes de nœuds. Je vais voir si cela pourrait marcher pour nous. – dcstraw

+0

J'ai modifié le code pour trouver par ID au lieu de nom, mais l'appel à tree.setSelectionPath (chemin) désélectionne simplement la sélection actuelle sans sélectionner la nouvelle. La nouvelle valeur est définie dans le modèle mais l'arborescence n'affiche pas de rectangle de sélection autour du nouveau nœud. Je vais continuer à regarder ça. Faites-moi savoir si vous avez des idées. – dcstraw

+0

Eh bien, je l'ai eu le travail mais pas dans une capacité que je me sentirais à l'aise de libérer à la production. Dans votre code, vous créez un nouveau JHelp à chaque fois, mais cela ne fonctionne pas pour moi. Je l'ai fait fonctionner en réfléchissant sur un champ privé du DefaultHelpBroker pour obtenir son objet interne JHelp. Est-ce que votre code fonctionne pour vous? Si oui, des idées pourquoi ce ne serait pas pour moi? – dcstraw

1

Utilisez-vous un ensemble d'éléments fusionnés? J'obtiens le comportement que vous voyez si j'utilise setCurrentID ("sujet") et le sujet n'est pas le helpets maître mais dans un sous-ensemble. Qu'est-ce que vous voulez faire à la place est

setCurrentID(javax.help.Map.ID.create("topic",subhelpset)) 

Pour moi, cela fait que la sélection de la vue TOC à se produire correctement. Bien sûr, cela signifie probablement que vous avez besoin d'utiliser des helpets fusionnés dynamiquement puisque je ne vois pas (en main libre) un moyen facile de trouver le sous-ensemble si cela est spécifié dans le fichier .hs de l'aide-mémoire principal. De même, pour l'aide contextuelle, vous devez définir à la fois l'ID et l'aide sur chaque composant.

Questions connexes