All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cz.datalite.zk.javahelp.Help Maven / Gradle / Ivy

The newest version!
package cz.datalite.zk.javahelp;

import cz.datalite.zk.javahelp.event.SearchResultListListener;
import cz.datalite.zk.javahelp.event.TreeListener;
import java.net.URL;
import java.util.Enumeration;
import java.util.List;

import javax.help.HelpSet;
import javax.help.IndexItem;
import javax.help.IndexView;
import javax.help.NavigatorView;
import javax.help.SearchView;
import javax.help.ServletHelpBroker;
import javax.help.TOCItem;
import javax.help.TOCView;
import javax.swing.tree.DefaultMutableTreeNode;
import org.apache.log4j.Logger;

import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Components;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.ext.AfterCompose;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Tabpanel;
import org.zkoss.zul.Tabpanels;
import org.zkoss.zul.Tabs;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Toolbar;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Tree;
import org.zkoss.zul.Treechildren;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.Window;


/**
 * @author Nelson Cazonda
 * 
 */
@SuppressWarnings({ "unchecked", "serial" })
public class Help extends Window implements AfterCompose {

    private static final Logger logger = Logger.getLogger(Help.class);

	private final String HELP_SET_URL = "~./help/jhelpset.hs";
	public static final String IMAGES_FOLDER = "~./javahelp/images/";

	private Tabbox tbxNavigator;
	Textbox txtSearch;
	ServletHelpBroker helpBroker;

	private Listbox lstSrchResults;
	private Label lblNoResultsFound;

	private ZkHelpSearcher searcher;

	/**
	 * Draw the UI. Most of its controls are created dynamically because it
	 * depends on the helpset contents.
	 */
	public void initUI() {
		try {
                    URL url = new URL("http", 
                            Executions.getCurrent().getLocalAddr(),
                            Executions.getCurrent().getServerPort(), 
                            Executions.getCurrent().getContextPath() + "/help/jhelpset.hs");

                        logger.debug("Opening help at: " + url.toString());
                        
			HelpSet helpSet = new HelpSet(null, url);

			helpBroker = new ServletHelpBroker();
			helpBroker.setHelpSet(helpSet);

			Tabs tbViews = new Tabs();                        
			Tabpanels tpViews = new Tabpanels();
                        tpViews.setHeight("100%");

			// each NavigatorView will result in a tab and (obviously) a tab
			// panel.
			for (NavigatorView view : helpSet.getNavigatorViews()) {
				Tab tab = new Tab();
				tab.setId(view.getName());
				tab.setImage(IMAGES_FOLDER + view.getClass().getName()
								+ ".gif");
				tbViews.appendChild(tab);

				Tabpanel tabpanel = new Tabpanel();
				if (view instanceof TOCView || view instanceof IndexView) {
					tabpanel.appendChild(drawTree(view));
				} else {// SearchView
					Toolbar srchToolbar = new Toolbar();

                                       EventListener searchEvent = new EventListener() {
								public void onEvent(Event arg0)
										throws Exception {
									handleListClick(txtSearch.getValue());
								}
							};

					// the search textbox
					txtSearch = new Textbox();
					srchToolbar.appendChild(txtSearch);
                                        txtSearch.addEventListener(Events.ON_OK, searchEvent);

					// the search button
					Toolbarbutton btnSearch = new Toolbarbutton();
					btnSearch.setImage(IMAGES_FOLDER + "javax.help.SearchView.gif");
					btnSearch.addEventListener(Events.ON_CLICK, searchEvent);
					srchToolbar.appendChild(btnSearch);

					// the list box that will display the search results
					lstSrchResults = new Listbox();
					lstSrchResults.setVisible(false);
                                        lstSrchResults.setWidth("100%");
					lstSrchResults.addEventListener(Events.ON_SELECT,
							new SearchResultListListener());
					srchToolbar.appendChild(lstSrchResults);
                                        srchToolbar.setWidth("100%");

					lblNoResultsFound = new Label("Dotazu neodpovídá žádný výsledek.");
					lblNoResultsFound.setVisible(false);

					tabpanel.appendChild(srchToolbar);
					tabpanel.appendChild(lblNoResultsFound);

					searcher = new ZkHelpSearcher((SearchView) view);
				}
				tpViews.appendChild(tabpanel);
			}

			tbxNavigator.appendChild(tbViews);
			tbxNavigator.appendChild(tpViews);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Handles the click event raised by the search toolbar button
	 * 
	 * @param query
	 *            the query string entered on the search textbox
	 */
	private void handleListClick(String query) {
		if (query != null && query.trim().length() > 0) {
			List result = searcher.search(query);

			lstSrchResults.setVisible(result.size() > 0);
			lblNoResultsFound.setVisible(result.size() == 0);

			lstSrchResults.getItems().clear();

			for (Listitem item : result) {
				lstSrchResults.appendChild(item);
			}
		} else {
                    Messagebox.show("Please enter the string to search for.");
		}
	}

	/**
	 * Converts the JavaJelp TOCView or IndexView into a ZK Tree component
	 * 
	 * @param view
	 * @return
	 */
	private Tree drawTree(Object view) {
		DefaultMutableTreeNode topNode = null;
		if (view instanceof TOCView) {
			topNode = ((TOCView) view).getDataAsTree();
		} else if (view instanceof IndexView) {
			topNode = ((IndexView) view).getDataAsTree();
		} else {
			return null;
		}

		Enumeration treeEnum = topNode.children();
		Tree tree = new Tree();
		Treechildren tc = new Treechildren();
		while (treeEnum.hasMoreElements()) {
			DefaultMutableTreeNode n = (DefaultMutableTreeNode) treeEnum
					.nextElement();
			tc.appendChild(addNode(n));
		}
		tree.appendChild(tc);
		tree.addEventListener(Events.ON_SELECT, new TreeListener());

                if (tree.getFirstChild() != null && tree.getFirstChild().getFirstChild() != null)
                    ((Treeitem) ((Treechildren) tree.getFirstChild()).getFirstChild())
				.setOpen(true);

                tree.setZclass("z-dottree");
		return tree;
	}

	/**
	 * used by drawTree to recursively create tree items
	 * 
	 * @param node a node of the TOC or Index JavaHelp tree
	 * @return the corresponding ZK Treeitem
	 */
	private Treeitem addNode(DefaultMutableTreeNode node) {
		Treeitem parent = null;
		Object item = node.getUserObject();
		if (item instanceof TOCItem) {
			TOCItem ti = (TOCItem) item;
			parent = new Treeitem(ti.getName(), item);
		} else if (item instanceof IndexItem) {
			parent = new Treeitem(((IndexItem) item).getName(), item);
		}
                parent.setOpen(false);
                
		Treechildren treeChildren = null;
		Enumeration e = node.children();
		if (e.hasMoreElements()) {
			treeChildren = new Treechildren();
		}

		while (e.hasMoreElements()) {
			DefaultMutableTreeNode child = (DefaultMutableTreeNode) e
					.nextElement();
			treeChildren.appendChild(addNode(child));
		}

		if (treeChildren != null) {
			parent.setImage(IMAGES_FOLDER + "chapTopic.gif");
			parent.appendChild(treeChildren);
		} else {
			parent.setImage(IMAGES_FOLDER + "topic.gif");
		}

		return parent;
	}

	public void afterCompose() {
		Components.wireVariables(this, this);
		Components.addForwards(this, this);
		initUI();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy