/**
* <copyright>
*
* Copyright (c) 2010-2016 Thales Global Services S.A.S.
* 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:
* Thales Global Services S.A.S. - initial API and implementation
*
* </copyright>
*/
package org.eclipse.emf.diffmerge.ui;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.compare.CompareUI;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.emf.common.util.Logger;
import org.eclipse.emf.diffmerge.api.Role;
import org.eclipse.emf.diffmerge.ui.diffuidata.DiffuidataPackage;
import org.eclipse.emf.diffmerge.ui.log.DiffMergeLogger;
import org.eclipse.emf.diffmerge.ui.setup.ComparisonSetupManager;
import org.eclipse.emf.diffmerge.ui.util.DifferenceKind;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
/**
* The activator for this plug-in.
* @author Olivier Constant
*/
public class EMFDiffMergeUIPlugin extends AbstractUIPlugin {
/** The default file extension for UI diff models */
public static final String UI_DIFF_DATA_FILE_EXTENSION = DiffuidataPackage.eNAME;
/** Identifiers for UI images */
@SuppressWarnings("javadoc")
public static enum ImageID {
CHECKED, CHECKED_DISABLED, CHECKIN_ACTION, CHECKOUT_ACTION, COLLAPSEALL, CONFLICT_STAT, DELETE,
DOWN, EMPTY, EXPANDALL, FILTER, INC_STAT, INC_ADD_STAT, INC_REM_STAT, LEFT, LOCK, LOCK_CLOSED,
LOCK_OPEN, MODIFIED_STAT, NEXT_CHANGE_NAV, NEXT_DIFF_NAV, OUT_STAT, OUT_ADD_STAT, OUT_REM_STAT,
PLUS, PREV_CHANGE_NAV, PREV_DIFF_NAV, REDO, RIGHT, SHOW, SORT, SWAP, SYNCED, TREE, UNCHECKED,
UNCHECKED_DISABLED, UNDO, UP, VIEW_MENU, WARNING }
/** Identifiers for colors according to the side to which a difference presence is relative */
@SuppressWarnings("javadoc")
public static enum DifferenceColorKind {
LEFT, RIGHT, BOTH, NONE,
CONFLICT, DEFAULT
}
/** The local path to icons */
private static final String ICON_PATH = "icons/full/"; //$NON-NLS-1$
/** A label for dialogs */
public static final String LABEL = Messages.EMFDiffMergeUIPlugin_Label;
/** The shared instance */
private static EMFDiffMergeUIPlugin __plugin;
/** The manager for comparison contexts */
private final ComparisonSetupManager _comparisonSetupManager;
/** The logger for diff/merge events */
private final DiffMergeLogger _diffMergeLogger;
/** A symbolic representation of the virtual ownership feature */
private final EReference _ownershipFeature;
/** The "very dark gray" non-system color (initially null) */
private Color _veryDarkGray;
/** A label provider based on the registered .edit plugins (initially null) */
private AdapterFactoryLabelProvider _composedAdapterFactoryLabelProvider;
/**
* Constructor
*/
public EMFDiffMergeUIPlugin() {
_diffMergeLogger = new DiffMergeLogger();
_comparisonSetupManager = new ComparisonSetupManager();
_ownershipFeature = EcoreFactory.eINSTANCE.createEReference();
_ownershipFeature.setName("container"); //$NON-NLS-1$
_ownershipFeature.setEType(EcorePackage.eINSTANCE.getEObject());
_ownershipFeature.setLowerBound(0);
_ownershipFeature.setUpperBound(1);
_veryDarkGray = null;
_composedAdapterFactoryLabelProvider = null;
}
/**
* Return a label provider based on the registered .edit plugins
* @return a non-null object
*/
public AdapterFactoryLabelProvider getAdapterFactoryLabelProvider() {
if (_composedAdapterFactoryLabelProvider == null)
_composedAdapterFactoryLabelProvider = new AdapterFactoryLabelProvider(
new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE));
return _composedAdapterFactoryLabelProvider;
}
/**
* Return the shared instance of this activator
* @return a non-null object
*/
public static EMFDiffMergeUIPlugin getDefault() {
return __plugin;
}
/**
* Return the default role for the left-hand side in a comparison
* @return a non-null role which is TARGET or REFERENCE
*/
public Role getDefaultLeftRole() {
return Role.TARGET;
}
/**
* Return the color kind that corresponds to the given difference kind
* @param originKind_p a potentially null difference kind
* @return a non-null color kind
*/
public DifferenceColorKind getDifferenceColorKind(DifferenceKind originKind_p) {
DifferenceColorKind result;
if (originKind_p == null) {
result = DifferenceColorKind.DEFAULT;
} else {
switch (originKind_p) {
case NONE:
result = DifferenceColorKind.NONE; break;
case CONFLICT:
result = DifferenceColorKind.CONFLICT; break;
case MODIFIED: case FROM_LEFT: case FROM_RIGHT: case FROM_BOTH:
result = DifferenceColorKind.BOTH; break;
case FROM_LEFT_ADD: case FROM_RIGHT_DEL:
result = DifferenceColorKind.LEFT; break;
case FROM_RIGHT_ADD: case FROM_LEFT_DEL:
result = DifferenceColorKind.RIGHT; break;
default:
result = DifferenceColorKind.DEFAULT; break;
}
}
return result;
}
/**
* Return the image ID that corresponds to the given difference origin kind
* @param originKind_p a non-null difference origin kind
* @return a potentially null image ID
*/
public ImageID getDifferenceOverlay(DifferenceKind originKind_p) {
ImageID result;
switch (originKind_p) {
case FROM_LEFT:
result = ImageID.OUT_STAT; break;
case FROM_LEFT_ADD:
result = ImageID.OUT_ADD_STAT; break;
case FROM_LEFT_DEL:
result = ImageID.OUT_REM_STAT; break;
case FROM_RIGHT:
result = ImageID.INC_STAT; break;
case FROM_RIGHT_ADD:
result = ImageID.INC_ADD_STAT; break;
case FROM_RIGHT_DEL:
result = ImageID.INC_REM_STAT; break;
case MODIFIED:
case FROM_BOTH:
result = ImageID.MODIFIED_STAT; break;
case CONFLICT:
result = ImageID.CONFLICT_STAT; break;
default:
result = null; break;
}
return result;
}
/**
* Return the prefix that corresponds to the given difference kind
* @param originKind_p a non-null difference origin kind
* @return a non-null string
*/
public String getDifferencePrefix(DifferenceKind originKind_p) {
String result;
switch (originKind_p) {
case FROM_LEFT:
result = "|> "; break; //$NON-NLS-1$
case FROM_LEFT_ADD:
result = "+> "; break; //$NON-NLS-1$
case FROM_LEFT_DEL:
result = "-> "; break; //$NON-NLS-1$
case FROM_RIGHT:
result = "<| "; break; //$NON-NLS-1$
case FROM_RIGHT_ADD:
result = "<+ "; break; //$NON-NLS-1$
case FROM_RIGHT_DEL:
result = "<- "; break; //$NON-NLS-1$
case CONFLICT:
result = "! "; break; //$NON-NLS-1$
case FROM_BOTH:
result = "<> "; break; //$NON-NLS-1$
case MODIFIED:
result = ">< "; break; //$NON-NLS-1$
default:
result = ""; break; //$NON-NLS-1$
}
return result;
}
/**
* Return the logger for diff/merge events
* @return a non-null logger
*/
public Logger getDiffMergeLogger() {
return _diffMergeLogger;
}
/**
* Return the image of the given ID
* @param id_p a non-null image ID
* @return a (normally) non-null image
*/
public Image getImage(ImageID id_p) {
Image result = null;
switch (id_p) {
case DELETE:
result = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_TOOL_DELETE);
break;
case LEFT:
result = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_TOOL_BACK);
break;
case REDO:
result = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_TOOL_REDO);
break;
case RIGHT:
result = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_TOOL_FORWARD);
break;
case SHOW:
result = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJS_INFO_TSK);
break;
case UNDO:
result = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_TOOL_UNDO);
break;
case WARNING:
result = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJS_WARN_TSK);
break;
default:
result = getImageRegistry().get(id_p.name());
}
return result;
}
/**
* Return the image descriptor of the given ID
* @param id_p a non-null image ID
* @return a (normally) non-null image
*/
public ImageDescriptor getImageDescriptor(ImageID id_p) {
ImageDescriptor result = null;
switch (id_p) {
case DELETE:
result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_TOOL_DELETE);
break;
case LEFT:
result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_TOOL_BACK);
break;
case REDO:
result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_TOOL_REDO);
break;
case RIGHT:
result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_TOOL_FORWARD);
break;
case SHOW:
result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_OBJS_INFO_TSK);
break;
case UNDO:
result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_TOOL_UNDO);
break;
case WARNING:
result = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
ISharedImages.IMG_OBJS_WARN_TSK);
break;
default:
result = getImageRegistry().getDescriptor(id_p.name());
}
return result;
}
/**
* Return a symbolic reference that represents the virtual "ownership" feature
* @return a non-null EReference
*/
public EReference getOwnershipFeature() {
return _ownershipFeature;
}
/**
* Return the plug-in ID according to MANIFEST.MF
* @return a non-null String
*/
public String getPluginId() {
return getBundle().getSymbolicName();
}
/**
* Return the comparison setup manager
* @return a non-null object
*/
public ComparisonSetupManager getSetupManager() {
return _comparisonSetupManager;
}
/**
* Return the "very dark gray" non-system color
* @return a non-null color
*/
public Color getVeryDarkGray() {
if (_veryDarkGray == null)
_veryDarkGray = new Color(Display.getDefault(), 75, 75, 75);
return _veryDarkGray;
}
/**
* @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry)
*/
@Override
protected void initializeImageRegistry(ImageRegistry reg_p) {
super.initializeImageRegistry(reg_p);
reg_p.put(ImageID.UP.name(), CompareUI.DESC_CTOOL_PREV);
reg_p.put(ImageID.DOWN.name(), CompareUI.DESC_CTOOL_NEXT);
Set<ImageID> toRegister = new HashSet<EMFDiffMergeUIPlugin.ImageID>(
Arrays.asList(ImageID.values()));
toRegister.removeAll(Arrays.asList(new ImageID[] {
ImageID.DELETE, ImageID.LEFT, ImageID.REDO, ImageID.RIGHT, ImageID.SHOW,
ImageID.UNDO, ImageID.DOWN, ImageID.UP, ImageID.WARNING}));
for (ImageID imageId : toRegister)
registerLocalIcon(imageId, reg_p);
}
/**
* Register and return the image descriptor obtained from the given ID of a local icon
* @param imageID_p a non-null image ID
* @param reg_p the non-null image registry in which to register
* @return a potentially null image descriptor
*/
private ImageDescriptor registerLocalIcon(ImageID imageID_p, ImageRegistry reg_p) {
ImageDescriptor result = null;
String path = ICON_PATH + imageID_p.name().toLowerCase() + ".gif"; //$NON-NLS-1$
try {
result = ImageDescriptor.createFromURL(FileLocator.toFileURL(
getBundle().getEntry(path)));
} catch (IOException e) {
// Nothing needed
}
if (result != null)
reg_p.put(imageID_p.name(), result);
return result;
}
/**
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
*/
@Override
public void start(BundleContext context_p) throws Exception {
super.start(context_p);
__plugin = this;
}
/**
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
*/
@Override
public void stop(BundleContext context_p) throws Exception {
_diffMergeLogger.close();
if (_veryDarkGray != null)
_veryDarkGray.dispose();
if (_composedAdapterFactoryLabelProvider != null)
_composedAdapterFactoryLabelProvider.dispose();
__plugin = null;
super.stop(context_p);
}
}