| /******************************************************************************* |
| * 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; |
| |
| } |
| |
| } |