/*****************************************************************************
* Copyright (c) 2010 CEA LIST.
*
*
* 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:
* Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
* Emilien Perico (Atos Origin) emilien.perico@atosorigin.com - Initial API and implementation
* Amine EL KOUHEN (CEA LIST/LIFL) - Added the decorator Factory
*****************************************************************************/
package kr.co.apexsoft.stella.modeler.explorer.provider;
import kr.co.apexsoft.stella.modeler.explorer.Activator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.facet.infra.browser.uicore.CustomizableModelLabelProvider;
import org.eclipse.emf.facet.infra.browser.uicore.internal.model.ModelElementItem;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.papyrus.editor.PapyrusMultiDiagramEditor;
import org.eclipse.papyrus.infra.core.editorsfactory.IPageIconsRegistry;
import org.eclipse.papyrus.infra.core.editorsfactory.PageIconsRegistry;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
import org.eclipse.papyrus.infra.onefile.utils.OneFileUtils;
import org.eclipse.papyrus.infra.services.decoration.DecorationService;
import org.eclipse.papyrus.infra.services.decoration.util.Decoration;
import org.eclipse.papyrus.infra.services.decoration.util.IPapyrusDecoration;
import org.eclipse.papyrus.views.modelexplorer.Messages;
import org.eclipse.papyrus.views.modelexplorer.core.ui.pagebookview.ModelExplorerDecorationAdapter;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.uml2.uml.Model;
/**
* the label provider that inherits of modisco label provider.
*/
public class ApexUMLLabelProvider extends CustomizableModelLabelProvider {
//public class ApexMoDiscoLabelProvider extends MoDiscoLabelProvider {
/** icon registry. */
private IPageIconsRegistry editorRegistry = null;
/** Decoration Service *. */
private DecorationService decorationService = null;
/** ServicesRegistry */
private ServicesRegistry servicesRegistry = null;
/**
* Creates a new ApexUMLLabelProvider.
*/
public ApexUMLLabelProvider() {
super(Activator.getDefault().getCustomizationManager());
servicesRegistry = getServicesRegistry();
decorationService = getDecorationService();
}
private DecorationService getDecorationService() {
DecorationService result = null;
if ( decorationService != null ) {
result = decorationService;
} else {
try {
servicesRegistry = getServicesRegistry();
if ( servicesRegistry != null ) {
result = getServicesRegistry().getService(DecorationService.class);
}
if ( result != null ) {
decorationService = result;
}
} catch (ServiceException e) {
Activator.log.error(e);
}
}
return result;
}
/**
* apex updated
* @return
*/
private ServicesRegistry getServicesRegistry() {
if ( servicesRegistry != null ) {
return servicesRegistry;
} else {
IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if ( editorPart != null && editorPart instanceof PapyrusMultiDiagramEditor ) {
servicesRegistry = ((PapyrusMultiDiagramEditor)editorPart).getServicesRegistry();
}
}
return servicesRegistry;
}
/**
* apex updated
*
* Returns the message of the marker for the specified element.
*
* @param element
* the element for which the marker message should be found
* @return the message of the marker for the specified element
*/
public String getMarkerMessage(Object element) {
String markerMessage = null;
decorationService = getDecorationService();
if (decorationService != null) {
EList<IPapyrusDecoration> decorations = decorationService.getDecorations(element, true);
markerMessage = Decoration.getMessageFromDecorations(decorations);
} else {
markerMessage = ""; //$NON-NLS-1$
}
return markerMessage;
}
/**
* apex updated
*
* return the image of an element in the model browser
* evaluates error markers.
*
* @param element
* the element
* @return the image
*/
@Override
public Image getImage(Object element) {
Image image = null;
ImageDescriptor imgDesc = null;
decorationService = getDecorationService();
if ( element instanceof IProject ) {
imgDesc = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"icons/windowImage-16.png"); //$NON-NLS-1$
image = imgDesc.createImage();
} else if ( element instanceof IFile ) {
IFile diFile = (IFile)element;
if(OneFileUtils.isDi(diFile)) {
imgDesc = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"icons/class_hi.gif"); //$NON-NLS-1$
image = imgDesc.createImage();
}
} else {
if ( decorationService != null ) {
// Get the Model Explorer Adapter
ModelExplorerDecorationAdapter adapter = new ModelExplorerDecorationAdapter(null);
//Set the decoration target
/**
* Useless since EMF Facet integration with bug 358732
*/
if(element instanceof Diagram) {
adapter.setDecoratorTarget(getEditorRegistry().getEditorIcon(element));
} else {
adapter.setDecoratorTarget(super.getImage(element));
}
//Set the adapter decoration with position as indicated by decoration (from decoration service)
if(element != null) {
if(element instanceof EObject || (element instanceof IAdaptable && ((IAdaptable)element).getAdapter(EObject.class) != null)) {
EList<IPapyrusDecoration> decorations = decorationService.getDecorations(element, true);
if(decorations != null) {
adapter.setDecorations(decorations);
}
}
}
//return the target decorated
image = adapter.getDecoratedImage();
} else {
imgDesc = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
"icons/errorwarning_tab.gif"); //$NON-NLS-1$
image = imgDesc.createImage();
}
}
return image;
}
/**
* Get the EditorRegistry used to create editor instances. This default
* implementation return the singleton eINSTANCE. This method can be
* subclassed to return another registry.
*
* @return the singleton eINSTANCE of editor registry
*/
protected IPageIconsRegistry getEditorRegistry() {
if(editorRegistry == null) {
editorRegistry = createEditorRegistry();
}
return editorRegistry;
}
/**
* Return the EditorRegistry for nested editor descriptors. Subclass should
* implements this method in order to return the registry associated to the
* extension point namespace.
*
* @return the EditorRegistry for nested editor descriptors
*/
protected IPageIconsRegistry createEditorRegistry() {
servicesRegistry = getServicesRegistry();
try {
return servicesRegistry.getService(IPageIconsRegistry.class);
} catch (ServiceException e) {
// Not found, return an empty one which return null for each
// request.
return new PageIconsRegistry();
}
}
/**
* {@inheritDoc}
*/
@Override
public String getText(Object element) {
String text = null;
if ( element instanceof IProject ) {
text = ((IProject) element).getName();
} else if (element instanceof IFile) {
IFile file = (IFile)element;
if(OneFileUtils.isDi(file)) {
String fileName = file.getName();
text = fileName.substring(0, fileName.lastIndexOf('.')); //$NON-NLS-1$
}
} else if(element instanceof Diagram) {
Diagram diagram = (Diagram)element;
text = diagram.getName();
} else if(element instanceof IAdaptable) {
EObject obj = (EObject)((IAdaptable)element).getAdapter(EObject.class);
if(obj instanceof InternalEObject && obj.eIsProxy()) {
InternalEObject internal = (InternalEObject)obj;
text = NLS.bind(Messages.MoDiscoLabelProvider_ProxyLabel, obj.getClass().getSimpleName(), internal.eProxyURI().trimFragment());
// Messages.MoDiscoLabelProvider_0 + + Messages.MoDiscoLabelProvider_1 + ;;
} else if ( element instanceof ModelElementItem ) {
ModelElementItem mItem = (ModelElementItem)element;
EObject eObj = mItem.getEObject();
if ( eObj instanceof Model ) {
return mItem.getName();
} else {
text = super.getText(element);
}
} else {
text = super.getText(element);
}
} else {
text = super.getText(element);
}
return text;
}
}