/flexodesktop/GUI/flexo/src/main/java/org/openflexo/ch/FCH.java
Java | 334 lines | 259 code | 39 blank | 36 comment | 70 complexity | bff39bd7a8a6b49102c2b0f947fff928 MD5 | raw file
- /*
- * (c) Copyright 2010-2011 AgileBirds
- *
- * This file is part of OpenFlexo.
- *
- * OpenFlexo is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * OpenFlexo 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 for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openflexo.ch;
- import java.awt.Component;
- import java.awt.Container;
- import java.awt.Window;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Map.Entry;
- import java.util.WeakHashMap;
- import java.util.logging.Logger;
- import javax.swing.JComponent;
- import org.openflexo.GeneralPreferences;
- import org.openflexo.drm.DocItem;
- import org.openflexo.drm.DocItemFolder;
- import org.openflexo.drm.DocResourceCenter;
- import org.openflexo.drm.DocResourceManager;
- import org.openflexo.drm.Language;
- import org.openflexo.localization.FlexoLocalization;
- import org.openflexo.module.FlexoModule;
- import org.openflexo.view.FlexoFrame;
- import org.openflexo.view.FlexoMainPane;
- import org.openflexo.view.ModuleView;
- /**
- * Utility class provinding facilities to handle contextual help Note: FCH stands for FlexoContextualHelp (ou bien
- * "Fuck cette Connerie de Help")
- *
- * @author sguerin
- */
- public class FCH {
- private static final Logger logger = Logger.getLogger(FCH.class.getPackage().getName());
- private static WeakHashMap<JComponent, DocItem> _docForComponent = new WeakHashMap<JComponent, DocItem>();
- private static WeakHashMap<JComponent, String> _pendingComponents = new WeakHashMap<JComponent, String>();
- private static synchronized Window getWindowForComponent(JComponent component) {
- JComponent current = component;
- Container parent;
- while (current.getParent() != null) {
- parent = current.getParent();
- if (parent instanceof JComponent) {
- current = (JComponent) parent;
- } else if (parent instanceof Window) {
- return (Window) parent;
- } else {
- return null;
- }
- }
- return null;
- }
- private static class SortComponents {
- private List<JComponent> initialVector;
- private List<Component> sortedVector;
- protected SortComponents(List<JComponent> sortingSet, Window window) {
- initialVector = sortingSet;
- sortedVector = new ArrayList<Component>();
- populateFrom(window);
- }
- private void populateFrom(Container component) {
- if (initialVector.contains(component)) {
- sortedVector.add(component);
- }
- for (int i = 0; i < component.getComponentCount(); i++) {
- Component comp = component.getComponent(i);
- if (comp instanceof Container) {
- populateFrom((Container) comp);
- } else if (initialVector.contains(comp)) {
- sortedVector.add(comp);
- }
- }
- }
- protected List<Component> getSortedVector() {
- return sortedVector;
- }
- }
- public static synchronized void validateWindow(Window window) {
- // logger.info("Validate window");
- List<JComponent> concernedComponents = new ArrayList<JComponent>();
- for (Entry<JComponent, String> e : _pendingComponents.entrySet()) {
- JComponent next = e.getKey();
- if (next != null && getWindowForComponent(next) == window) {
- concernedComponents.add(next);
- }
- }
- List<Component> sortedConcernedComponents = new SortComponents(concernedComponents, window).getSortedVector();
- for (Component next : sortedConcernedComponents) {
- validateHelpItem((JComponent) next, _pendingComponents.get(next));
- _pendingComponents.remove(next);
- }
- }
- public static synchronized void setHelpItem(final JComponent component, final String anIdentifier) {
- // logger.info("setHelpItem for "+anIdentifier);
- if (component != null && anIdentifier != null) {
- _pendingComponents.put(component, anIdentifier);
- }
- }
- public static synchronized void validateHelpItem(final JComponent component, final String anIdentifier) {
- JComponent parent = getClosestDocumentedAncestorComponent(component);
- String identifier = anIdentifier;
- if (parent != null) {
- DocItem parentDocItem = getDocForComponent(parent);
- if (!anIdentifier.startsWith(parentDocItem.getIdentifier())) {
- identifier = parentDocItem.getIdentifier() + "-" + anIdentifier;
- }
- validateHelpItem(component, identifier, parentDocItem);
- return;
- }
- validateHelpItem(component, identifier, null);
- }
- public static synchronized void validateHelpItem(final JComponent component, final String anIdentifier, final DocItem parentDocItem) {
- // logger.info(">>>>>>> Validate for "+anIdentifier+" under "+parentDocItem);
- String identifier = anIdentifier;
- if (parentDocItem != null) {
- if (!anIdentifier.startsWith(parentDocItem.getIdentifier())) {
- identifier = parentDocItem.getIdentifier() + "-" + anIdentifier;
- }
- }
- DocItem item = DocResourceManager.getDocItem(identifier);
- if (item == null) {
- item = createCHEntry(component, identifier, parentDocItem);
- }
- _docForComponent.put(component, item);
- Language lang = DocResourceManager.instance().getLanguage(GeneralPreferences.getLanguage());
- String tooltipText = null;
- DocItem currentItem = item;
- while (tooltipText == null && currentItem != null) {
- if (currentItem.getLastApprovedActionForLanguage(lang) != null) {
- tooltipText = currentItem.getLastApprovedActionForLanguage(lang).getVersion().getShortHTMLDescription();
- }
- currentItem = currentItem.getInheritanceParentItem();
- }
- /*if (item.getLastApprovedActionForLanguage(lang) != null) {
- tooltipText = item.getLastApprovedActionForLanguage(lang).getVersion().getShortHTMLDescription();
- }
- else {
- tooltipText = FlexoLocalization.localizedForKeyAndLanguage("no_documentation",GeneralPreferences.getLanguage());
- }*/
- if (tooltipText == null) {
- tooltipText = FlexoLocalization.localizedForKeyAndLanguage("no_documentation", GeneralPreferences.getLanguage());
- }
- component.setToolTipText("<html>" + tooltipText + "</html>");
- }
- public static synchronized void setHelpItem(JComponent component, DocItem item) {
- setHelpItem(component, item.getIdentifier());
- }
- private static synchronized JComponent getClosestDocumentedAncestorComponent(JComponent component) {
- JComponent parent = null;
- DocItem parentItem = null;
- JComponent current = component;
- while (parentItem == null && current.getParent() != null && current.getParent() instanceof JComponent) {
- current = (JComponent) current.getParent();
- parentItem = getDocForComponent(current);
- if (parentItem != null) {
- parent = current;
- }
- }
- return parent;
- }
- private static synchronized DocItem createCHEntry(JComponent component, String identifier, DocItem parentItem) {
- if (parentItem == null) {
- parentItem = DocResourceManager.instance().getFlexoToolSetItem();
- }
- logger.info("Create entry for " + identifier + " under " + parentItem);
- DocItem newEntry = DocItem.createDocItem(identifier, "", parentItem.getFolder(), DocResourceManager.instance()
- .getDocResourceCenter(), false);
- parentItem.addToEmbeddingChildItems(newEntry);
- return newEntry;
- }
- public static DocItem getDocForComponent(JComponent component) {
- return _docForComponent.get(component);
- }
- private static final String MAIN_PANE_ID = "main-pane";
- private static final String CONTROL_PANEL_ID = "control-panel";
- private static final String LEFT_VIEW_ID = "left-view";
- private static final String RIGHT_VIEW_ID = "right-view";
- public static void ensureHelpEntryForModuleHaveBeenCreated(FlexoModule module) {
- DocItem newModuleItem = getDocItemFor(module);
- DocItem mainPaneItem = getMainPaneItemFor(module);
- DocItem controlPanelItem = getControlPanelItemFor(module);
- DocItem leftViewItem = getLeftViewItemFor(module);
- DocItem rightViewItem = getRightViewItemFor(module);
- FlexoFrame frame = module.getFlexoFrame();
- FlexoMainPane mainPane = module.getFlexoController().getMainPane();
- if (mainPane != null) {
- // TODO: restore help on main pane top bar
- // setHelpItem(mainPane.getControlPanel(), controlPanelItem);
- }
- }
- public static DocItem getDocItemFor(FlexoModule module) {
- DocResourceCenter drc = DocResourceManager.instance().getDocResourceCenter();
- String identifier = module.getModule().getHelpTopic();
- if (DocResourceManager.getDocItem(identifier) == null) {
- DocItemFolder newModuleFolder = DocItemFolder.createDocItemFolder(identifier, "", DocResourceManager.instance()
- .getFlexoToolSetItem().getFolder(), drc);
- DocResourceManager.instance().getAbstractModuleItem().addToInheritanceChildItems(newModuleFolder.getPrimaryDocItem());
- }
- return DocResourceManager.getDocItem(identifier);
- }
- public static DocItem getMainPaneItemFor(FlexoModule module) {
- DocResourceCenter drc = DocResourceManager.instance().getDocResourceCenter();
- String identifier = module.getModule().getHelpTopic();
- String mainPaneId = identifier + "-" + MAIN_PANE_ID;
- DocItem newModuleItem = getDocItemFor(module);
- if (DocResourceManager.getDocItem(mainPaneId) == null) {
- DocItemFolder mainPaneFolder = DocItemFolder.createDocItemFolder(mainPaneId, "", newModuleItem.getFolder(), drc);
- DocResourceManager.instance().getAbstractMainPaneItem().addToInheritanceChildItems(mainPaneFolder.getPrimaryDocItem());
- newModuleItem.addToEmbeddingChildItems(mainPaneFolder.getPrimaryDocItem());
- }
- return DocResourceManager.getDocItem(mainPaneId);
- }
- public static DocItem getModuleViewItemFor(FlexoModule module, ModuleView view) {
- DocResourceCenter drc = DocResourceManager.instance().getDocResourceCenter();
- DocItem mainPaneItem = getMainPaneItemFor(module);
- DocItemFolder folder;
- if (view.getPerspective() != null) {
- String perspectiveIdentifier = view.getPerspective().getName();
- if (DocResourceManager.getDocItem(perspectiveIdentifier) == null) {
- DocItemFolder perspectiveFolder = DocItemFolder.createDocItemFolder(perspectiveIdentifier,
- "Documentation on that perspective", mainPaneItem.getFolder(), drc);
- mainPaneItem.addToEmbeddingChildItems(perspectiveFolder.getPrimaryDocItem());
- }
- folder = DocResourceManager.getDocItem(perspectiveIdentifier).getFolder();
- } else {
- folder = mainPaneItem.getFolder();
- }
- String moduleViewIdentifier = view.getClass().getName();
- if (moduleViewIdentifier.lastIndexOf('.') > 0) {
- moduleViewIdentifier = moduleViewIdentifier.substring(moduleViewIdentifier.lastIndexOf('.') + 1);
- }
- if (DocResourceManager.getDocItem(moduleViewIdentifier) == null) {
- DocItemFolder moduleViewFolder = DocItemFolder.createDocItemFolder(moduleViewIdentifier, "Documentation on that view", folder,
- drc);
- mainPaneItem.addToInheritanceChildItems(moduleViewFolder.getPrimaryDocItem());
- if (view.getPerspective() != null && folder.getPrimaryDocItem() != null) {
- moduleViewFolder.getPrimaryDocItem().addToRelatedToItems(folder.getPrimaryDocItem());
- }
- }
- return DocResourceManager.getDocItem(moduleViewIdentifier);
- }
- public static DocItem getControlPanelItemFor(FlexoModule module) {
- DocResourceCenter drc = DocResourceManager.instance().getDocResourceCenter();
- String identifier = module.getModule().getHelpTopic();
- String controlPanelId = identifier + "-" + CONTROL_PANEL_ID;
- DocItem newModuleItem = getDocItemFor(module);
- if (DocResourceManager.getDocItem(controlPanelId) == null) {
- DocItemFolder controlPanelFolder = DocItemFolder.createDocItemFolder(controlPanelId, "", newModuleItem.getFolder(), drc);
- DocResourceManager.instance().getAbstractControlPanelItem().addToInheritanceChildItems(controlPanelFolder.getPrimaryDocItem());
- newModuleItem.addToEmbeddingChildItems(controlPanelFolder.getPrimaryDocItem());
- }
- return DocResourceManager.getDocItem(controlPanelId);
- }
- public static DocItem getLeftViewItemFor(FlexoModule module) {
- DocResourceCenter drc = DocResourceManager.instance().getDocResourceCenter();
- String identifier = module.getModule().getHelpTopic();
- String leftViewId = identifier + "-" + LEFT_VIEW_ID;
- DocItem newModuleItem = getDocItemFor(module);
- if (DocResourceManager.getDocItem(leftViewId) == null) {
- DocItemFolder leftViewFolder = DocItemFolder.createDocItemFolder(leftViewId, "", newModuleItem.getFolder(), drc);
- DocResourceManager.instance().getAbstractLeftViewItem().addToInheritanceChildItems(leftViewFolder.getPrimaryDocItem());
- newModuleItem.addToEmbeddingChildItems(leftViewFolder.getPrimaryDocItem());
- }
- return DocResourceManager.getDocItem(leftViewId);
- }
- public static DocItem getRightViewItemFor(FlexoModule module) {
- DocResourceCenter drc = DocResourceManager.instance().getDocResourceCenter();
- String identifier = module.getModule().getHelpTopic();
- String rightViewId = identifier + "-" + RIGHT_VIEW_ID;
- DocItem newModuleItem = getDocItemFor(module);
- if (DocResourceManager.getDocItem(rightViewId) == null) {
- DocItemFolder rightViewFolder = DocItemFolder.createDocItemFolder(rightViewId, "", newModuleItem.getFolder(), drc);
- DocResourceManager.instance().getAbstractRightViewItem().addToInheritanceChildItems(rightViewFolder.getPrimaryDocItem());
- newModuleItem.addToEmbeddingChildItems(rightViewFolder.getPrimaryDocItem());
- }
- return DocResourceManager.getDocItem(rightViewId);
- }
- public static void clearComponentsHashtable() {
- _docForComponent.clear();
- _pendingComponents.clear();
- }
- }