package com.quantum.util.versioning; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.eclipse.jface.action.IAction; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.ui.IKeyBindingService; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.actions.ExportResourcesAction; import org.eclipse.ui.actions.ImportResourcesAction; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.part.WorkbenchPart; /** * This class provides backward compatibility between versions of Eclipse for * known differences. * * @author BC */ public class VersioningHelper { public static final int ECLIPSE_VERSION_2_0_1 = 2049; public static final int ECLIPSE_VERSION_2_1_1 = 2135; public static final int ECLIPSE_VERSION_3_0_RC1 = 3054; public static final int ECLIPSE_VERSION_3_0_RC3 = 3061; /** * Set the font in a FontDialog. In Eclipse 2.1.1, the * setFontData() method was deprecated and an alternative * method, setFontList() was suggested in its place. * * @param fontDialog * @param fontData */ public static void setFont(FontDialog fontDialog, FontData[] fontData) { try { if (SWT.getVersion() >= ECLIPSE_VERSION_2_1_1) { Method method = fontDialog.getClass().getMethod( "setFontList", new Class[] { fontData.getClass()}); method.invoke(fontDialog, new Object[] {fontData}); } else if (fontData.length > 0) { Method method = fontDialog.getClass().getMethod( "setFontData", new Class[] { FontData.class }); method.invoke(fontDialog, new Object[] { fontData[0] }); } } catch (NoSuchMethodException e) { // should not happen } catch (IllegalArgumentException e) { // should not happen } catch (IllegalAccessException e) { // should not happen } catch (InvocationTargetException e) { // should not happen } } public static void setPartName(ViewPart viewPart, String partName) { try { if (SWT.getVersion() >= ECLIPSE_VERSION_3_0_RC1) { Method method = WorkbenchPart.class.getDeclaredMethod( "setPartName", new Class[] { String.class }); method.invoke(viewPart, new Object[] {partName}); } else { Method method = WorkbenchPart.class.getDeclaredMethod( "setTitle", new Class[] { FontData.class }); method.invoke(method, new Object[] { partName }); } } catch (NoSuchMethodException e) { // should not happen } catch (IllegalArgumentException e) { // should not happen } catch (IllegalAccessException e) { // should not happen } catch (InvocationTargetException e) { // should not happen } } public static ExportResourcesAction createExportResourcesAction(IWorkbenchWindow window) { ExportResourcesAction action = null; try { if (isEclipse21OrHigher()) { Constructor constructor = ExportResourcesAction.class.getConstructor( new Class[] { IWorkbenchWindow.class }); action = (ExportResourcesAction) constructor.newInstance( new Object[] { window }); } else { Constructor constructor = ExportResourcesAction.class.getConstructor( new Class[] { IWorkbench.class }); action = (ExportResourcesAction) constructor.newInstance( new Object[] { window.getWorkbench() }); } } catch (NoSuchMethodException e) { // should not happen } catch (IllegalArgumentException e) { // should not happen } catch (IllegalAccessException e) { // should not happen } catch (InvocationTargetException e) { // should not happen } catch (InstantiationException e) { // should not happen } return action; } public static ImportResourcesAction createImportResourcesAction(IWorkbenchWindow window) { ImportResourcesAction action = null; try { if (isEclipse21OrHigher()) { Constructor constructor = ImportResourcesAction.class.getConstructor( new Class[] { IWorkbenchWindow.class }); action = (ImportResourcesAction) constructor.newInstance( new Object[] { window }); } else { Constructor constructor = ImportResourcesAction.class.getConstructor( new Class[] { IWorkbench.class }); action = (ImportResourcesAction) constructor.newInstance( new Object[] { window.getWorkbench() }); } } catch (NoSuchMethodException e) { // should not happen } catch (IllegalArgumentException e) { // should not happen } catch (IllegalAccessException e) { // should not happen } catch (InvocationTargetException e) { // should not happen } catch (InstantiationException e) { // should not happen } return action; } public static void registerActionToKeyBindingService( IWorkbenchPartSite site, String[] scopes, IAction action) { try { if (isEclipse21OrHigher()) { Method method = IWorkbenchPartSite.class.getMethod( "getKeyBindingService", new Class[0]); IKeyBindingService service = (IKeyBindingService) method.invoke(site, null); method = IKeyBindingService.class.getMethod( "setScopes", new Class[] { String[].class }); method.invoke(service, new Object[] { scopes}); service.registerAction(action); } } catch (NoSuchMethodException e) { // should not happen } catch (IllegalArgumentException e) { // should not happen } catch (IllegalAccessException e) { // should not happen } catch (InvocationTargetException e) { // should not happen } } public static void main(String[] args) { System.out.println(SWT.getVersion()); } /** * @return */ public static boolean isEclipse30() { return SWT.getVersion() >= 3000; } /** * @return */ public static boolean isEclipse21OrHigher() { return SWT.getVersion() >= 2100; } /** * Method getDescriptor. * @param registry * @param imageName * @return ImageDescriptor */ public static ImageDescriptor getDescriptor( ImageRegistry registry, String imageName) { ImageDescriptor descriptor = null; try { if (isEclipse21OrHigher()) { Method method = ImageRegistry.class.getMethod( "getDescriptor", new Class[] { String.class }); descriptor = (ImageDescriptor) method.invoke(registry, new Object[] {imageName}); } } catch (NoSuchMethodException e) { // should not happen } catch (IllegalArgumentException e) { // should not happen } catch (IllegalAccessException e) { // should not happen } catch (InvocationTargetException e) { // should not happen } return descriptor; } }