Выберите тему JavaHelp в оглавлении при использовании setCurrentID - PullRequest
2 голосов
/ 15 марта 2010

Когда я использую HelpBroker.setCurrentID("[some help id]"), JavaHelp правильно показывает нужную мне страницу, но соответствующая тема не выделяется / не выделяется автоматически в оглавлении. Из-за этого пользователю сложно узнать, где в дереве темы находится текущая страница.

Есть ли способ программно выделить текущую тему в оглавлении, когда я использую HelpBroker для перехода на определенную страницу справки?

Обратите внимание, что когда пользователь переходит по ссылкам в справочной системе Java, новая тема правильно выбирается в оглавлении.

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Вы используете объединенную справочную систему? Я получаю поведение, которое вы видите, если я использую setCurrentID ("topic"), а topic не является основным набором справки, а входит в вспомогательный набор. Вместо этого вы хотите

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

Для меня это заставляет выбор представления TOC происходить правильно. Конечно, это, вероятно, означает, что вам нужно использовать динамически объединенные наборы справок, поскольку я не вижу (от руки) простого способа найти подспособность, если она указана в файле .hs основного справочного набора.

Аналогичным образом, для контекстно-зависимой справки вам необходимо установить как идентификатор, так и набор справки для каждого компонента.

1 голос
/ 27 марта 2010

Вы можете просто вызвать функцию navigate(), остальные - помощники. id - это, конечно, идентификатор, а nodeLabel - это видимый текст на узле, который вы хотите выбрать. Обратите внимание, что этот код не проверяет наличие ошибок, а именно предотвращает попытки попасть куда-то, чего не существует.

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 );
        }
    }
}
...