/******************************************************************************* * Copyright (c) 2007, 2014 compeople AG and others. * All rights reserved. This program and the accompanying materials * are 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: * compeople AG - initial API and implementation *******************************************************************************/ package org.eclipse.riena.e4.launcher.listener; import java.util.Collections; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.inject.Inject; import org.osgi.service.log.LogService; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.equinox.log.Logger; import org.eclipse.ui.ISourceProvider; import org.eclipse.ui.ISourceProviderListener; import org.eclipse.ui.ISources; import org.eclipse.riena.core.Log4r; import org.eclipse.riena.e4.launcher.RienaE4MenuUtils; import org.eclipse.riena.e4.launcher.part.RienaPartHelper; import org.eclipse.riena.e4.launcher.part.uielements.CoolBarComposite; import org.eclipse.riena.internal.navigation.ui.swt.handlers.NavigationSourceProvider; import org.eclipse.riena.navigation.ISubApplicationNode; import org.eclipse.riena.navigation.ISubModuleNode; import org.eclipse.riena.navigation.listener.SubModuleNodeListener; import org.eclipse.riena.navigation.ui.swt.component.MenuCoolBarComposite; import org.eclipse.riena.navigation.ui.swt.views.RienaMenuHelper; import org.eclipse.riena.navigation.ui.swt.views.SubApplicationView; import org.eclipse.riena.ui.ridgets.controller.IController; /** * This listener of a sub module ensures the preparation of nodes (if necessary) and shows the part of the sub module. */ @SuppressWarnings("restriction") public class ShowPartSubModuleNodeListener extends SubModuleNodeListener { private static final Logger LOGGER = Log4r.getLogger(ShowPartSubModuleNodeListener.class); private final PrepareNodeDelegate<ISubModuleNode> prepareNodeDelegate = new PrepareNodeDelegate<ISubModuleNode>(); private final ISourceProviderListener menuSourceProviderListener = new MenuSourceProviderListener(); private final RienaMenuHelper menuBindHelper = new RienaMenuHelper(); private ISubModuleNode subModuleNode; @Inject private IEclipseContext context; @Inject private RienaPartHelper partHelper; /** * {@inheritDoc} * <p> * After activation of a sub module prepare - if necessary - every child node. */ @Override public void activated(final ISubModuleNode source) { subModuleNode = source; prepareNodeDelegate.prepare(source); partHelper.showPart(source); updateNavigationSourceProvider(source); updateContextWithSourceProviders(); } @Override public void afterDeactivated(final ISubModuleNode source) { menuBindHelper.removeSourceProviderListener(menuSourceProviderListener); super.afterDeactivated(source); } private void updateContextWithSourceProviders() { final ISourceProvider[] sourceProviders = new RienaMenuHelper().getSourceProviders(); for (final ISourceProvider sourceProvider : sourceProviders) { final Set<Map.Entry<Object, Object>> entrySet = getCurrentState(sourceProvider); for (final Entry<Object, Object> entry : entrySet) { if (entry.getKey() instanceof String) { context.set((String) entry.getKey(), entry.getValue()); } } } } private Set<Map.Entry<Object, Object>> getCurrentState(final ISourceProvider sourceProvider) { Map<Object, Object> state = null; try { state = sourceProvider.getCurrentState(); } catch (final Exception ex) { final String msg = "SourceProvider \"" + sourceProvider.getClass().getSimpleName() + "\" is not supported!"; //$NON-NLS-1$//$NON-NLS-2$ LOGGER.log(LogService.LOG_WARNING, msg); } if (state != null) { final Set<Map.Entry<Object, Object>> entrySet = state.entrySet(); return entrySet; } else { return Collections.emptySet(); } } private void updateNavigationSourceProvider(final ISubModuleNode source) { final ISourceProvider[] sourceProviders = menuBindHelper.getSourceProviders(); for (final ISourceProvider sourceProvider : sourceProviders) { if (sourceProvider instanceof NavigationSourceProvider) { ((NavigationSourceProvider) sourceProvider).activeNodeChanged(source); } } } /** * {@inheritDoc} * <p> * After the parent of a sub module changed prepare - if necessary - every child node. */ @Override public void parentChanged(final ISubModuleNode source) { prepareNodeDelegate.prepare(source); } /** * Code from {@link SubApplicationView} */ @Override public void afterActivated(final ISubModuleNode source) { menuBindHelper.addSourceProviderListener(menuSourceProviderListener); updateMenuBars(); } private void updateMenuBars() { // update main menu items final MenuCoolBarComposite menuCoolBarComposite = RienaE4MenuUtils.getMenuCoolBarComposite(context); if (menuCoolBarComposite != null) { menuCoolBarComposite.updateMenuItems(); } // update coolbar items final CoolBarComposite coolBarComposite = RienaE4MenuUtils.getCoolBarComposite(context); if (coolBarComposite != null) { coolBarComposite.updateItems(); } if (getSubApplicationNode().getNavigationNodeController() instanceof IController) { final RienaMenuHelper bindHelper = new RienaMenuHelper(); bindHelper.bindMenuAndToolItems((IController) getSubApplicationNode().getNavigationNodeController(), menuCoolBarComposite, coolBarComposite); } } @Override public void disposed(final ISubModuleNode source) { partHelper.disposeNode(source); } private ISubApplicationNode getSubApplicationNode() { return subModuleNode.getParentOfType(ISubApplicationNode.class); } /** * After changing a source the menu bar of this sub-application is updated. */ private class MenuSourceProviderListener implements ISourceProviderListener { /** * Updates the menu bar (only if the priority is correct and this sub-application is selected). * * @param sourcePriority * A bit mask of all the source priorities that have changed. */ private void update(final int sourcePriority) { if ((sourcePriority & ISources.ACTIVE_MENU) == ISources.ACTIVE_MENU) { if (getSubApplicationNode().isSelected()) { updateContextWithSourceProviders(); updateMenuBars(); } } } public void sourceChanged(final int sourcePriority, final Map sourceValuesByName) { update(sourcePriority); } public void sourceChanged(final int sourcePriority, final String sourceName, final Object sourceValue) { update(sourcePriority); } } }