Mercurial > projects > dwt-mac
annotate dwt/program/Program.d @ 121:e1c48e37e0f5
Ported dwt.program.Program
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Wed, 31 Dec 2008 16:50:37 +0100 |
parents | cfa563df4fdd |
children | 2e671fa40eec |
rev | line source |
---|---|
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
1 /******************************************************************************* |
45 | 2 * Copyright (c) 2000, 2008 IBM Corporation and others. |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
3 * All rights reserved. This program and the accompanying materials |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
4 * are made available under the terms of the Eclipse Public License v1.0 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
5 * which accompanies this distribution, and is available at |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
6 * http://www.eclipse.org/legal/epl-v10.html |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
7 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
8 * Contributors: |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
9 * IBM Corporation - initial API and implementation |
121 | 10 * |
11 * Port to the D programming language: | |
12 * Jacob Carlborg <doob@me.com> | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
13 *******************************************************************************/ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
14 module dwt.program.Program; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
15 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
16 import dwt.dwthelper.utils; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
17 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
18 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
19 import dwt.DWT; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
20 import dwt.graphics.ImageData; |
45 | 21 import dwt.graphics.PaletteData; |
22 import dwt.internal.C; | |
23 import dwt.internal.cocoa.NSArray; | |
24 import dwt.internal.cocoa.NSAutoreleasePool; | |
25 import dwt.internal.cocoa.NSBitmapImageRep; | |
26 import dwt.internal.cocoa.NSBundle; | |
27 import dwt.internal.cocoa.NSDictionary; | |
28 import dwt.internal.cocoa.NSDirectoryEnumerator; | |
29 import dwt.internal.cocoa.NSEnumerator; | |
30 import dwt.internal.cocoa.NSFileManager; | |
31 import dwt.internal.cocoa.NSImage; | |
32 import dwt.internal.cocoa.NSImageRep; | |
33 import dwt.internal.cocoa.NSMutableSet; | |
34 import dwt.internal.cocoa.NSSize; | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
35 import dwt.internal.cocoa.NSString; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
36 import dwt.internal.cocoa.NSURL; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
37 import dwt.internal.cocoa.NSWorkspace; |
45 | 38 import dwt.internal.cocoa.OS; |
121 | 39 import cocoa = dwt.internal.cocoa.id; |
40 | |
41 import dwt.dwthelper.array; | |
42 import dwt.internal.c.Carbon; | |
43 import dwt.internal.objc.cocoa.Cocoa; | |
44 import objc = dwt.internal.objc.runtime; | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
45 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
46 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
47 * Instances of this class represent programs and |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
48 * their associated file extensions in the operating |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
49 * system. |
45 | 50 * |
51 * @see <a href="http://www.eclipse.org/swt/snippets/#program">Program snippets</a> | |
52 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
53 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
54 public final class Program { |
45 | 55 String name, fullPath, identifier; |
56 | |
121 | 57 static const String PREFIX_FILE = "file://"; //$NON-NLS-1$ |
58 static const String PREFIX_HTTP = "http://"; //$NON-NLS-1$ | |
59 static const String PREFIX_HTTPS = "https://"; //$NON-NLS-1$ | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
60 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
61 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
62 * Prevents uninitialized instances from being created outside the package. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
63 */ |
121 | 64 this () { |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
65 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
66 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
67 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
68 * Finds the program that is associated with an extension. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
69 * The extension may or may not begin with a '.'. Note that |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
70 * a <code>Display</code> must already exist to guarantee that |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
71 * this method returns an appropriate result. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
72 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
73 * @param extension the program extension |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
74 * @return the program or <code>null</code> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
75 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
76 * @exception IllegalArgumentException <ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
77 * <li>ERROR_NULL_ARGUMENT when extension is null</li> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
78 * </ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
79 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
80 public static Program findProgram (String extension) { |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
81 if (extension is null) DWT.error (DWT.ERROR_NULL_ARGUMENT); |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
82 if (extension.length () is 0) return null; |
121 | 83 if (extension.charAt(0) !is '.') extension = "." ~ extension; |
84 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); | |
45 | 85 try { |
86 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); | |
121 | 87 objc.id appName = cast(objc.id) OS.malloc(C.PTR_SIZEOF); |
88 objc.id type = cast(objc.id) OS.malloc(C.PTR_SIZEOF); | |
45 | 89 NSString temp = new NSString(OS.NSTemporaryDirectory()); |
121 | 90 NSString fileName = NSString.stringWith("swt" ~ Format("{}", System.currentTimeMillis()) ~ extension); |
45 | 91 NSString fullPath = temp.stringByAppendingPathComponent(fileName); |
92 NSFileManager fileManager = NSFileManager.defaultManager(); | |
93 fileManager.createFileAtPath(fullPath, null, null); | |
94 workspace.getInfoForFile(fullPath, appName, type); | |
121 | 95 fileManager.removeItemAtPath(fullPath, null); |
96 objc.id buffer; | |
45 | 97 OS.memmove(buffer, appName, C.PTR_SIZEOF); |
98 OS.free(appName); | |
99 OS.free(type); | |
121 | 100 if (buffer !is null) { |
101 NSString appPath = new NSString(buffer); | |
45 | 102 NSBundle bundle = NSBundle.bundleWithPath(appPath); |
103 if (bundle !is null) return getProgram(bundle); | |
104 } | |
105 return null; | |
106 } finally { | |
107 pool.release(); | |
108 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
109 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
110 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
111 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
112 * Answer all program extensions in the operating system. Note |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
113 * that a <code>Display</code> must already exist to guarantee |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
114 * that this method returns an appropriate result. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
115 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
116 * @return an array of extensions |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
117 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
118 public static String [] getExtensions () { |
121 | 119 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 120 try { |
121 | 121 NSMutableSet supportedDocumentTypes = cast(NSMutableSet)NSMutableSet.set(); |
45 | 122 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); |
123 NSString CFBundleDocumentTypes = NSString.stringWith("CFBundleDocumentTypes"); | |
124 NSString CFBundleTypeExtensions = NSString.stringWith("CFBundleTypeExtensions"); | |
125 NSArray array = new NSArray(OS.NSSearchPathForDirectoriesInDomains(OS.NSAllApplicationsDirectory, OS.NSAllDomainsMask, true)); | |
121 | 126 NSUInteger count = array.count(); |
127 for (NSUInteger i = 0; i < count; i++) { | |
45 | 128 NSString path = new NSString(array.objectAtIndex(i)); |
129 NSFileManager fileManager = NSFileManager.defaultManager(); | |
130 NSDirectoryEnumerator enumerator = fileManager.enumeratorAtPath(path); | |
131 if (enumerator !is null) { | |
121 | 132 cocoa.id id; |
45 | 133 while ((id = enumerator.nextObject()) !is null) { |
134 enumerator.skipDescendents(); | |
135 NSString filePath = new NSString(id.id); | |
136 NSString fullPath = path.stringByAppendingPathComponent(filePath); | |
137 if (workspace.isFilePackageAtPath(fullPath)) { | |
138 NSBundle bundle = NSBundle.bundleWithPath(fullPath); | |
139 id = bundle.infoDictionary().objectForKey(CFBundleDocumentTypes); | |
140 if (id !is null) { | |
141 NSDictionary documentTypes = new NSDictionary(id.id); | |
142 NSEnumerator documentTypesEnumerator = documentTypes.objectEnumerator(); | |
143 while ((id = documentTypesEnumerator.nextObject()) !is null) { | |
144 NSDictionary documentType = new NSDictionary(id.id); | |
145 id = documentType.objectForKey(CFBundleTypeExtensions); | |
146 if (id !is null) { | |
147 supportedDocumentTypes.addObjectsFromArray(new NSArray(id.id)); | |
148 } | |
149 } | |
150 } | |
151 } | |
152 } | |
153 } | |
154 } | |
155 int i = 0; | |
121 | 156 String[] exts = new String[supportedDocumentTypes.count()]; |
45 | 157 NSEnumerator enumerator = supportedDocumentTypes.objectEnumerator(); |
121 | 158 cocoa.id id; |
45 | 159 while ((id = enumerator.nextObject()) !is null) { |
121 | 160 String ext = (new NSString(id.id)).getString(); |
161 if (ext != "*") exts[i++] = "." ~ ext; | |
45 | 162 } |
163 if (i !is exts.length) { | |
164 String[] temp = new String[i]; | |
165 System.arraycopy(exts, 0, temp, 0, i); | |
166 exts = temp; | |
167 } | |
168 return exts; | |
169 } finally { | |
170 pool.release(); | |
171 } | |
172 } | |
173 | |
174 static Program getProgram(NSBundle bundle) { | |
175 NSString CFBundleName = NSString.stringWith("CFBundleName"); | |
176 NSString CFBundleDisplayName = NSString.stringWith("CFBundleDisplayName"); | |
177 NSString fullPath = bundle.bundlePath(); | |
178 NSString identifier = bundle.bundleIdentifier(); | |
121 | 179 cocoa.id bundleName = bundle.objectForInfoDictionaryKey(CFBundleDisplayName); |
45 | 180 if (bundleName is null) { |
181 bundleName = bundle.objectForInfoDictionaryKey(CFBundleName); | |
182 } | |
183 if (bundleName is null) { | |
184 bundleName = fullPath.lastPathComponent().stringByDeletingPathExtension(); | |
185 } | |
186 NSString name = new NSString(bundleName.id); | |
187 Program program = new Program(); | |
188 program.name = name.getString(); | |
189 program.fullPath = fullPath.getString(); | |
190 program.identifier = identifier !is null ? identifier.getString() : ""; | |
191 return program; | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
192 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
193 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
194 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
195 * Answers all available programs in the operating system. Note |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
196 * that a <code>Display</code> must already exist to guarantee |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
197 * that this method returns an appropriate result. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
198 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
199 * @return an array of programs |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
200 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
201 public static Program [] getPrograms () { |
121 | 202 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 203 try { |
121 | 204 Program[] vector; |
45 | 205 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); |
206 NSArray array = new NSArray(OS.NSSearchPathForDirectoriesInDomains(OS.NSAllApplicationsDirectory, OS.NSAllDomainsMask, true)); | |
121 | 207 NSUInteger count = array.count(); |
208 for (NSUInteger i = 0; i < count; i++) { | |
45 | 209 NSString path = new NSString(array.objectAtIndex(i)); |
210 NSFileManager fileManager = NSFileManager.defaultManager(); | |
211 NSDirectoryEnumerator enumerator = fileManager.enumeratorAtPath(path); | |
212 if (enumerator !is null) { | |
121 | 213 cocoa.id id; |
45 | 214 while ((id = enumerator.nextObject()) !is null) { |
215 enumerator.skipDescendents(); | |
216 NSString fullPath = path.stringByAppendingPathComponent(new NSString(id.id)); | |
217 if (workspace.isFilePackageAtPath(fullPath)) { | |
218 NSBundle bundle = NSBundle.bundleWithPath(fullPath); | |
219 vector.addElement(getProgram(bundle)); | |
220 } | |
221 } | |
222 } | |
223 } | |
121 | 224 vector.dup; |
45 | 225 } finally { |
226 pool.release(); | |
227 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
228 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
229 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
230 /** |
45 | 231 * Launches the operating system executable associated with the file or |
232 * URL (http:// or https://). If the file is an executable then the | |
233 * executable is launched. Note that a <code>Display</code> must already | |
234 * exist to guarantee that this method returns an appropriate result. | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
235 * |
45 | 236 * @param fileName the file or program name or URL (http:// or https://) |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
237 * @return <code>true</code> if the file is launched, otherwise <code>false</code> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
238 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
239 * @exception IllegalArgumentException <ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
240 * <li>ERROR_NULL_ARGUMENT when fileName is null</li> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
241 * </ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
242 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
243 public static bool launch (String fileName) { |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
244 if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT); |
121 | 245 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 246 try { |
247 NSString unescapedStr = NSString.stringWith("%"); //$NON-NLS-1$ | |
248 if (fileName.indexOf(':') is -1) { | |
249 fileName = PREFIX_FILE + fileName; | |
250 } else { | |
251 String lowercaseName = fileName.toLowerCase (); | |
252 if (lowercaseName.startsWith (PREFIX_HTTP) || lowercaseName.startsWith (PREFIX_HTTPS)) { | |
253 unescapedStr = NSString.stringWith("%#"); //$NON-NLS-1$ | |
254 } | |
255 } | |
256 NSString fullPath = NSString.stringWith(fileName); | |
121 | 257 CFStringRef ptr = OS.CFURLCreateStringByAddingPercentEscapes(null, fullPath.id, unescapedStr.id, null, OS.kCFStringEncodingUTF8); |
45 | 258 NSString escapedString = new NSString(ptr); |
259 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); | |
260 bool result = workspace.openURL(NSURL.URLWithString(escapedString)); | |
261 OS.CFRelease(ptr); | |
262 return result; | |
263 } finally { | |
264 pool.release(); | |
265 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
266 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
267 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
268 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
269 * Executes the program with the file as the single argument |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
270 * in the operating system. It is the responsibility of the |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
271 * programmer to ensure that the file contains valid data for |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
272 * this program. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
273 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
274 * @param fileName the file or program name |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
275 * @return <code>true</code> if the file is launched, otherwise <code>false</code> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
276 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
277 * @exception IllegalArgumentException <ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
278 * <li>ERROR_NULL_ARGUMENT when fileName is null</li> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
279 * </ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
280 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
281 public bool execute (String fileName) { |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
282 if (fileName is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
121 | 283 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 284 try { |
285 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); | |
286 NSString fullPath = NSString.stringWith(fileName); | |
287 if (fileName.indexOf(':') is -1) { | |
288 return workspace.openFile(fullPath, NSString.stringWith(name)); | |
289 } | |
290 NSString unescapedStr = NSString.stringWith("%"); //$NON-NLS-1$ | |
291 String lowercaseName = fileName.toLowerCase (); | |
292 if (lowercaseName.startsWith (PREFIX_HTTP) || lowercaseName.startsWith (PREFIX_HTTPS)) { | |
293 unescapedStr = NSString.stringWith("%#"); //$NON-NLS-1$ | |
294 } | |
121 | 295 CFStringRef ptr = OS.CFURLCreateStringByAddingPercentEscapes(0, fullPath.id, unescapedStr.id, 0, OS.kCFStringEncodingUTF8); |
45 | 296 NSString escapedString = new NSString(ptr); |
297 NSArray urls = NSArray.arrayWithObject(NSURL.URLWithString(escapedString)); | |
298 OS.CFRelease(ptr); | |
299 return workspace.openURLs(urls, NSString.stringWith(identifier), 0, null, 0); | |
300 } finally { | |
301 pool.release(); | |
302 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
303 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
304 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
305 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
306 * Returns the receiver's image data. This is the icon |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
307 * that is associated with the receiver in the operating |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
308 * system. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
309 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
310 * @return the image data for the program, may be null |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
311 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
312 public ImageData getImageData () { |
121 | 313 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 314 try { |
315 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); | |
316 NSString fullPath; | |
317 if (this.fullPath !is null) { | |
318 fullPath = NSString.stringWith(this.fullPath); | |
319 } else { | |
320 fullPath = workspace.fullPathForApplication(NSString.stringWith(name)); | |
321 } | |
322 if (fullPath !is null) { | |
323 NSImage nsImage = workspace.iconForFile(fullPath); | |
324 if (nsImage !is null) { | |
46
cfa563df4fdd
Updated Widget and Display to 3.514
Jacob Carlborg <doob@me.com>
parents:
45
diff
changeset
|
325 NSSize size = NSSize(); |
45 | 326 size.width = size.height = 16; |
327 nsImage.setSize(size); | |
328 NSBitmapImageRep imageRep = null; | |
329 NSImageRep rep = nsImage.bestRepresentationForDevice(null); | |
330 if (rep.isKindOfClass(OS.class_NSBitmapImageRep)) { | |
331 imageRep = new NSBitmapImageRep(rep.id); | |
332 } | |
333 if (imageRep !is null) { | |
121 | 334 int width = cast(int)/*64*/imageRep.pixelsWide(); |
335 int height = cast(int)/*64*/imageRep.pixelsHigh(); | |
336 int bpr = cast(int)/*64*/imageRep.bytesPerRow(); | |
337 int bpp = cast(int)/*64*/imageRep.bitsPerPixel(); | |
45 | 338 int dataSize = height * bpr; |
339 byte[] srcData = new byte[dataSize]; | |
340 OS.memmove(srcData, imageRep.bitmapData(), dataSize); | |
341 //TODO check color info | |
342 PaletteData palette = new PaletteData(0xFF000000, 0xFF0000, 0xFF00); | |
343 ImageData data = new ImageData(width, height, bpp, palette, 4, srcData); | |
344 data.bytesPerLine = bpr; | |
345 data.alphaData = new byte[width * height]; | |
346 for (int i = 3, o = 0; i < srcData.length; i+= 4, o++) { | |
347 data.alphaData[o] = srcData[i]; | |
348 } | |
349 return data; | |
350 } | |
351 } | |
352 } | |
353 return null; | |
354 } finally { | |
355 pool.release(); | |
356 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
357 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
358 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
359 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
360 * Returns the receiver's name. This is as short and |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
361 * descriptive a name as possible for the program. If |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
362 * the program has no descriptive name, this string may |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
363 * be the executable name, path or empty. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
364 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
365 * @return the name of the program |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
366 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
367 public String getName () { |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
368 return name; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
369 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
370 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
371 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
372 * Compares the argument to the receiver, and returns true |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
373 * if they represent the <em>same</em> object using a class |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
374 * specific comparison. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
375 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
376 * @param other the object to compare with this object |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
377 * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
378 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
379 * @see #hashCode() |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
380 */ |
121 | 381 public int opEquals(Object other) { |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
382 if (this is other) return true; |
121 | 383 if (cast(Program) other) { |
384 final Program program = cast(Program) other; | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
385 return name.equals(program.name); |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
386 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
387 return false; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
388 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
389 |
121 | 390 alias opEquals equals; |
391 | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
392 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
393 * Returns an integer hash code for the receiver. Any two |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
394 * objects that return <code>true</code> when passed to |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
395 * <code>equals</code> must return the same value for this |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
396 * method. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
397 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
398 * @return the receiver's hash |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
399 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
400 * @see #equals(Object) |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
401 */ |
121 | 402 public hash_t toHash() { |
403 return .toHash(name); | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
404 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
405 |
121 | 406 alias toHash hashCode; |
407 | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
408 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
409 * Returns a string containing a concise, human-readable |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
410 * description of the receiver. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
411 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
412 * @return a string representation of the program |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
413 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
414 public String toString () { |
121 | 415 return "Program {" ~ name ~ "}"; |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
416 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
417 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
418 } |