/* * RHQ Management Platform * Copyright (C) 2005-2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.coregui.client.help; import java.util.ArrayList; import java.util.List; import java.util.MissingResourceException; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.Label; import org.rhq.core.domain.common.ProductInfo; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.IconEnum; import org.rhq.coregui.client.MessageConstants; import org.rhq.coregui.client.components.AboutModalWindow; import org.rhq.coregui.client.components.FullHTMLPane; import org.rhq.coregui.client.components.TitleBar; import org.rhq.coregui.client.components.view.AbstractSectionedLeftNavigationView; import org.rhq.coregui.client.components.view.NavigationItem; import org.rhq.coregui.client.components.view.NavigationSection; import org.rhq.coregui.client.components.view.ViewFactory; import org.rhq.coregui.client.components.view.ViewName; import org.rhq.coregui.client.util.enhanced.EnhancedVLayout; /** * The Help top-level view. * * @author Jay Shaughnessy */ public class HelpView extends AbstractSectionedLeftNavigationView { public static final ViewName VIEW_ID = new ViewName("Help", MSG.common_title_help(), IconEnum.HELP); public static final ViewName SECTION_PRODUCT_VIEW_ID = new ViewName("Product", MSG.view_help_section_product()); private final ProductInfo productInfo = CoreGUI.get().getProductInfo(); private final MessageConstants messageConstants = CoreGUI.getMessageConstants(); private boolean contentFromProductInfo; public HelpView() { super(VIEW_ID.getName()); } @Override protected List<NavigationSection> getNavigationSections() { List<NavigationSection> sections = new ArrayList<NavigationSection>(); NavigationSection docSection = buildProductSection(); sections.add(docSection); addUrlSections(sections); return sections; } @Override protected EnhancedVLayout defaultView() { EnhancedVLayout vLayout = new EnhancedVLayout(); vLayout.setWidth100(); TitleBar titleBar = new TitleBar(MSG.common_title_help(), VIEW_ID.getIcon().getIcon24x24Path()); vLayout.addMember(titleBar); Label label = new Label(MSG.view_helpTop_description()); label.setPadding(10); vLayout.addMember(label); return vLayout; } private NavigationSection buildProductSection() { NavigationItem aboutItem = new NavigationItem(new ViewName("AboutBox", MSG.view_help_section_product_about(), IconEnum.HELP), new ViewFactory() { public Canvas createView() { final AboutModalWindow aboutModalWindow = new AboutModalWindow(productInfo); aboutModalWindow.show(); return aboutModalWindow; } }); aboutItem.setRefreshRequired(true); return new NavigationSection(SECTION_PRODUCT_VIEW_ID, aboutItem); } private void addUrlSections(List<NavigationSection> sections) { this.selectContentLocation(); int numSections = Integer.valueOf(this.getContent("view_help_section_count")); for (int i = 1; i <= numSections; ++i) { int numItems = Integer.valueOf(this.getContent("view_help_section_" + i + "_item_count")); NavigationItem[] items = new NavigationItem[numItems]; String sectionTitle = this.getContent("view_help_section_" + i + "_title"); for (int j = 1; j <= numItems; ++j) { String title = this.getContent("view_help_section_" + i + "_propTitle_" + j); final String url = this.getContent("view_help_section_" + i + "_propUrl_" + j); String icon; try { icon = this.getContent("view_help_section_" + i + "_propIcon_" + j); if (icon == null) { icon = IconEnum.HELP.getIcon16x16Path(); } } catch (MissingResourceException e) { icon = IconEnum.HELP.getIcon16x16Path(); } final String itemName = "Section" + i + "Item" + j; NavigationItem item = new NavigationItem(new ViewName(itemName, title), icon, new ViewFactory() { public Canvas createView() { return new FullHTMLPane(url); } }); items[j - 1] = item; } NavigationSection section = new NavigationSection(new ViewName("Section" + i, sectionTitle), items); sections.add(section); } } /** * Preselects content location. * * I18N GWT bakes all the messages into the compiled Javascript (it is impossible to change anything * without recompiling the entire project). However, there is a need to dynamically change the help * content after the code is compiled and shipped. ProductInfo is dynamically loaded at runtime from disk. * This implementation allows runtime location selection for help page content: * 1) ProductInfo * 2) I18N GWT system * * NOTE: All the content is loaded from a single location and production info properties file gets priority. */ private void selectContentLocation() { if (productInfo.getHelpViewContent().containsKey("view_help_section_count")) { //use the product info file for help content this.contentFromProductInfo = true; } else { //use the I18N mechanism for help content this.contentFromProductInfo = false; } } /** * Retrieves help view content from the selected content location. * * @return help view content */ private String getContent(String key) { if (this.contentFromProductInfo) { return productInfo.getHelpViewContent().get(key); } else { return messageConstants.getString(key); } } }