/**
  * Returns the receiver's image data. This is the icon that is associated with the receiver in the
  * operating system.
  *
  * @return the image data for the program, may be null
  */
 public ImageData getImageData() {
   NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
   try {
     NSWorkspace workspace = NSWorkspace.sharedWorkspace();
     NSString fullPath;
     if (this.fullPath != null) {
       fullPath = NSString.stringWith(this.fullPath);
     } else {
       fullPath = workspace.fullPathForApplication(NSString.stringWith(name));
     }
     if (fullPath != null) {
       NSImage nsImage = workspace.iconForFile(fullPath);
       if (nsImage != null) {
         NSSize size = new NSSize();
         size.width = size.height = 16;
         nsImage.setSize(size);
         nsImage.retain();
         Image image = Image.cocoa_new(Display.getCurrent(), SWT.BITMAP, nsImage);
         ImageData imageData = image.getImageData();
         image.dispose();
         return imageData;
       }
     }
     return null;
   } finally {
     pool.release();
   }
 }
 /**
  * Answers all available programs in the operating system. Note that a <code>Display</code> must
  * already exist to guarantee that this method returns an appropriate result.
  *
  * @return an array of programs
  */
 public static Program[] getPrograms() {
   NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
   try {
     List<Program> vector = new ArrayList<>();
     NSWorkspace workspace = NSWorkspace.sharedWorkspace();
     NSArray array =
         new NSArray(
             OS.NSSearchPathForDirectoriesInDomains(
                 OS.NSAllApplicationsDirectory, OS.NSAllDomainsMask, true));
     int count = (int) /*64*/ array.count();
     for (int i = 0; i < count; i++) {
       NSString path = new NSString(array.objectAtIndex(i));
       NSFileManager fileManager = NSFileManager.defaultManager();
       NSDirectoryEnumerator enumerator = fileManager.enumeratorAtPath(path);
       if (enumerator != null) {
         id id;
         while ((id = enumerator.nextObject()) != null) {
           enumerator.skipDescendents();
           NSString fullPath = path.stringByAppendingPathComponent(new NSString(id.id));
           if (workspace.isFilePackageAtPath(fullPath)) {
             NSBundle bundle = NSBundle.bundleWithPath(fullPath);
             if (bundle != null) {
               Program program = getProgram(bundle);
               if (program != null) vector.add(program);
             }
           }
         }
       }
     }
     return vector.toArray(new Program[vector.size()]);
   } finally {
     pool.release();
   }
 }
 /**
  * Executes the program with the file as the single argument in the operating system. It is the
  * responsibility of the programmer to ensure that the file contains valid data for this program.
  *
  * @param fileName the file or program name
  * @return <code>true</code> if the file is launched, otherwise <code>false</code>
  * @exception IllegalArgumentException
  *     <ul>
  *       <li>ERROR_NULL_ARGUMENT when fileName is null
  *     </ul>
  */
 public boolean execute(String fileName) {
   if (fileName == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
   NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
   try {
     NSWorkspace workspace = NSWorkspace.sharedWorkspace();
     NSURL url = getURL(fileName);
     NSArray urls = NSArray.arrayWithObject(url);
     return workspace.openURLs(urls, NSString.stringWith(identifier), 0, null, 0);
   } finally {
     pool.release();
   }
 }
 /**
  * Launches the operating system executable associated with the file or URL (http:// or https://).
  * If the file is an executable then the executable is launched. The program is launched with the
  * specified working directory only when the <code>workingDir</code> exists and <code>fileName
  * </code> is an executable. Note that a <code>Display</code> must already exist to guarantee that
  * this method returns an appropriate result.
  *
  * @param fileName the file name or program name or URL (http:// or https://)
  * @param workingDir the name of the working directory or null
  * @return <code>true</code> if the file is launched, otherwise <code>false</code>
  * @exception IllegalArgumentException
  *     <ul>
  *       <li>ERROR_NULL_ARGUMENT when fileName is null
  *     </ul>
  *
  * @since 3.6
  */
 public static boolean launch(String fileName, String workingDir) {
   if (fileName == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
   NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
   try {
     if (workingDir != null && isExecutable(fileName)) {
       try {
         Compatibility.exec(new String[] {fileName}, null, workingDir);
         return true;
       } catch (IOException e) {
         return false;
       }
     }
     NSURL url = getURL(fileName);
     NSWorkspace workspace = NSWorkspace.sharedWorkspace();
     return workspace.openURL(url);
   } finally {
     pool.release();
   }
 }
 static boolean isExecutable(String fileName) {
   long /*int*/ ptr = OS.malloc(1);
   NSString path = NSString.stringWith(fileName);
   boolean result = false;
   NSFileManager manager = NSFileManager.defaultManager();
   if (manager.fileExistsAtPath(path, ptr)) {
     byte[] isDirectory = new byte[1];
     OS.memmove(isDirectory, ptr, 1);
     if (isDirectory[0] == 0 && manager.isExecutableFileAtPath(path)) {
       NSWorkspace ws = NSWorkspace.sharedWorkspace();
       NSString type = ws.typeOfFile(path, 0);
       result =
           type != null
               && (ws.type(type, NSString.stringWith("public.unix-executable"))
                   || //$NON-NLS-1$
                   OS.UTTypeEqual(
                       type.id, NSString.stringWith("public.shell-script").id)); // $NON-NLS-1$
     }
   }
   OS.free(ptr);
   return result;
 }
 /**
  * Answer all program extensions in the operating system. Note that a <code>Display</code> must
  * already exist to guarantee that this method returns an appropriate result.
  *
  * @return an array of extensions
  */
 public static String[] getExtensions() {
   NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init();
   try {
     NSMutableSet supportedDocumentTypes = (NSMutableSet) NSMutableSet.set();
     NSWorkspace workspace = NSWorkspace.sharedWorkspace();
     NSString CFBundleDocumentTypes = NSString.stringWith("CFBundleDocumentTypes");
     NSString CFBundleTypeExtensions = NSString.stringWith("CFBundleTypeExtensions");
     NSArray array =
         new NSArray(
             OS.NSSearchPathForDirectoriesInDomains(
                 OS.NSAllApplicationsDirectory, OS.NSAllDomainsMask, true));
     int count = (int) /*64*/ array.count();
     for (int i = 0; i < count; i++) {
       NSString path = new NSString(array.objectAtIndex(i));
       NSFileManager fileManager = NSFileManager.defaultManager();
       NSDirectoryEnumerator enumerator = fileManager.enumeratorAtPath(path);
       if (enumerator != null) {
         id id;
         while ((id = enumerator.nextObject()) != null) {
           enumerator.skipDescendents();
           NSString filePath = new NSString(id.id);
           NSString fullPath = path.stringByAppendingPathComponent(filePath);
           if (workspace.isFilePackageAtPath(fullPath)) {
             NSBundle bundle = NSBundle.bundleWithPath(fullPath);
             id =
                 bundle != null
                     ? bundle.infoDictionary().objectForKey(CFBundleDocumentTypes)
                     : null;
             if (id != null) {
               NSDictionary documentTypes = new NSDictionary(id.id);
               NSEnumerator documentTypesEnumerator = documentTypes.objectEnumerator();
               while ((id = documentTypesEnumerator.nextObject()) != null) {
                 NSDictionary documentType = new NSDictionary(id.id);
                 id = documentType.objectForKey(CFBundleTypeExtensions);
                 if (id != null) {
                   supportedDocumentTypes.addObjectsFromArray(new NSArray(id.id));
                 }
               }
             }
           }
         }
       }
     }
     int i = 0;
     String[] exts = new String[(int) /*64*/ supportedDocumentTypes.count()];
     NSEnumerator enumerator = supportedDocumentTypes.objectEnumerator();
     id id;
     while ((id = enumerator.nextObject()) != null) {
       String ext = new NSString(id.id).getString();
       if (!ext.equals("*")) exts[i++] = "." + ext;
     }
     if (i != exts.length) {
       String[] temp = new String[i];
       System.arraycopy(exts, 0, temp, 0, i);
       exts = temp;
     }
     return exts;
   } finally {
     pool.release();
   }
 }