/*******************************************************************************
* Copyright (c) 2006-2013 The RCP Company 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:
* The RCP Company - initial API and implementation
*******************************************************************************/
package com.rcpcompany.uibindings.navigator.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import org.eclipse.core.expressions.ExpressionConverter;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import com.rcpcompany.uibindings.IConstantTreeItem;
import com.rcpcompany.uibindings.navigator.IEditorInformation;
import com.rcpcompany.uibindings.navigator.IEditorPartDescriptor;
import com.rcpcompany.uibindings.navigator.IEditorPartFactory;
import com.rcpcompany.uibindings.navigator.IEditorPartView;
import com.rcpcompany.uibindings.navigator.INavigatorDescriptor;
import com.rcpcompany.uibindings.navigator.INavigatorManager;
import com.rcpcompany.uibindings.navigator.INavigatorModelFactory;
import com.rcpcompany.uibindings.navigator.INavigatorModelPackage;
import com.rcpcompany.uibindings.navigator.editorFactories.GenericPlainFormEditorPartFactory;
import com.rcpcompany.uibindings.navigator.views.INavigatorBaseViewAdvisor;
import com.rcpcompany.uibindings.utils.IGlobalNavigationManager;
import com.rcpcompany.utils.extensionpoints.CEObjectHolder;
import com.rcpcompany.utils.extensionpoints.CEResourceHolder;
import com.rcpcompany.utils.logging.LogUtils;
/**
* <!-- begin-user-doc --> An implementation of the model object '<em><b>Manager</b></em>'. <!--
* end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link com.rcpcompany.uibindings.navigator.internal.NavigatorManagerImpl#getNavigators <em>
* Navigators</em>}</li>
* <li>{@link com.rcpcompany.uibindings.navigator.internal.NavigatorManagerImpl#getDescriptors <em>
* Descriptors</em>}</li>
* <li>
* {@link com.rcpcompany.uibindings.navigator.internal.NavigatorManagerImpl#getEditorInformations
* <em>Editor Informations</em>}</li>
* <li>
* {@link com.rcpcompany.uibindings.navigator.internal.NavigatorManagerImpl#isUseGenericEditorPartFallback
* <em>Use Generic Editor Part Fallback</em>}</li>
* <li>
* {@link com.rcpcompany.uibindings.navigator.internal.NavigatorManagerImpl#isPinEditorByDefault
* <em>Pin Editor By Default</em>}</li>
* <li>{@link com.rcpcompany.uibindings.navigator.internal.NavigatorManagerImpl#isOpenMustOpenNew
* <em>Open Must Open New</em>}</li>
* <li>
* {@link com.rcpcompany.uibindings.navigator.internal.NavigatorManagerImpl#getPreferenceModelTypes
* <em>Preference Model Types</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class NavigatorManagerImpl extends EObjectImpl implements INavigatorManager {
/**
* The cached value of the '{@link #getNavigators() <em>Navigators</em>}' containment reference
* list. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #getNavigators()
* @generated
* @ordered
*/
protected EList<INavigatorDescriptor> navigators;
/**
* The cached value of the '{@link #getDescriptors() <em>Descriptors</em>}' containment
* reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #getDescriptors()
* @generated
* @ordered
*/
protected EList<IEditorPartDescriptor> descriptors;
/**
* The cached value of the '{@link #getEditorInformations() <em>Editor Informations</em>}'
* containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #getEditorInformations()
* @generated
* @ordered
*/
protected EList<IEditorInformation> editorInformations;
/**
* The default value of the '{@link #isUseGenericEditorPartFallback()
* <em>Use Generic Editor Part Fallback</em>}' attribute. <!-- begin-user-doc --> <!--
* end-user-doc -->
*
* @see #isUseGenericEditorPartFallback()
* @generated
* @ordered
*/
protected static final boolean USE_GENERIC_EDITOR_PART_FALLBACK_EDEFAULT = true;
/**
* The cached value of the '{@link #isUseGenericEditorPartFallback()
* <em>Use Generic Editor Part Fallback</em>}' attribute. <!-- begin-user-doc --> <!--
* end-user-doc -->
*
* @see #isUseGenericEditorPartFallback()
* @generated
* @ordered
*/
protected boolean useGenericEditorPartFallback = USE_GENERIC_EDITOR_PART_FALLBACK_EDEFAULT;
/**
* The default value of the '{@link #isPinEditorByDefault() <em>Pin Editor By Default</em>}'
* attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #isPinEditorByDefault()
* @generated
* @ordered
*/
protected static final boolean PIN_EDITOR_BY_DEFAULT_EDEFAULT = false;
/**
* The cached value of the '{@link #isPinEditorByDefault() <em>Pin Editor By Default</em>}'
* attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #isPinEditorByDefault()
* @generated
* @ordered
*/
protected boolean pinEditorByDefault = PIN_EDITOR_BY_DEFAULT_EDEFAULT;
/**
* The default value of the '{@link #isOpenMustOpenNew() <em>Open Must Open New</em>}'
* attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #isOpenMustOpenNew()
* @generated
* @ordered
*/
protected static final boolean OPEN_MUST_OPEN_NEW_EDEFAULT = false;
/**
* The cached value of the '{@link #isOpenMustOpenNew() <em>Open Must Open New</em>}' attribute.
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #isOpenMustOpenNew()
* @generated
* @ordered
*/
protected boolean openMustOpenNew = OPEN_MUST_OPEN_NEW_EDEFAULT;
/**
* The cached value of the '{@link #getPreferenceModelTypes() <em>Preference Model Types</em>}'
* attribute list. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #getPreferenceModelTypes()
* @generated
* @ordered
*/
protected EList<CEObjectHolder<EObject>> preferenceModelTypes;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
protected NavigatorManagerImpl() {
super();
}
/**
* Initializes the manager
*/
public void init() {
extensionReader();
preferenceReader();
}
@Override
public IEditorInformation getEditorInformation(String id) {
if (id == null) return null;
id = id.intern();
for (final IEditorInformation mt : getEditorInformations()) {
if (mt.getTreeItemID() != null && mt.getTreeItemID().equals(id)) return mt;
}
/*
* No match. Find all the relevant descriptors and create a new editor information object...
*/
final List<IEditorPartDescriptor> descs = new ArrayList<IEditorPartDescriptor>();
for (final IEditorPartDescriptor d : getDescriptors()) {
if (d.isFallbackEditor()) {
continue;
}
for (final String tiid : d.getTreeItemIDs()) {
if (tiid.equals(id)) {
descs.add(d);
}
}
}
/*
* If falling back on the generic factory, then create and install this properly.
*/
if (descs.size() == 0 && isUseGenericEditorPartFallback()) {
descs.add(getFallbackEditor());
}
/*
* No descriptors? Then no model type!
*/
if (descs.size() == 0) return null;
/*
* Create the new model type...
*/
final IEditorInformation ei = INavigatorModelFactory.eINSTANCE.createEditorInformation();
ei.setTreeItemID(id);
ei.getEditors().addAll(descs);
/*
* Sort the editors
*/
final Comparator<IEditorPartDescriptor> comparator = new Comparator<IEditorPartDescriptor>() {
@Override
public int compare(IEditorPartDescriptor o1, IEditorPartDescriptor o2) {
return o2.getPriority() - o1.getPriority();
}
};
ECollections.sort(ei.getEditors(), comparator);
setCurrentPreferenceValue(ei);
getEditorInformations().add(ei);
return ei;
}
/**
* The descriptor use for fall back...
*/
private IEditorPartDescriptor myFallbackEditor = null;
/**
* Returns the fall back editor.
* <p>
* Creates it if needed.
*
* @return the editor
*/
private IEditorPartDescriptor getFallbackEditor() {
if (myFallbackEditor == null) {
// TODO: move to declaration!
myFallbackEditor = INavigatorModelFactory.eINSTANCE.createEditorPartDescriptor();
myFallbackEditor.setFallbackEditor(true);
myFallbackEditor.setId(EObject.class.getName() + ".generic");
myFallbackEditor
.setFactory(new CEObjectHolder<IEditorPartFactory>(new GenericPlainFormEditorPartFactory()));
myFallbackEditor.setName("Generic Information");
myFallbackEditor.setPriority(10);
getDescriptors().add(myFallbackEditor);
}
return myFallbackEditor;
}
@Override
public IEditorInformation getEditorInformation(Class<? extends EObject> cls) {
if (cls == null) return null;
/*
* Look for an exact match
*/
if (!cls.isInterface()) {
final Class<?>[] interfaces = cls.getInterfaces();
if (interfaces.length > 0) {
cls = (Class<? extends EObject>) interfaces[0];
}
}
final String typeName = cls.getName();
for (final IEditorInformation mt : getEditorInformations()) {
if (mt.getModelType() != null && mt.getModelType().equals(typeName)) return mt;
}
/*
* No match. Find all the relevant descriptors and create a new model type object...
*/
final List<IEditorPartDescriptor> descs = new ArrayList<IEditorPartDescriptor>();
final Class<?>[] classes = Platform.getAdapterManager().computeClassOrder(cls);
for (final Class<?> c : classes) {
final String tn = c.getName();
for (final IEditorPartDescriptor d : getDescriptors()) {
if (d.isFallbackEditor()) {
continue;
}
for (final String mt : d.getModelTypes()) {
if (mt.equals(tn)) {
descs.add(d);
}
}
}
}
/*
* If falling back on the generic factory.
*/
if (descs.size() == 0 && isUseGenericEditorPartFallback()) {
descs.add(getFallbackEditor());
}
/*
* No descriptors? Then no model type!
*/
if (descs.size() == 0) return null;
/*
* Create the new model type...
*/
final IEditorInformation mt = INavigatorModelFactory.eINSTANCE.createEditorInformation();
mt.setModelType(cls.getName());
mt.getEditors().addAll(descs);
/*
* Sort the editors
*/
final Comparator<IEditorPartDescriptor> comparator = new Comparator<IEditorPartDescriptor>() {
@Override
public int compare(IEditorPartDescriptor o1, IEditorPartDescriptor o2) {
return o2.getPriority() - o1.getPriority();
}
};
ECollections.sort(mt.getEditors(), comparator);
setCurrentPreferenceValue(mt);
getEditorInformations().add(mt);
return mt;
}
@Override
public IEditorPartDescriptor getEditorPartDescriptor(EObject obj) {
if (obj == null) return null;
IEditorInformation mt = null;
if (obj instanceof IConstantTreeItem) {
mt = getEditorInformation(((IConstantTreeItem) obj).getDescriptor().getId());
} else {
mt = getEditorInformation(obj.getClass());
}
if (mt == null) return null;
return mt.getPreferredEditor();
}
private void extensionReader() {
final IExtensionRegistry registry = Platform.getExtensionRegistry();
for (final IConfigurationElement ce : registry
.getConfigurationElementsFor(NavigatorConstants.EDITORS_EXTENSION_POINT)) {
final String elementName = ce.getName();
if (NavigatorConstants.NAVIGATOR_TAG.equals(elementName)) {
final String id = ce.getAttribute(NavigatorConstants.ID_TAG);
if (id == null || id.length() == 0) {
LogUtils.error(ce, NavigatorConstants.ID_TAG + " must be specified. Ignored"); //$NON-NLS-1$
continue;
}
final INavigatorDescriptor descriptor = INavigatorModelFactory.eINSTANCE.createNavigatorDescriptor();
descriptor.setId(id);
descriptor.setAdvisor(new CEObjectHolder<INavigatorBaseViewAdvisor>(ce, NavigatorConstants.CLASS_TAG));
for (final INavigatorDescriptor d : getNavigators()) {
if (d.getId().equals(descriptor.getId())) {
LogUtils.error(ce, NavigatorConstants.ID_TAG
+ " '" + descriptor.getId() + "' repeated. Ignored"); //$NON-NLS-1$
continue;
}
}
getNavigators().add(descriptor);
} else if (NavigatorConstants.EDITOR_TAG.equals(elementName)) {
String id = ce.getAttribute(NavigatorConstants.ID_TAG);
if (id == null || id.length() == 0) {
id = "<unspecified>"; //$NON-NLS-1$
}
final String name = ce.getAttribute(NavigatorConstants.NAME_TAG);
if (name == null || name.length() == 0) {
LogUtils.error(ce, NavigatorConstants.NAME_TAG + " must be specified. Ignored"); //$NON-NLS-1$
continue;
}
final IEditorPartDescriptor descriptor = INavigatorModelFactory.eINSTANCE.createEditorPartDescriptor();
descriptor.setId(id);
descriptor.setName(name);
descriptor.setImage(new CEResourceHolder(ce, NavigatorConstants.IMAGE_TAG));
descriptor.setFactory(new CEObjectHolder<IEditorPartFactory>(ce, NavigatorConstants.FACTORY_TAG));
for (final IConfigurationElement mtCE : ce.getChildren(NavigatorConstants.MODEL_TYPE_TAG)) {
final String modelType = mtCE.getAttribute(NavigatorConstants.CLASS_TAG);
if (modelType == null || modelType.length() == 0) {
LogUtils.error(mtCE, NavigatorConstants.CLASS_TAG + " must be specified. Ignored"); //$NON-NLS-1$
continue;
}
if (descriptor.getModelTypes().contains(modelType)) {
LogUtils.error(mtCE, NavigatorConstants.CLASS_TAG + " is already added. Ignored"); //$NON-NLS-1$
continue;
}
descriptor.getModelTypes().add(modelType);
}
for (final IConfigurationElement mtCE : ce.getChildren(NavigatorConstants.TREE_ITEM_TAG)) {
id = mtCE.getAttribute(NavigatorConstants.ID_TAG);
if (id == null || id.length() == 0) {
LogUtils.error(mtCE, NavigatorConstants.ID_TAG + " must be specified. Ignored"); //$NON-NLS-1$
continue;
}
if (descriptor.getTreeItemIDs().contains(id)) {
LogUtils.error(mtCE, NavigatorConstants.ID_TAG + " is already added. Ignored"); //$NON-NLS-1$
continue;
}
descriptor.getTreeItemIDs().add(id);
}
if (descriptor.getModelTypes().size() == 0 && descriptor.getTreeItemIDs().size() == 0) {
LogUtils.error(ce, "Either model types or tree item ids must be specified. Ignored"); //$NON-NLS-1$
continue;
}
final String priority = ce.getAttribute(NavigatorConstants.PRIORITY_TAG);
if (priority != null && priority.length() > 0) {
try {
descriptor.setPriority(Integer.parseInt(priority));
} catch (final NumberFormatException ex) {
LogUtils.error(ce, ex);
continue;
}
} else {
descriptor.setPriority(1000);
}
/*
* Read any expression...
*/
final IConfigurationElement[] expressionCEs = ce.getChildren(NavigatorConstants.ENABLED_WHEN_TAG);
switch (expressionCEs.length) {
case 0:
break;
case 1:
try {
descriptor.setEnabledWhenExpression(ExpressionConverter.getDefault().perform(expressionCEs[0]));
} catch (final CoreException ex) {
LogUtils.error(ce, ex);
}
break;
default:
LogUtils.error(ce, "Multiple " + NavigatorConstants.ENABLED_WHEN_TAG
+ " sub-elements not supported. Ignored.");
break;
}
getDescriptors().add(descriptor);
} else if (NavigatorConstants.PREFERENCE_MODEL_TYPE_TAG.equals(elementName)) {
getPreferenceModelTypes().add(new CEObjectHolder<EObject>(ce, NavigatorConstants.MODEL_TYPE_TAG));
} else {
LogUtils.error(ce, "Unknown element name: '" + elementName + "'"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
/**
* Reads the current preferences and updates the defaults
*/
public void preferenceReader() {
final IPreferenceStore ps = Activator.getDefault().getPreferenceStore();
/*
* Setup defaults
*/
ps.setDefault(NavigatorConstants.PREF_USE_GENERIC_EDITOR_PART_FALLBACK,
NavigatorManagerImpl.USE_GENERIC_EDITOR_PART_FALLBACK_EDEFAULT);
ps.setDefault(NavigatorConstants.PREF_OPEN_MUST_OPEN_NEW, NavigatorManagerImpl.OPEN_MUST_OPEN_NEW_EDEFAULT);
ps.setDefault(NavigatorConstants.PREF_PIN_EDITOR_BY_DEFAULT,
NavigatorManagerImpl.PIN_EDITOR_BY_DEFAULT_EDEFAULT);
for (final CEObjectHolder<EObject> pmt : getPreferenceModelTypes()) {
final Class<EObject> objectClass = pmt.getObjectClass();
if (objectClass == null) {
continue;
}
final IEditorInformation mt = getEditorInformation(objectClass);
if (mt == null) {
LogUtils.error(pmt.getConfigurationElement(),
"Preference model type does not have editor information. Ignored.");
continue;
}
ps.setDefault(mt.getModelType(), mt.getEditors().get(0).getId());
}
/**
* Monitor changes
*/
ps.addPropertyChangeListener(myPreferenceListener);
myPreferenceListener.propertyChange(null);
}
private final IPropertyChangeListener myPreferenceListener = new IPropertyChangeListener() {
final IPreferenceStore ps = Activator.getDefault().getPreferenceStore();
@Override
public void propertyChange(PropertyChangeEvent event) {
boolean b = ps.getBoolean(NavigatorConstants.PREF_USE_GENERIC_EDITOR_PART_FALLBACK);
if (isUseGenericEditorPartFallback() != b) {
setUseGenericEditorPartFallback(b);
}
b = ps.getBoolean(NavigatorConstants.PREF_OPEN_MUST_OPEN_NEW);
if (isOpenMustOpenNew() != b) {
setOpenMustOpenNew(b);
}
b = ps.getBoolean(NavigatorConstants.PREF_PIN_EDITOR_BY_DEFAULT);
if (isPinEditorByDefault() != b) {
setPinEditorByDefault(b);
}
for (final CEObjectHolder<EObject> pmt : getPreferenceModelTypes()) {
final Class<EObject> objectClass = pmt.getObjectClass();
if (objectClass == null) {
continue;
}
final IEditorInformation mt = getEditorInformation(objectClass);
if (mt == null) {
LogUtils.error(pmt.getConfigurationElement(),
"Preference model type does not have editor information. Ignored.");
continue;
}
/*
* Find the current preference - possibly the default we just set in
* preferenceReader...
*/
setCurrentPreferenceValue(mt);
}
}
};
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
protected EClass eStaticClass() {
return INavigatorModelPackage.Literals.NAVIGATOR_MANAGER;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public EList<INavigatorDescriptor> getNavigators() {
if (navigators == null) {
navigators = new EObjectContainmentEList<INavigatorDescriptor>(INavigatorDescriptor.class, this,
INavigatorModelPackage.NAVIGATOR_MANAGER__NAVIGATORS);
}
return navigators;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public EList<IEditorPartDescriptor> getDescriptors() {
if (descriptors == null) {
descriptors = new EObjectContainmentEList<IEditorPartDescriptor>(IEditorPartDescriptor.class, this,
INavigatorModelPackage.NAVIGATOR_MANAGER__DESCRIPTORS);
}
return descriptors;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public EList<IEditorInformation> getEditorInformations() {
if (editorInformations == null) {
editorInformations = new EObjectContainmentEList<IEditorInformation>(IEditorInformation.class, this,
INavigatorModelPackage.NAVIGATOR_MANAGER__EDITOR_INFORMATIONS);
}
return editorInformations;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public boolean isUseGenericEditorPartFallback() {
return useGenericEditorPartFallback;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public void setUseGenericEditorPartFallback(boolean newUseGenericEditorPartFallback) {
setUseGenericEditorPartFallbackGen(newUseGenericEditorPartFallback);
Activator.getDefault().getPreferenceStore()
.setValue(NavigatorConstants.PREF_USE_GENERIC_EDITOR_PART_FALLBACK, newUseGenericEditorPartFallback);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
public void setUseGenericEditorPartFallbackGen(boolean newUseGenericEditorPartFallback) {
final boolean oldUseGenericEditorPartFallback = useGenericEditorPartFallback;
useGenericEditorPartFallback = newUseGenericEditorPartFallback;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET,
INavigatorModelPackage.NAVIGATOR_MANAGER__USE_GENERIC_EDITOR_PART_FALLBACK,
oldUseGenericEditorPartFallback, useGenericEditorPartFallback));
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public boolean isPinEditorByDefault() {
return pinEditorByDefault;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public void setPinEditorByDefault(boolean newPinEditorByDefault) {
setPinEditorByDefaultGen(newPinEditorByDefault);
Activator.getDefault().getPreferenceStore()
.setValue(NavigatorConstants.PREF_PIN_EDITOR_BY_DEFAULT, newPinEditorByDefault);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
public void setPinEditorByDefaultGen(boolean newPinEditorByDefault) {
final boolean oldPinEditorByDefault = pinEditorByDefault;
pinEditorByDefault = newPinEditorByDefault;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET,
INavigatorModelPackage.NAVIGATOR_MANAGER__PIN_EDITOR_BY_DEFAULT, oldPinEditorByDefault,
pinEditorByDefault));
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public boolean isOpenMustOpenNew() {
return openMustOpenNew;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public void setOpenMustOpenNew(boolean newOpenMustOpenNew) {
setOpenMustOpenNewGen(newOpenMustOpenNew);
Activator.getDefault().getPreferenceStore()
.setValue(NavigatorConstants.PREF_OPEN_MUST_OPEN_NEW, newOpenMustOpenNew);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
public void setOpenMustOpenNewGen(boolean newOpenMustOpenNew) {
final boolean oldOpenMustOpenNew = openMustOpenNew;
openMustOpenNew = newOpenMustOpenNew;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET,
INavigatorModelPackage.NAVIGATOR_MANAGER__OPEN_MUST_OPEN_NEW, oldOpenMustOpenNew, openMustOpenNew));
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public EList<CEObjectHolder<EObject>> getPreferenceModelTypes() {
if (preferenceModelTypes == null) {
preferenceModelTypes = new EDataTypeUniqueEList<CEObjectHolder<EObject>>(CEObjectHolder.class, this,
INavigatorModelPackage.NAVIGATOR_MANAGER__PREFERENCE_MODEL_TYPES);
}
return preferenceModelTypes;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case INavigatorModelPackage.NAVIGATOR_MANAGER__NAVIGATORS:
return ((InternalEList<?>) getNavigators()).basicRemove(otherEnd, msgs);
case INavigatorModelPackage.NAVIGATOR_MANAGER__DESCRIPTORS:
return ((InternalEList<?>) getDescriptors()).basicRemove(otherEnd, msgs);
case INavigatorModelPackage.NAVIGATOR_MANAGER__EDITOR_INFORMATIONS:
return ((InternalEList<?>) getEditorInformations()).basicRemove(otherEnd, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case INavigatorModelPackage.NAVIGATOR_MANAGER__NAVIGATORS:
return getNavigators();
case INavigatorModelPackage.NAVIGATOR_MANAGER__DESCRIPTORS:
return getDescriptors();
case INavigatorModelPackage.NAVIGATOR_MANAGER__EDITOR_INFORMATIONS:
return getEditorInformations();
case INavigatorModelPackage.NAVIGATOR_MANAGER__USE_GENERIC_EDITOR_PART_FALLBACK:
return isUseGenericEditorPartFallback();
case INavigatorModelPackage.NAVIGATOR_MANAGER__PIN_EDITOR_BY_DEFAULT:
return isPinEditorByDefault();
case INavigatorModelPackage.NAVIGATOR_MANAGER__OPEN_MUST_OPEN_NEW:
return isOpenMustOpenNew();
case INavigatorModelPackage.NAVIGATOR_MANAGER__PREFERENCE_MODEL_TYPES:
return getPreferenceModelTypes();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case INavigatorModelPackage.NAVIGATOR_MANAGER__NAVIGATORS:
getNavigators().clear();
getNavigators().addAll((Collection<? extends INavigatorDescriptor>) newValue);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__DESCRIPTORS:
getDescriptors().clear();
getDescriptors().addAll((Collection<? extends IEditorPartDescriptor>) newValue);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__EDITOR_INFORMATIONS:
getEditorInformations().clear();
getEditorInformations().addAll((Collection<? extends IEditorInformation>) newValue);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__USE_GENERIC_EDITOR_PART_FALLBACK:
setUseGenericEditorPartFallback((Boolean) newValue);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__PIN_EDITOR_BY_DEFAULT:
setPinEditorByDefault((Boolean) newValue);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__OPEN_MUST_OPEN_NEW:
setOpenMustOpenNew((Boolean) newValue);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__PREFERENCE_MODEL_TYPES:
getPreferenceModelTypes().clear();
getPreferenceModelTypes().addAll((Collection<? extends CEObjectHolder<EObject>>) newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case INavigatorModelPackage.NAVIGATOR_MANAGER__NAVIGATORS:
getNavigators().clear();
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__DESCRIPTORS:
getDescriptors().clear();
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__EDITOR_INFORMATIONS:
getEditorInformations().clear();
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__USE_GENERIC_EDITOR_PART_FALLBACK:
setUseGenericEditorPartFallback(USE_GENERIC_EDITOR_PART_FALLBACK_EDEFAULT);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__PIN_EDITOR_BY_DEFAULT:
setPinEditorByDefault(PIN_EDITOR_BY_DEFAULT_EDEFAULT);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__OPEN_MUST_OPEN_NEW:
setOpenMustOpenNew(OPEN_MUST_OPEN_NEW_EDEFAULT);
return;
case INavigatorModelPackage.NAVIGATOR_MANAGER__PREFERENCE_MODEL_TYPES:
getPreferenceModelTypes().clear();
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case INavigatorModelPackage.NAVIGATOR_MANAGER__NAVIGATORS:
return navigators != null && !navigators.isEmpty();
case INavigatorModelPackage.NAVIGATOR_MANAGER__DESCRIPTORS:
return descriptors != null && !descriptors.isEmpty();
case INavigatorModelPackage.NAVIGATOR_MANAGER__EDITOR_INFORMATIONS:
return editorInformations != null && !editorInformations.isEmpty();
case INavigatorModelPackage.NAVIGATOR_MANAGER__USE_GENERIC_EDITOR_PART_FALLBACK:
return useGenericEditorPartFallback != USE_GENERIC_EDITOR_PART_FALLBACK_EDEFAULT;
case INavigatorModelPackage.NAVIGATOR_MANAGER__PIN_EDITOR_BY_DEFAULT:
return pinEditorByDefault != PIN_EDITOR_BY_DEFAULT_EDEFAULT;
case INavigatorModelPackage.NAVIGATOR_MANAGER__OPEN_MUST_OPEN_NEW:
return openMustOpenNew != OPEN_MUST_OPEN_NEW_EDEFAULT;
case INavigatorModelPackage.NAVIGATOR_MANAGER__PREFERENCE_MODEL_TYPES:
return preferenceModelTypes != null && !preferenceModelTypes.isEmpty();
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public String toString() {
if (eIsProxy()) return super.toString();
final StringBuffer result = new StringBuffer(super.toString());
result.append(" (useGenericEditorPartFallback: ");
result.append(useGenericEditorPartFallback);
result.append(", pinEditorByDefault: ");
result.append(pinEditorByDefault);
result.append(", openMustOpenNew: ");
result.append(openMustOpenNew);
result.append(", preferenceModelTypes: ");
result.append(preferenceModelTypes);
result.append(')');
return result.toString();
}
/**
* Secondary of next editor
*/
private int myNextSecondaryId = 0;;
@Override
public IEditorPartView openView(EObject obj, boolean forceNewEditor) {
IGlobalNavigationManager.Factory.addLocation();
if (!forceNewEditor) {
final Collection<IEditorPartView> views = getAllViews();
/*
* Look for a perfect match
*/
for (final IEditorPartView v : views) {
if (v.getCurrentObject() == obj) {
/*
* This might change the view
*/
v.setCurrentObject(obj);
v.activateView();
return v;
}
}
/*
* Look for an un-pinned view
*/
for (final IEditorPartView v : views) {
if (!v.isPinned()) {
v.setCurrentObject(obj);
v.activateView();
return v;
}
}
}
/*
* Create a new view
*/
IViewPart view = null;
try {
view = PlatformUI
.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage()
.showView(NavigatorConstants.EDITOR_VIEW_ID, "" + myNextSecondaryId++, IWorkbenchPage.VIEW_ACTIVATE);
} catch (final PartInitException ex) {
LogUtils.error(this, ex);
return null;
}
if (!(view instanceof IEditorPartView)) {
LogUtils.error(view, "Part has ID " + NavigatorConstants.EDITOR_VIEW_ID + " but is not a IEditorPartView");
return null;
}
final IEditorPartView v = (IEditorPartView) view;
v.setCurrentObject(obj);
return v;
}
@Override
public Collection<IEditorPartView> getAllViews() {
final Collection<IEditorPartView> views = new ArrayList<IEditorPartView>();
final IWorkbenchWindow ww = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
for (final IViewReference ref : ww.getActivePage().getViewReferences()) {
if (!ref.getId().equals(NavigatorConstants.EDITOR_VIEW_ID)) {
continue;
}
final IWorkbenchPart part = ref.getPart(false);
if (!(part instanceof IEditorPartView)) {
LogUtils.error(part, "Part has ID " + NavigatorConstants.EDITOR_VIEW_ID
+ " but is not a IEditorPartView");
continue;
}
views.add((IEditorPartView) part);
}
return views;
}
@Override
public void closeAllViews() {
for (final IEditorPartView v : getAllViews()) {
final IViewPart p = (IViewPart) v;
p.getSite().getPage().hideView(p);
}
}
@Override
public void closeView(IEditorPartView view) {
final IViewPart p = (IViewPart) view;
p.getSite().getPage().hideView(p);
}
/**
* Finds the current preference value and sets the default editor.
*
* @param ei the model type to set the default editor for
*/
protected void setCurrentPreferenceValue(final IEditorInformation ei) {
final IPreferenceStore ps = Activator.getDefault().getPreferenceStore();
String key = ei.getModelType();
if (key == null) {
key = ei.getTreeItemID();
}
final String id = ps.getString(key);
IEditorPartDescriptor pref = null;
/*
* Try to lookup the editor id
*/
for (final IEditorPartDescriptor e : ei.getEditors()) {
if (e.getId().equals(id)) {
pref = e;
break;
}
}
/*
* Use the default (the editor with the highest priority)
*/
if (pref == null && (id == null || id.length() == 0)) {
pref = ei.getEditors().get(0);
}
if (pref == null) {
/*
* The preference was not found. Can happen if a newer version of the application does
* not support the editor any more... or if somebody have changed the id by mistake.
*/
LogUtils.error(this, "Preference not found for " + key + ": '" + id + "'. Reset to default.");
pref = ei.getEditors().get(0);
}
if (pref != ei.getPreferredEditor()) {
ei.setPreferredEditor(pref);
}
}
} // NavigatorManagerImpl