/*******************************************************************************
* 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.ui.swt.facades;
import org.osgi.service.log.LogService;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.equinox.log.Logger;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISourceProvider;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.internal.WorkbenchPage;
import org.eclipse.ui.services.ISourceProviderService;
import org.eclipse.riena.core.Log4r;
import org.eclipse.riena.navigation.ApplicationNodeManager;
import org.eclipse.riena.navigation.IApplicationNode;
import org.eclipse.riena.navigation.INavigationNode;
import org.eclipse.riena.navigation.ui.swt.component.MenuCoolBarComposite;
import org.eclipse.riena.navigation.ui.swt.presentation.SwtViewId;
import org.eclipse.riena.navigation.ui.swt.presentation.SwtViewProvider;
import org.eclipse.riena.navigation.ui.swt.views.NavigationViewPart;
/**
* Eclipse 3.x specific implementation.
*/
@SuppressWarnings("restriction")
public class WorkbenchFacadeImpl extends WorkbenchFacade {
private static final Logger LOGGER = Log4r.getLogger(WorkbenchFacadeImpl.class);
/*
* (non-Javadoc)
*
* @see org.eclipse.riena.internal.ui.swt.facades.RcpFacade#showView(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IViewReference)
*/
@Override
public void showView(final IWorkbenchPage page, final IViewReference viewRef) {
((WorkbenchPage) page).getActivePerspective().bringToTop(viewRef);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.riena.internal.ui.swt.facades.WorkbenchFacade#getActiveShell()
*/
@Override
public Shell getActiveShell() {
return PlatformUI.getWorkbench().getDisplay().getActiveShell();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.riena.internal.ui.swt.facades.WorkbenchFacade#closeWorkbench()
*/
@Override
public boolean closeWorkbench() {
return PlatformUI.getWorkbench().close();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.riena.internal.ui.swt.facades.WorkbenchFacade#getActiveWindowShell()
*/
@Override
public Shell getActiveWindowShell() {
if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
} else {
return null;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.riena.internal.ui.swt.facades.WorkbenchFacade#getWorkbenchDisplay()
*/
@Override
public Display getWorkbenchDisplay() {
if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getDisplay() != null) {
return PlatformUI.getWorkbench().getDisplay();
} else {
return null;
}
}
private ISourceProviderService getSourceProviderService() {
return (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class);
}
@Override
public ISourceProvider[] getSourceProviders() {
try {
final ISourceProviderService sourceProviderService = getSourceProviderService();
if (sourceProviderService == null) {
return new ISourceProvider[0];
} else {
return sourceProviderService.getSourceProviders();
}
} catch (final IllegalStateException ex) {
LOGGER.log(LogService.LOG_ERROR, "No service for ISourceProviderService!", ex); //$NON-NLS-1$
return new ISourceProvider[0];
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.riena.internal.ui.swt.facades.WorkbenchFacade#switchToNavigation(org.eclipse.core.commands.ExecutionEvent)
*/
@Override
public boolean switchToNavigation(final ExecutionEvent event) {
final IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
final IWorkbenchPage page = window.getActivePage();
IViewPart navigationView = null;
if (page != null) {
final IViewReference[] viewRefs = page.getViewReferences();
for (final IViewReference ref : viewRefs) {
if (NavigationViewPart.ID.equals(ref.getId())) {
navigationView = ref.getView(false);
break;
}
}
}
if (navigationView != null) {
navigationView.setFocus();
return true;
}
return false;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.riena.internal.ui.swt.facades.WorkbenchFacade#switchToWorkarea(java.lang.String)
*/
@Override
public boolean switchToWorkarea(final ExecutionEvent event) {
final String viewId = getViewId(getActiveNode());
if (viewId == null) {
return false;
}
final IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
final IWorkbenchPage page = window.getActivePage();
for (final IViewReference viewRef : page.getViewReferences()) {
if (viewId.equals(getFullId(viewRef))) {
final IViewPart view = viewRef.getView(false);
if (view != null) {
view.setFocus();
return true;
}
break;
}
}
return false;
}
private INavigationNode<?> getActiveNode() {
final IApplicationNode appNode = ApplicationNodeManager.getApplicationNode();
return appNode.getNavigationProcessor().getSelectedNode();
}
private String getViewId(final INavigationNode<?> node) {
String result = null;
if (node != null) {
final SwtViewId viewId = SwtViewProvider.getInstance().getSwtViewId(node);
if (viewId != null) {
result = viewId.getCompoundId();
}
}
return result;
}
private String getFullId(final IViewReference viewRef) {
String result = viewRef.getId();
if (viewRef.getSecondaryId() != null) {
result = result + ":" + viewRef.getSecondaryId(); //$NON-NLS-1$
}
return result;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.riena.internal.ui.swt.facades.WorkbenchFacade#switchToWindowMenu(org.eclipse.core.commands.ExecutionEvent)
*/
@Override
public boolean switchToWindowMenu(final ExecutionEvent event) {
final IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
final Shell shell = window.getShell();
for (final Control child : shell.getChildren()) {
if (child instanceof MenuCoolBarComposite) {
child.setFocus();
return true;
}
}
return false;
}
}