/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.meta.help; import java.io.*; import java.text.MessageFormat; import java.util.*; import java.net.URL; import java.util.zip.*; import org.eclipse.core.runtime.*; import org.eclipse.ui.help.WorkbenchHelp; import org.osgi.framework.Bundle; import org.jboss.tools.common.meta.action.XAction; import org.jboss.tools.common.meta.action.impl.handlers.OpenWithExternalBrowserHandler; import org.jboss.tools.common.meta.action.impl.handlers.OpenWithExternalHandler; import org.jboss.tools.common.meta.key.KeyLoader; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.plugin.ModelMessages; import org.jboss.tools.common.model.util.EclipseResourceUtil; public class HelpUtil { private static final String HELP_PLUGIN_ID = "org.jboss.tools.struts.doc.ui"; //$NON-NLS-1$ private static final String JSF_HELP_PLUGIN_ID = "org.jboss.tools.jsf.doc.ui"; //$NON-NLS-1$ static String[] PLUGINS = new String[]{HELP_PLUGIN_ID, JSF_HELP_PLUGIN_ID}; static Properties keys = KeyLoader.load("help/keys"); //$NON-NLS-1$ public static boolean hasHelp(String key) { String path = (key == null) ? null : keys.getProperty(key); return path != null && path.length() > 0; } public static boolean isHelpPluginInstalled() { for (int i = 0; i < PLUGINS.length; i++) if(Platform.getBundle(PLUGINS[i]) != null) return true; return false; } public static boolean hasEclipseHelp(String key) { String path = (key == null) ? null : keys.getProperty(key); return path != null && path.length() > 0; } public static void callExternalBrowser(XModel model, String url) throws XModelException { XModelObject editor = model.getByPath("%Options%/External Programs/Internet Browser"); //$NON-NLS-1$ if(editor == null) throw new XModelException("External Program 'Internet Browser' is not set in Options."); OpenWithExternalBrowserHandler.start("Help", url, editor); //$NON-NLS-1$ } public static String createKey(XModelObject object, XAction action) { return object.getModelEntity().getName() + "_" + action.getName(); //$NON-NLS-1$ } public static Properties createKey(XModelObject object, XAction action, Properties p) { if(p == null) p = new Properties(); p.setProperty("help", createKey(object, action)); //$NON-NLS-1$ return p; } public static void helpEclipse(XModel model, String key) { ServiceDialog d = model.getService(); if(!isHelpPluginInstalled()) { d.showDialog("Help", "User Guide is not installed.", new String[]{"Close"}, null, ServiceDialog.MESSAGE); } else if(!hasEclipseHelp(key)) { d.showDialog("Help", MessageFormat.format("Help key {0} is not found.", key), new String[]{"Close"}, null, ServiceDialog.MESSAGE); } else { String path = getValidPath(keys.getProperty(key)); if (path != null) { WorkbenchHelp.displayHelpResource(path); } else { d.showDialog("Help", MessageFormat.format("Help resource {0} is not found.", keys.getProperty(key)), new String[]{"Close"}, null, ServiceDialog.MESSAGE); } } } private static String getValidPath(String path) { if(path == null) return null; for (int i = 0; i < PLUGINS.length; i++) { Bundle p = Platform.getBundle(PLUGINS[i]); URL url = EclipseResourceUtil.getInstallURL(p); if(url == null) continue; String f = url.getFile().replace('\\', '/'); if(f.endsWith(XModelObjectConstants.SEPARATOR)) f = f.substring(0, f.length() - 1); if(!path.startsWith(XModelObjectConstants.SEPARATOR)) path = XModelObjectConstants.SEPARATOR + path; String zipPath = f + "/doc.zip"; //$NON-NLS-1$ if(new File(zipPath).exists()) { Set set = getZipEntries(zipPath); if(set.contains(path)) return XModelObjectConstants.SEPARATOR + PLUGINS[i] + XModelObjectConstants.SEPARATOR + path; } if(new java.io.File(f + path).isFile()) return XModelObjectConstants.SEPARATOR + PLUGINS[i] + XModelObjectConstants.SEPARATOR + path; } return null; } static Map<String,Set<String>> zips = new HashMap<String,Set<String>>(); private static Set<String> getZipEntries(String zipPath) { Set<String> set = zips.get(zipPath); if(set != null) return set; set = new HashSet<String>(); zips.put(zipPath, set); try { ZipFile zip = new ZipFile(new File(zipPath)); Enumeration en = zip.entries(); while(en.hasMoreElements()) { ZipEntry entry = (ZipEntry)en.nextElement(); set.add(XModelObjectConstants.SEPARATOR + entry.getName()); } } catch (IOException e) { //ignore } return set; } }