/*******************************************************************************
* 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.navigation.ui.swt.views;
import java.lang.reflect.Constructor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.riena.core.wire.InjectExtension;
import org.eclipse.riena.navigation.IModuleGroupNode;
import org.eclipse.riena.navigation.IModuleNode;
import org.eclipse.riena.navigation.ui.controllers.ModuleController;
import org.eclipse.riena.navigation.ui.controllers.ModuleGroupController;
import org.eclipse.riena.navigation.ui.swt.views.desc.IModuleDescriptionExtension;
import org.eclipse.riena.navigation.ui.swt.views.desc.IModuleGroupDescriptionExtension;
/**
* Factory to create (sub-)views of the navigation view.
*/
public class NavigationViewFactory implements IViewFactory {
private IModuleDescriptionExtension moduleDescriptionExtension;
private IModuleGroupDescriptionExtension moduleGroupDescriptionExtension;
@InjectExtension(min = 0, max = 1)
public void update(final IModuleDescriptionExtension moduleView) {
this.moduleDescriptionExtension = moduleView;
}
@InjectExtension(min = 0, max = 1)
public void update(final IModuleGroupDescriptionExtension moduleGroup) {
this.moduleGroupDescriptionExtension = moduleGroup;
}
/**
* @see org.eclipse.riena.navigation.ui.swt.views.IViewFactory#createModuleGroupView(org.eclipse.swt.widgets.Composite)
*/
public ModuleGroupView createModuleGroupView(final Composite parent) {
if (moduleGroupDescriptionExtension != null) {
final Class<ModuleGroupView> moduleGroupClazz = moduleGroupDescriptionExtension.getView();
if (moduleGroupClazz != null) {
try {
final Constructor<ModuleGroupView> constructor = moduleGroupClazz.getConstructor(Composite.class,
int.class);
return constructor.newInstance(parent, SWT.NONE);
} catch (final Exception e) {
throw new RuntimeException("Instantiating the configured ModuleGroupView " + moduleGroupClazz //$NON-NLS-1$
+ " failed.", e); //$NON-NLS-1$
}
}
}
return new ModuleGroupView(parent, SWT.None);
}
/**
* {@inheritDoc}
* <p>
* This implementation supports three different ways to provide the module
* group controller:
* <ul>
* <li>returns the module group controller of the given node, if exists</li>
* <li>returns the module group controller defined with extension, if exists
* </li>
* <li>returns the default module group controller:
* {@link ModuleGroupController}</li>
* </ul>
*/
public ModuleGroupController createModuleGroupController(final IModuleGroupNode moduleGroupNode) {
ModuleGroupController controller = null;
if (moduleGroupNode.getNavigationNodeController() instanceof ModuleGroupController) {
return (ModuleGroupController) moduleGroupNode.getNavigationNodeController();
}
if (moduleGroupDescriptionExtension != null) {
final Class<ModuleGroupController> moduleGroupClazz = moduleGroupDescriptionExtension.getController();
if (moduleGroupClazz != null) {
try {
final Constructor<ModuleGroupController> constructor = moduleGroupClazz
.getConstructor(IModuleGroupNode.class);
controller = constructor.newInstance(moduleGroupNode);
} catch (final Exception e) {
throw new RuntimeException("Instantiating the configured ModuleGroupController " + moduleGroupClazz //$NON-NLS-1$
+ " failed.", e); //$NON-NLS-1$
}
}
}
if (controller == null) {
controller = new ModuleGroupController(moduleGroupNode);
}
controller.setNavigationNode(moduleGroupNode);
return controller;
}
/**
* @see org.eclipse.riena.navigation.ui.swt.views.IViewFactory#createModuleView(org.eclipse.swt.widgets.Composite)
*/
public ModuleView createModuleView(final Composite parent) {
if (moduleDescriptionExtension != null) {
final Class<ModuleView> moduleViewClazz = moduleDescriptionExtension.getView();
try {
final Constructor<ModuleView> constructor = moduleViewClazz.getConstructor(Composite.class);
return constructor.newInstance(parent);
} catch (final Exception e) {
throw new RuntimeException("Instantiating the configured ModuleView " + moduleViewClazz //$NON-NLS-1$
+ " failed.", e); //$NON-NLS-1$
}
}
return new ModuleView(parent);
}
/**
* {@inheritDoc}
* <p>
* This implementation supports three different ways to provide the module
* controller:
* <ul>
* <li>returns the module controller of the given node, if exists</li>
* <li>returns the module controller defined with extension, if exists</li>
* <li>returns the default module controller: {@link SWTModuleController}</li>
* </ul>
*/
public ModuleController createModuleController(final IModuleNode moduleNode) {
ModuleController controller = null;
if (moduleNode.getNavigationNodeController() instanceof ModuleController) {
return (ModuleController) moduleNode.getNavigationNodeController();
}
if (moduleDescriptionExtension != null) {
final Class<ModuleController> moduleViewClazz = moduleDescriptionExtension.getController();
if (moduleViewClazz != null) {
try {
final Constructor<ModuleController> constructor = moduleViewClazz.getConstructor(IModuleNode.class);
controller = constructor.newInstance(moduleNode);
} catch (final Exception e) {
throw new RuntimeException("Instantiating the configured ModuleController " + moduleViewClazz //$NON-NLS-1$
+ " failed.", e); //$NON-NLS-1$
}
}
}
if (controller == null) {
controller = new SWTModuleController(moduleNode);
}
controller.setNavigationNode(moduleNode);
return controller;
}
}