Mercurial > projects > dwt-mac
view dwt/program/Program.d @ 7:e831403a80a9
Add 'cast' to casts
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Wed, 27 Aug 2008 14:30:35 +0200 |
parents | 1a8b3cb347e0 |
children | a9ab4c738ed8 |
line wrap: on
line source
/******************************************************************************* * Copyright (c) 2000, 2007 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ module dwt.program.Program; import dwt.dwthelper.utils; import dwt.DWT; import dwt.graphics.ImageData; import dwt.internal.cocoa.NSString; import dwt.internal.cocoa.NSURL; import dwt.internal.cocoa.NSWorkspace; /** * Instances of this class represent programs and * their associated file extensions in the operating * system. */ public final class Program { String name; byte[] fsRef; /** * Prevents uninitialized instances from being created outside the package. */ this () { } /** * Finds the program that is associated with an extension. * The extension may or may not begin with a '.'. Note that * a <code>Display</code> must already exist to guarantee that * this method returns an appropriate result. * * @param extension the program extension * @return the program or <code>null</code> * * @exception IllegalArgumentException <ul> * <li>ERROR_NULL_ARGUMENT when extension is null</li> * </ul> */ public static Program findProgram (String extension) { if (extension is null) DWT.error (DWT.ERROR_NULL_ARGUMENT); if (extension.length () is 0) return null; // char[] chars; // if (extension.charAt (0) !is '.') { // chars = new char[extension.length()]; // extension.getChars(0, chars.length, chars, 0); // } else { // chars = new char[extension.length() - 1]; // extension.getChars(1, extension.length(), chars, 0); // } // int ext = OS.CFStringCreateWithCharacters(OS.kCFAllocatorDefault, chars, chars.length); // Program program = null; // if (ext !is 0) { // byte[] fsRef = new byte[80]; // if (OS.LSGetApplicationForInfo(OS.kLSUnknownType, OS.kLSUnknownCreator, ext, OS.kLSRolesAll, fsRef, null) is OS.noErr) { // program = getProgram(fsRef); // } // OS.CFRelease(ext); // } // return program; return null; } /** * 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 () { return new String [] { // From System-Declared Uniform Type Identifiers ".txt", ".rtf", ".html", ".htm", ".xml", ".c", ".m", ".cp", ".cpp", ".c++", ".cc", ".cxx", ".mm", ".h", ".hpp", ".h++", ".hxx", ".java", ".jav", ".s", ".r", ".defs", ".mig", ".exp", ".js", ".jscript", ".javascript", ".sh", ".command", ".csh", ".pl", ".pm", ".py", ".rb", ".rbw", ".php", ".php3", ".php4", ".ph3", ".ph4", ".phtml", ".jnlp", ".applescript", ".scpt", ".o", ".exe", ".dll", ".class", ".jar", ".qtz", ".gtar", ".tar", ".gz", ".gzip", ".tgz", ".hqx", ".bin", ".vcf", ".vcard", ".jpg", ".jpeg", ".jp2", ".tif", ".tiff", ".pic", ".pct", ".pict", ".pntg", ".png", ".xbm", ".qif", ".qtif", ".icns", ".mov", ".qt", ".avi", ".vfw", ".mpg", ".mpeg", ".m75", ".m15", ".mp4", ".3gp", ".3gpp", ".3g2", ".3gp2", ".mp3", ".m4a", ".m4p", ".m4b", ".au", ".ulw", ".snd", ".aifc", ".aiff", ".aif", ".caf", ".bundle", ".app", ".plugin", ".mdimporter", ".wdgt", ".cpio", ".zip", ".framework", ".rtfd", ".dfont", ".otf", ".ttf", ".ttc", ".suit", ".pfb", ".pfa", ".icc", ".icm", ".pf", ".pdf", ".ps", ".eps", ".psd", ".ai", ".gif", ".bmp", ".ico", ".doc", ".xls", ".ppt", ".wav", ".wave", ".asf", ".wm", ".wmv", ".wmp", ".wma", ".asx", ".wmx", ".wvx", ".wax", ".key", ".kth", ".tga", ".sgi", ".exr", ".fpx", ".jfx", ".efx", ".sd2", ".rm", ".ram", ".ra", ".smil", ".sit", ".sitx", // Others ".plist", ".nib", ".lproj", // iChat ".iPhoto", // iChat ".iChat", ".chat", // acrobat reader ".rmf", ".xfdf", ".fdf", // Chess ".game", ".pgn", // iCal ".ics", ".vcs", ".aplmodel", ".icbu", ".icalevent", ".icaltodo", // Mail ".mailhold", ".mbox", ".imapmbox", ".emlx", ".mailextract", // Sherlock ".sherlock", // Stickies ".tpl", // System Preferences ".prefPane", ".sliderSaver", ".saver", // Console ".log", // Grapher ".gcx", }; } /** * 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 () { return new Program[0]; // Hashtable bundles = new Hashtable(); // String[] extensions = getExtensions(); // byte[] fsRef = new byte[80]; // for (int i = 0; i < extensions.length; i++) { // String extension = extensions[i]; // char[] chars = new char[extension.length() - 1]; // extension.getChars(1, extension.length(), chars, 0); // int ext = OS.CFStringCreateWithCharacters(OS.kCFAllocatorDefault, chars, chars.length); // if (ext !is 0) { // if (OS.LSGetApplicationForInfo(OS.kLSUnknownType, OS.kLSUnknownCreator, ext, OS.kLSRolesAll, fsRef, null) is OS.noErr) { // Program program = getProgram(fsRef); // if (program !is null && bundles.get(program.getName()) is null) { // bundles.put(program.getName(), program); // fsRef = new byte[80]; // } // } // if (OS.VERSION >= 0x1040) { // int utis = OS.UTTypeCreateAllIdentifiersForTag(OS.kUTTagClassFilenameExtension(), ext, 0); // if (utis !is 0) { // int utiCount = OS.CFArrayGetCount(utis); // for (int j = 0; j < utiCount; j++) { // int uti = OS.CFArrayGetValueAtIndex(utis, j); // if (uti !is 0) { // int apps = OS.LSCopyAllRoleHandlersForContentType(uti, OS.kLSRolesAll); // if (apps !is 0) { // int appCount = OS.CFArrayGetCount(apps); // for (int k = 0; k < appCount; k++) { // int app = OS.CFArrayGetValueAtIndex(apps, k); // if (app !is 0) {; // if (OS.LSFindApplicationForInfo(OS.kLSUnknownCreator, app, 0, fsRef, null) is OS.noErr) { // Program program = getProgram(fsRef); // if (program !is null && bundles.get(program.getName()) is null) { // bundles.put(program.getName(), program); // fsRef = new byte[80]; // } // } // } // } // OS.CFRelease(apps); // } // } // } // OS.CFRelease(utis); // } // } // OS.CFRelease(ext); // } // } // int count = 0; // Program[] programs = new Program[bundles.size()]; // Enumeration values = bundles.elements(); // while (values.hasMoreElements()) { // programs[count++] = cast(Program)values.nextElement(); // } // return programs; } /** * Launches the executable associated with the file in * the operating system. If the file is an executable, * then the executable is launched. Note that a <code>Display</code> * must already exist to guarantee that this method returns * an appropriate result. * * @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</li> * </ul> */ public static bool launch (String fileName) { if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT); if (fileName.indexOf(':') is -1) fileName = "file://" + fileName; NSWorkspace workspace = NSWorkspace.sharedWorkspace(); return workspace.openURL(NSURL.static_URLWithString_(NSString.stringWith(fileName))); } /** * 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</li> * </ul> */ public bool execute (String fileName) { if (fileName is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); // if (OS.VERSION < 0x1040) return launch(fileName); // int rc = -1; // int fsRefPtr = OS.NewPtr(fsRef.length); // if (fsRefPtr !is 0) { // OS.memmove(fsRefPtr, fsRef, fsRef.length); // LSApplicationParameters params = new LSApplicationParameters(); // params.version = 0; // params.flags = 0; // params.application = fsRefPtr; // if (fileName.length() is 0) { // rc = OS.LSOpenApplication(params, null); // } else { // if (fileName.indexOf(':') is -1) fileName = "file://" + fileName; // char[] chars = new char[fileName.length()]; // fileName.getChars(0, chars.length, chars, 0); // int str = OS.CFStringCreateWithCharacters(0, chars, chars.length); // if (str !is 0) { // int unscapedStr = OS.CFStringCreateWithCharacters(0, new char[]{'%'}, 1); // int escapedStr = OS.CFURLCreateStringByAddingPercentEscapes(OS.kCFAllocatorDefault, str, unscapedStr, 0, OS.kCFStringEncodingUTF8); // if (escapedStr !is 0) { // int urls = OS.CFArrayCreateMutable(OS.kCFAllocatorDefault, 1, 0); // if (urls !is 0) { // int url = OS.CFURLCreateWithString(OS.kCFAllocatorDefault, escapedStr, 0); // if (url !is 0) { // OS.CFArrayAppendValue(urls, url); // rc = OS.LSOpenURLsWithRole(urls, OS.kLSRolesAll, 0, params, null, 0); // } // OS.CFRelease(urls); // } // OS.CFRelease(escapedStr); // } // if (unscapedStr !is 0) OS.CFRelease(unscapedStr); // OS.CFRelease(str); // } // } // OS.DisposePtr(fsRefPtr); // } // return rc is OS.noErr; return false; } /** * 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 () { // int[] iconRef = new int[1]; // OS.GetIconRefFromFileInfo(fsRef, 0, null, 0, 0, 0, iconRef, null); // int[] family = new int[1]; // int rc = OS.IconRefToIconFamily(iconRef[0], OS.kSelectorAlLAvailableData, family); // OS.ReleaseIconRef(iconRef[0]); // if (rc !is OS.noErr) return null; //// ImageData result = createImageFromFamily(family[0], OS.kLarge32BitData, OS.kLarge8BitMask, 32, 32); // ImageData result = createImageFromFamily(family[0], OS.kSmall32BitData, OS.kSmall8BitMask, 16, 16); // OS.DisposeHandle(family[0]); // if (result is null) { // RGB[] rgbs = new RGB[] { // new RGB(0xff, 0xff, 0xff), // new RGB(0x5f, 0x5f, 0x5f), // new RGB(0x80, 0x80, 0x80), // new RGB(0xC0, 0xC0, 0xC0), // new RGB(0xDF, 0xDF, 0xBF), // new RGB(0xFF, 0xDF, 0x9F), // new RGB(0x00, 0x00, 0x00), // }; // result = new ImageData(16, 16, 4, new PaletteData(rgbs) ); // result.transparentPixel = 6; // use black for transparency // String[] p= { // "CCCCCCCCGGG", // "CFAAAAACBGG", // "CAAAAAACFBG", // "CAAAAAACBBB", // "CAAAAAAAAEB", // "CAAAAAAAAEB", // "CAAAAAAAAEB", // "CAAAAAAAAEB", // "CAAAAAAAAEB", // "CAAAAAAAAEB", // "CAAAAAAAAEB", // "CAAAAAAAAEB", // "CDDDDDDDDDB", // "CBBBBBBBBBB", // }; // for (int y= 0; y < p.length; y++) { // for (int x= 0; x < 11; x++) { // result.setPixel(x+3, y+1, p[y].charAt(x)-'A'); // } // } // } // return result; return null; } /** * Returns the receiver's name. This is as short and * descriptive a name as possible for the program. If * the program has no descriptive name, this string may * be the executable name, path or empty. * * @return the name of the program */ public String getName () { return name; } //static Program getProgram(byte[] fsRef) { // String name = ""; // int[] namePtr = new int[1]; // OS.LSCopyDisplayNameForRef(fsRef, namePtr); // if (namePtr[0] !is 0) { // int length = OS.CFStringGetLength(namePtr[0]); // if (length !is 0) { // char[] buffer= new char[length]; // CFRange range = new CFRange(); // range.length = length; // OS.CFStringGetCharacters(namePtr[0], range, buffer); // name = new String(buffer); // } // OS.CFRelease(namePtr[0]); // } // Program program = new Program(); // program.fsRef = fsRef; // program.name = name; // return program; //} /** * Compares the argument to the receiver, and returns true * if they represent the <em>same</em> object using a class * specific comparison. * * @param other the object to compare with this object * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise * * @see #hashCode() */ public bool equals(Object other) { if (this is other) return true; if (other instanceof Program) { final Program program = cast(Program) other; return name.equals(program.name); } return false; } /** * Returns an integer hash code for the receiver. Any two * objects that return <code>true</code> when passed to * <code>equals</code> must return the same value for this * method. * * @return the receiver's hash * * @see #equals(Object) */ public int hashCode() { return name.hashCode(); } /** * Returns a string containing a concise, human-readable * description of the receiver. * * @return a string representation of the program */ public String toString () { return "Program {" + name + "}"; } }