/**
* <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.util;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.diffmerge.ui.EMFDiffMergeUIPlugin;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.ReflectiveItemProvider;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
/**
* Utility class for UI-related issues.
* @author Olivier Constant
*/
public final class UIUtil {
/**
* Constructor
*/
private UIUtil() {
//Forbid instantiation
}
/**
* Create and return a composite within the given one with default characteristics
* @param parent_p a non-null composite
* @return a non-null composite
*/
public static Composite createComposite(Composite parent_p) {
Composite result = new Composite(parent_p, SWT.BORDER);
GridLayout layout = new GridLayout(1, true);
layout.marginHeight = 0;
layout.marginWidth = 0;
result.setLayout(layout);
return result;
}
/**
* Create a tool item in the given toolbar which displays a drop-down menu
* @param toolbar_p a non-null tool bar
* @return the non-null menu
*/
public static Menu createMenuTool(ToolBar toolbar_p) {
ToolItem menuTool = new ToolItem(toolbar_p, SWT.PUSH);
menuTool.setImage(EMFDiffMergeUIPlugin.getDefault().getImage(
EMFDiffMergeUIPlugin.ImageID.VIEW_MENU));
final Menu result = new Menu(toolbar_p.getShell());
menuTool.addSelectionListener(new SelectionAdapter() {
/**
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent event) {
ToolItem item = (ToolItem) event.widget;
Rectangle rect = item.getBounds();
Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y));
result.setLocation(pt.x, pt.y + rect.height);
result.setVisible(true);
}
});
menuTool.addDisposeListener(new DisposeListener() {
/**
* @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
*/
public void widgetDisposed(DisposeEvent e) {
result.dispose();
}
});
return result;
}
/**
* Create and return a tool bar within the given composite with default characteristics
* @param parent_p a non-null composite
* @return a non-null tool bar
*/
public static ToolBar createToolBar(Composite parent_p) {
ToolBar result = new ToolBar(parent_p, SWT.HORIZONTAL | SWT.RIGHT);
GridData data = new GridData(SWT.RIGHT, SWT.TOP, false, false);
result.setData(data);
return result;
}
/**
* Return the bold variant of the given font
* @param font_p a non-null font
* @return a non-null font
*/
public static Font getBold(Font font_p) {
FontData data = font_p.getFontData()[0];
Font result = JFaceResources.getFontRegistry().getBold(data.getName());
return result;
}
/**
* Return the color corresponding to the given code
* @param code_p one of the SWT.COLOR_... constants
* @return a non-null color (black by default)
*/
public static final Color getColor(int code_p) {
return Display.getDefault().getSystemColor(code_p);
}
/**
* Return an image for the given element solely based on EMF mechanisms
* @param element_p a non-null object
* @return a potentially null image
*/
public static Image getEMFImage(Object element_p) {
Image result =
EMFDiffMergeUIPlugin.getDefault().getAdapterFactoryLabelProvider().getImage(element_p);
if (result == null) {
// Try editing domain
EditingDomain rawEditingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(element_p);
if (rawEditingDomain == null)
rawEditingDomain = TransactionUtil.getEditingDomain(element_p);
if (rawEditingDomain instanceof AdapterFactoryEditingDomain) {
AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain)rawEditingDomain;
IItemLabelProvider provider = (IItemLabelProvider)editingDomain.getAdapterFactory().adapt(
element_p, IItemLabelProvider.class);
if (provider != null) {
Object rawImage = provider.getImage(element_p);
if (rawImage != null)
result = ExtendedImageRegistry.getInstance().getImage(rawImage);
}
}
}
return result;
}
/**
* Return a label for the given element solely based on EMF mechanisms (editing domain, .edit plugins)
* @param element_p a potentially null object
* @return a potentially null string
*/
public static String getEMFText(Object element_p) {
String result =
EMFDiffMergeUIPlugin.getDefault().getAdapterFactoryLabelProvider().getText(element_p);
if (result == null) {
// Try editing domain
EditingDomain rawEditingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(element_p);
if (rawEditingDomain == null)
rawEditingDomain = TransactionUtil.getEditingDomain(element_p);
if (rawEditingDomain instanceof AdapterFactoryEditingDomain) {
AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain)rawEditingDomain;
IItemLabelProvider provider = (IItemLabelProvider)editingDomain.getAdapterFactory().adapt(
element_p, IItemLabelProvider.class);
if (provider != null)
result = provider.getText(element_p);
}
}
return result;
}
/**
* Return a formatted label for the given feature
* @param feature_p a non-null feature
* @return a non-null string
*/
public static String getFormattedFeatureText(EStructuralFeature feature_p) {
return FormattedTextProvider.getInstance().getFeatureText(feature_p);
}
/**
* Return a formatted label for the type of the given element
* @param element_p a non-null element
* @return a non-null string
*/
public static String getFormattedTypeText(EObject element_p) {
return FormattedTextProvider.getInstance().getTypeText(element_p);
}
/**
* Return the italic variant of the given font
* @param font_p a non-null font
* @return a non-null font
*/
public static Font getItalic(Font font_p) {
FontData data = font_p.getFontData()[0];
Font result = JFaceResources.getFontRegistry().getItalic(data.getName());
return result;
}
/**
* Return a UI variant of the given representation of an URI
* @param uri_p a potentially null string
* @return a string which is null iff uri_p is null
*/
public static String simplifyURI(String uri_p) {
String result = uri_p;
if (result != null) {
result = result.replaceAll("/resource/", ""); //$NON-NLS-1$ //$NON-NLS-2$
result = result.replaceAll("%20", " "); //$NON-NLS-1$ //$NON-NLS-2$
}
return result;
}
/**
* Return a UI variant of the representation of the given URI
* @param uri_p a potentially null URI
* @return a string which is null iff uri_p is null
*/
public static String simplifyURI(URI uri_p) {
String result = null;
if (uri_p != null)
result = simplifyURI(uri_p.path());
return result;
}
/**
* Convert the given list of elements to a TreePath
* @param path_p a non-null, potentially empty list
* @return a non-null tree path
*/
public static TreePath toTreePath(List<?> path_p) {
return new TreePath(path_p.toArray());
}
/**
* Convert the given list of [paths as lists] to an array of TreePaths
* @param paths_p a non-null, potentially empty list
* @return a non-null array of tree paths
*/
public static TreePath[] toTreePaths(List<? extends List<?>> paths_p) {
List<TreePath> result = new ArrayList<TreePath>(paths_p.size());
for (List<?> path : paths_p)
result.add(toTreePath(path));
return result.toArray(new TreePath[result.size()]);
}
/**
* A comparator based on labels of objects
*/
public static class LabelBasedComparator implements Comparator<Object> {
/** The label provider whose labels define the ordering */
private final ILabelProvider _labelProvider;
/**
* Constructor
* @param labelProvider_p the non-null label provider whose labels define the ordering
*/
public LabelBasedComparator(ILabelProvider labelProvider_p) {
_labelProvider = labelProvider_p;
}
/**
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object o1_p, Object o2_p) {
String label1 = _labelProvider.getText(o1_p);
if (label1 == null) label1 = o1_p.toString();
String label2 = _labelProvider.getText(o2_p);
if (label2 == null) label2 = o2_p.toString();
return label1.compareTo(label2);
}
}
/**
* A provider for feature and type labels.
*/
protected static class FormattedTextProvider extends ReflectiveItemProvider {
/** The singleton instance */
protected static FormattedTextProvider __instance = null;
/**
* Constructor
*/
protected FormattedTextProvider() {
super(null); // OK with its current usage
}
/**
* @see org.eclipse.emf.edit.provider.ReflectiveItemProvider#getFeatureText(java.lang.Object)
*/
@Override
public String getFeatureText(Object feature_p) {
// Increases visibility
return super.getFeatureText(feature_p);
}
/**
* @see org.eclipse.emf.edit.provider.ReflectiveItemProvider#getTypeText(java.lang.Object)
*/
@Override
public String getTypeText(Object object_p) {
// Increases visibility
return super.getTypeText(object_p);
}
/**
* Return the singleton instance
* @return a non-null object
*/
public static FormattedTextProvider getInstance() {
if (__instance == null)
__instance = new FormattedTextProvider();
return __instance;
}
}
}