/******************************************************************************* * Copyright (c) 2004, 2015 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation * David Green - fix for bug 247182 * Frank Becker - fixes for bug 259877 *******************************************************************************/ package org.eclipse.mylyn.commons.ui; import org.eclipse.core.runtime.Platform; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.osgi.framework.Bundle; import org.osgi.framework.Version; /** * @author Steffen Pingel * @since 3.7 */ public class PlatformUiUtil { private static Boolean internalBrowserAvailable; private static class Eclipse36Checker { public static final boolean result; static { boolean methodAvailable = false; try { StyledText.class.getMethod("setTabStops", int[].class); //$NON-NLS-1$ methodAvailable = true; } catch (NoSuchMethodException e) { } result = methodAvailable; } } /** * bug 247182: file import dialog doesn't work on Mac OS X if the file extension has more than one dot. */ public static String[] getFilterExtensions(String... extensions) { for (int i = 0; i < extensions.length; i++) { String extension = extensions[i]; if (Platform.OS_MACOSX.equals(Platform.getOS())) { int j = extension.lastIndexOf('.'); if (j != -1) { extension = extension.substring(j); } } extensions[i] = "*" + extension; //$NON-NLS-1$ } return extensions; } public static int getToolTipXShift() { if ("gtk".equals(SWT.getPlatform()) || "carbon".equals(SWT.getPlatform()) //$NON-NLS-1$//$NON-NLS-2$ || "cocoa".equals(SWT.getPlatform())) { //$NON-NLS-1$ return -26; } else { return -23; } } public static int getTreeImageOffset() { if ("carbon".equals(SWT.getPlatform())) { //$NON-NLS-1$ return 16; } else if ("cocoa".equals(SWT.getPlatform())) { //$NON-NLS-1$ return 13; } else { return 20; } } public static int getIncomingImageOffset() { if ("carbon".equals(SWT.getPlatform())) { //$NON-NLS-1$ return 5; } else if ("cocoa".equals(SWT.getPlatform())) { //$NON-NLS-1$ return 2; } else { return 6; } } public static int getTreeItemSquish() { if ("gtk".equals(SWT.getPlatform())) { //$NON-NLS-1$ return 8; } else if (isMac()) { return 3; } else { return 0; } } private static boolean isMac() { return "carbon".equals(SWT.getPlatform()) || "cocoa".equals(SWT.getPlatform()); //$NON-NLS-1$ //$NON-NLS-2$ } /** * @deprecated no longer required as platform bug 272046 has been fixed */ @Deprecated public static boolean isPaintItemClippingRequired() { return "gtk".equals(SWT.getPlatform()); //$NON-NLS-1$ } public static boolean spinnerHasNativeBorder() { return isMac() && !isEclipse36orLater(); } private static boolean isEclipse36orLater() { return Eclipse36Checker.result; } public static boolean hasNarrowToolBar() { return Platform.WS_WIN32.equals(SWT.getPlatform()); } /** * If a a section does not use a toolbar as its text client the spacing between the section header and client will * be different from other sections. This method returns the value to set as the vertical spacing on those sections * to align the vertical position of section clients. * * @return value for {@link org.eclipse.ui.forms.widgets.Section#clientVerticalSpacing} */ public static int getToolbarSectionClientVerticalSpacing() { if (Platform.WS_WIN32.equals(SWT.getPlatform())) { return 5; } return 7; } /** * Returns the width of the view menu drop-down button. */ public static int getViewMenuWidth() { return 32; } /** * Because of bug# 322293 (NPE when select Hyperlink from MultipleHyperlinkPresenter List) for MacOS we enable this * only if running on Eclipse >= "3.7.0.v201101192000" */ public static boolean supportsMultipleHyperlinkPresenter() { if (isMac()) { Bundle bundle = Platform.getBundle("org.eclipse.platform"); //$NON-NLS-1$ if (bundle != null) { String versionString = (String) bundle.getHeaders().get("Bundle-Version"); //$NON-NLS-1$ Version version = new Version(versionString); return version.compareTo(new Version("3.7.0.v201101192000")) >= 0; //$NON-NLS-1$ } else { bundle = Platform.getBundle("org.eclipse.swt"); //$NON-NLS-1$ if (bundle != null) { String versionString = (String) bundle.getHeaders().get("Bundle-Version"); //$NON-NLS-1$ Version version = new Version(versionString); return version.compareTo(new Version("3.7.0.v3721")) >= 0; //$NON-NLS-1$ } else { //TODO e3.7 change this to true when eclipse 3.6 reach end of live! return false; } } } return true; } /** * Because of bug#175655: [context] provide an on-hover affordance to supplement Alt+click navigation Tooltips will * show everyone on Linux unless they are balloons. */ public static int getSwtTooltipStyle() { if ("gtk".equals(SWT.getPlatform())) { //$NON-NLS-1$ return SWT.BALLOON; } return SWT.NONE; } public static boolean usesMouseWheelEventsForScrolling() { return "cocoa".equals(SWT.getPlatform()); //$NON-NLS-1$ } public static boolean hasInternalBrowser() { if (internalBrowserAvailable == null) { try { Shell[] shells = Display.getDefault().getShells(); if (shells.length > 0) { Browser browser = new Browser(shells[0], SWT.NONE); browser.dispose(); internalBrowserAvailable = Boolean.TRUE; } else { // can't determine status return false; } } catch (SWTError er) { internalBrowserAvailable = Boolean.FALSE; } } return internalBrowserAvailable.booleanValue(); } /** * @since 3.18 */ public static boolean isNeonOrLater() { Bundle bundle = Platform.getBundle("org.eclipse.platform"); //$NON-NLS-1$ if (bundle != null) { String versionString = (String) bundle.getHeaders().get("Bundle-Version"); //$NON-NLS-1$ Version version = new Version(versionString); return version.compareTo(new Version("4.6.0.v20151020-0800")) >= 0; //$NON-NLS-1$ } bundle = Platform.getBundle("org.eclipse.swt"); //$NON-NLS-1$ if (bundle != null) { String versionString = (String) bundle.getHeaders().get("Bundle-Version"); //$NON-NLS-1$ Version version = new Version(versionString); return version.compareTo(new Version("3.105.0.v20151020-0634")) >= 0; //$NON-NLS-1$ } return false; } }