/******************************************************************************* * 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.internal.navigation.ui.swt.handlers; import java.util.List; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.riena.navigation.ApplicationNodeManager; import org.eclipse.riena.navigation.IApplicationNode; import org.eclipse.riena.navigation.IModuleGroupNode; import org.eclipse.riena.navigation.IModuleNode; import org.eclipse.riena.navigation.INavigationNode; /** * Close the currently active module. */ public class CloseModule extends AbstractNavigationHandler { public Object execute(final ExecutionEvent event) throws ExecutionException { // assumes there is only one application node final IApplicationNode application = ApplicationNodeManager.getApplicationNode(); final IModuleNode module = findModule(application); if (module != null && module.isClosable()) { final INavigationNode<?> previous = findPreviousModule(application); if (previous != null) { previous.activate(); } module.dispose(); } return null; } // helping methods ////////////////// private INavigationNode<?> findPreviousModule(final IApplicationNode application) { final IModuleNode[] modules = collectModules(application); return findPreviousNode(modules, false); } /** * Not API; public for testing only. */ @SuppressWarnings("unchecked") public final IModuleNode findModule(final IApplicationNode application) { IModuleNode result = null; final IModuleGroupNode moduleGroup = findModuleGroup(application); if (moduleGroup != null) { final INavigationNode<?> module = findActive((List) moduleGroup.getChildren()); if (module instanceof IModuleNode) { result = (IModuleNode) module; } } return result; } }