diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport index cc41662c1b..c9b09006ac 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport @@ -32642,6 +32642,10 @@ + + + + @@ -32935,6 +32939,12 @@ + + + + + + diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport.extras b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport.extras index d1ca0ed5bf..f9adf872e0 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport.extras +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/AppKitFull.bridgesupport.extras @@ -4154,6 +4154,14 @@ + + + + + + + + @@ -4192,6 +4200,12 @@ + + + + + + diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/NSWorkspace.java b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/NSWorkspace.java index 9bfa02eae8..16d5910854 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/NSWorkspace.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/NSWorkspace.java @@ -7,9 +7,6 @@ * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.internal.cocoa; @@ -27,6 +24,16 @@ public NSWorkspace(id id) { super(id); } +public NSURL URLForApplicationToOpenURL(NSURL url) { + long result = OS.objc_msgSend(this.id, OS.sel_URLForApplicationToOpenURL_, url != null ? url.id : 0); + return result != 0 ? new NSURL(result) : null; +} + +public NSURL URLForApplicationToOpenContentType(UTType contentType) { + long result = OS.objc_msgSend(this.id, OS.sel_URLForApplicationToOpenContentType_, contentType != null ? contentType.id : 0); + return result != 0 ? new NSURL(result) : null; +} + public NSString fullPathForApplication(NSString appName) { long result = OS.objc_msgSend(this.id, OS.sel_fullPathForApplication_, appName != null ? appName.id : 0); return result != 0 ? new NSString(result) : null; @@ -45,16 +52,6 @@ public boolean openURL(NSURL url) { return OS.objc_msgSend_bool(this.id, OS.sel_openURL_, url != null ? url.id : 0); } -public NSURL urlForApplicationToOpenURL(NSURL url) { - long result = OS.objc_msgSend(this.id, OS.sel_URLForApplicationToOpenURL_, url != null ? url.id : 0); - return result != 0 ? new NSURL(result) : null; -} - -public NSURL urlForApplicationToOpenContentType(long contentType) { - long result = OS.objc_msgSend(this.id, OS.sel_URLForApplicationToOpenContentType_, contentType); - return result != 0 ? new NSURL(result) : null; -} - public boolean openURLs(NSArray urls, NSString bundleIdentifier, long options, NSAppleEventDescriptor descriptor, long identifiers) { return OS.objc_msgSend_bool(this.id, OS.sel_openURLs_withAppBundleIdentifier_options_additionalEventParamDescriptor_launchIdentifiers_, urls != null ? urls.id : 0, bundleIdentifier != null ? bundleIdentifier.id : 0, options, descriptor != null ? descriptor.id : 0, identifiers); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/OS.java index 8c94dfd44e..bfe161cc67 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/OS.java @@ -767,6 +767,7 @@ public static boolean isSystemDarkAppearance() { public static final long class_NSWorkspace = objc_getClass("NSWorkspace"); public static final long class_SFCertificatePanel = objc_getClass("SFCertificatePanel"); public static final long class_SFCertificateTrustPanel = objc_getClass("SFCertificateTrustPanel"); +public static final long class_UTType = objc_getClass("UTType"); public static final long class_WebDataSource = objc_getClass("WebDataSource"); public static final long class_WebFrame = objc_getClass("WebFrame"); public static final long class_WebFrameView = objc_getClass("WebFrameView"); @@ -830,9 +831,9 @@ public static Selector getSelector (long value) { public static final long sel_PMPrintSettings = Selector.sel_PMPrintSettings.value; public static final long sel_TIFFRepresentation = Selector.sel_TIFFRepresentation.value; public static final long sel_URL = Selector.sel_URL.value; -public static final long sel_URLFromPasteboard_ = Selector.sel_URLFromPasteboard_.value; -public static final long sel_URLForApplicationToOpenURL_ = Selector.sel_URLForApplicationToOpenURL_.value; public static final long sel_URLForApplicationToOpenContentType_ = Selector.sel_URLForApplicationToOpenContentType_.value; +public static final long sel_URLForApplicationToOpenURL_ = Selector.sel_URLForApplicationToOpenURL_.value; +public static final long sel_URLFromPasteboard_ = Selector.sel_URLFromPasteboard_.value; public static final long sel_URLWithString_ = Selector.sel_URLWithString_.value; public static final long sel_UTF8String = Selector.sel_UTF8String.value; public static final long sel_abortEditing = Selector.sel_abortEditing.value; diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/Selector.java b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/Selector.java index 589d736607..09e0ae8c00 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/Selector.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/Selector.java @@ -96,9 +96,9 @@ public enum Selector { , sel_PMPrintSettings("PMPrintSettings") , sel_TIFFRepresentation("TIFFRepresentation") , sel_URL("URL") - , sel_URLFromPasteboard_("URLFromPasteboard:") - , sel_URLForApplicationToOpenURL_("URLForApplicationToOpenURL:") , sel_URLForApplicationToOpenContentType_("URLForApplicationToOpenContentType:") + , sel_URLForApplicationToOpenURL_("URLForApplicationToOpenURL:") + , sel_URLFromPasteboard_("URLFromPasteboard:") , sel_URLWithString_("URLWithString:") , sel_UTF8String("UTF8String") , sel_abortEditing("abortEditing") diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/UTType.java b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/UTType.java new file mode 100644 index 0000000000..b836c18703 --- /dev/null +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/cocoa/org/eclipse/swt/internal/cocoa/UTType.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2026 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.swt.internal.cocoa; + +public class UTType extends NSObject { + +public UTType() { + super(); +} + +public UTType(long id) { + super(id); +} + +public UTType(id id) { + super(id); +} + +public static UTType typeWithFilenameExtension(NSString filenameExtension) { + long result = OS.objc_msgSend(OS.class_UTType, OS.sel_typeWithFilenameExtension_, filenameExtension != null ? filenameExtension.id : 0); + return result != 0 ? new UTType(result) : null; +} + +} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Program/cocoa/org/eclipse/swt/program/Program.java b/bundles/org.eclipse.swt/Eclipse SWT Program/cocoa/org/eclipse/swt/program/Program.java index 465abcc118..786067fece 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Program/cocoa/org/eclipse/swt/program/Program.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Program/cocoa/org/eclipse/swt/program/Program.java @@ -153,20 +153,17 @@ private static NSURL findAppURLForExtension(NSString ext) { // On macOS 12.0+, use the content type-based API which works reliably // for all file types including third-party ones. if (OS.VERSION >= OS.VERSION(12, 0, 0)) { - long UTTypeClass = OS.objc_getClass("UTType"); - if (UTTypeClass != 0) { - long utType = OS.objc_msgSend(UTTypeClass, OS.sel_typeWithFilenameExtension_, ext.id); - if (utType != 0) { - NSURL appURL = workspace.urlForApplicationToOpenContentType(utType); - if (appURL != null) { - return appURL; - } + UTType utType = UTType.typeWithFilenameExtension(ext); + if (utType != null) { + NSURL appURL = workspace.URLForApplicationToOpenContentType(utType); + if (appURL != null) { + return appURL; } } } // Fallback: URL-based lookup (available since macOS 10.6, deprecated in macOS 12.0) NSURL fileURL = NSURL.fileURLWithPath(NSString.stringWith("/tmp/dummy." + ext.getString())); - return workspace.urlForApplicationToOpenURL(fileURL); + return workspace.URLForApplicationToOpenURL(fileURL); } static Program getProgram(NSBundle bundle) {