Mercurial > projects > dwt-mac
annotate dwt/program/Program.d @ 147:64712e72cb16
Fixes #32
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Sun, 07 Jun 2009 00:04:52 +0200 |
parents | 07399639c0c8 |
children |
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.internal.c.Carbon; | |
42 import dwt.internal.objc.cocoa.Cocoa; | |
43 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
|
44 |
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 * 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
|
47 * 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
|
48 * system. |
45 | 49 * |
50 * @see <a href="http://www.eclipse.org/swt/snippets/#program">Program snippets</a> | |
51 * @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
|
52 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
53 public final class Program { |
45 | 54 String name, fullPath, identifier; |
55 | |
121 | 56 static const String PREFIX_FILE = "file://"; //$NON-NLS-1$ |
57 static const String PREFIX_HTTP = "http://"; //$NON-NLS-1$ | |
58 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
|
59 |
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 * 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
|
62 */ |
121 | 63 this () { |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
64 } |
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 * 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
|
68 * 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
|
69 * 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
|
70 * this method returns an appropriate result. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
71 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
72 * @param extension the program extension |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
73 * @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
|
74 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
75 * @exception IllegalArgumentException <ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
76 * <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
|
77 * </ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
78 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
79 public static Program findProgram (String extension) { |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
80 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
|
81 if (extension.length () is 0) return null; |
121 | 82 if (extension.charAt(0) !is '.') extension = "." ~ extension; |
83 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); | |
45 | 84 try { |
85 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); | |
147 | 86 objc.id appName = new objc.objc_object; |
87 objc.id type = new objc.objc_object; | |
45 | 88 NSString temp = new NSString(OS.NSTemporaryDirectory()); |
121 | 89 NSString fileName = NSString.stringWith("swt" ~ Format("{}", System.currentTimeMillis()) ~ extension); |
45 | 90 NSString fullPath = temp.stringByAppendingPathComponent(fileName); |
91 NSFileManager fileManager = NSFileManager.defaultManager(); | |
92 fileManager.createFileAtPath(fullPath, null, null); | |
93 workspace.getInfoForFile(fullPath, appName, type); | |
121 | 94 fileManager.removeItemAtPath(fullPath, null); |
147 | 95 objc.id buffer = appName; |
121 | 96 if (buffer !is null) { |
97 NSString appPath = new NSString(buffer); | |
45 | 98 NSBundle bundle = NSBundle.bundleWithPath(appPath); |
99 if (bundle !is null) return getProgram(bundle); | |
100 } | |
101 return null; | |
102 } finally { | |
103 pool.release(); | |
104 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
105 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
106 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
107 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
108 * 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
|
109 * 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
|
110 * 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
|
111 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
112 * @return an array of extensions |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
113 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
114 public static String [] getExtensions () { |
121 | 115 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 116 try { |
121 | 117 NSMutableSet supportedDocumentTypes = cast(NSMutableSet)NSMutableSet.set(); |
45 | 118 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); |
119 NSString CFBundleDocumentTypes = NSString.stringWith("CFBundleDocumentTypes"); | |
120 NSString CFBundleTypeExtensions = NSString.stringWith("CFBundleTypeExtensions"); | |
121 NSArray array = new NSArray(OS.NSSearchPathForDirectoriesInDomains(OS.NSAllApplicationsDirectory, OS.NSAllDomainsMask, true)); | |
121 | 122 NSUInteger count = array.count(); |
123 for (NSUInteger i = 0; i < count; i++) { | |
45 | 124 NSString path = new NSString(array.objectAtIndex(i)); |
125 NSFileManager fileManager = NSFileManager.defaultManager(); | |
126 NSDirectoryEnumerator enumerator = fileManager.enumeratorAtPath(path); | |
127 if (enumerator !is null) { | |
121 | 128 cocoa.id id; |
45 | 129 while ((id = enumerator.nextObject()) !is null) { |
130 enumerator.skipDescendents(); | |
131 NSString filePath = new NSString(id.id); | |
132 NSString fullPath = path.stringByAppendingPathComponent(filePath); | |
133 if (workspace.isFilePackageAtPath(fullPath)) { | |
134 NSBundle bundle = NSBundle.bundleWithPath(fullPath); | |
135 id = bundle.infoDictionary().objectForKey(CFBundleDocumentTypes); | |
136 if (id !is null) { | |
137 NSDictionary documentTypes = new NSDictionary(id.id); | |
138 NSEnumerator documentTypesEnumerator = documentTypes.objectEnumerator(); | |
139 while ((id = documentTypesEnumerator.nextObject()) !is null) { | |
140 NSDictionary documentType = new NSDictionary(id.id); | |
141 id = documentType.objectForKey(CFBundleTypeExtensions); | |
142 if (id !is null) { | |
143 supportedDocumentTypes.addObjectsFromArray(new NSArray(id.id)); | |
144 } | |
145 } | |
146 } | |
147 } | |
148 } | |
149 } | |
150 } | |
151 int i = 0; | |
121 | 152 String[] exts = new String[supportedDocumentTypes.count()]; |
45 | 153 NSEnumerator enumerator = supportedDocumentTypes.objectEnumerator(); |
121 | 154 cocoa.id id; |
45 | 155 while ((id = enumerator.nextObject()) !is null) { |
121 | 156 String ext = (new NSString(id.id)).getString(); |
157 if (ext != "*") exts[i++] = "." ~ ext; | |
45 | 158 } |
159 if (i !is exts.length) { | |
160 String[] temp = new String[i]; | |
161 System.arraycopy(exts, 0, temp, 0, i); | |
162 exts = temp; | |
163 } | |
164 return exts; | |
165 } finally { | |
166 pool.release(); | |
167 } | |
168 } | |
169 | |
170 static Program getProgram(NSBundle bundle) { | |
171 NSString CFBundleName = NSString.stringWith("CFBundleName"); | |
172 NSString CFBundleDisplayName = NSString.stringWith("CFBundleDisplayName"); | |
173 NSString fullPath = bundle.bundlePath(); | |
174 NSString identifier = bundle.bundleIdentifier(); | |
121 | 175 cocoa.id bundleName = bundle.objectForInfoDictionaryKey(CFBundleDisplayName); |
45 | 176 if (bundleName is null) { |
177 bundleName = bundle.objectForInfoDictionaryKey(CFBundleName); | |
178 } | |
179 if (bundleName is null) { | |
180 bundleName = fullPath.lastPathComponent().stringByDeletingPathExtension(); | |
181 } | |
182 NSString name = new NSString(bundleName.id); | |
183 Program program = new Program(); | |
184 program.name = name.getString(); | |
185 program.fullPath = fullPath.getString(); | |
186 program.identifier = identifier !is null ? identifier.getString() : ""; | |
187 return program; | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
188 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
189 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
190 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
191 * 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
|
192 * 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
|
193 * 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
|
194 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
195 * @return an array of programs |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
196 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
197 public static Program [] getPrograms () { |
121 | 198 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 199 try { |
121 | 200 Program[] vector; |
45 | 201 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); |
202 NSArray array = new NSArray(OS.NSSearchPathForDirectoriesInDomains(OS.NSAllApplicationsDirectory, OS.NSAllDomainsMask, true)); | |
121 | 203 NSUInteger count = array.count(); |
204 for (NSUInteger i = 0; i < count; i++) { | |
45 | 205 NSString path = new NSString(array.objectAtIndex(i)); |
206 NSFileManager fileManager = NSFileManager.defaultManager(); | |
207 NSDirectoryEnumerator enumerator = fileManager.enumeratorAtPath(path); | |
208 if (enumerator !is null) { | |
121 | 209 cocoa.id id; |
45 | 210 while ((id = enumerator.nextObject()) !is null) { |
211 enumerator.skipDescendents(); | |
212 NSString fullPath = path.stringByAppendingPathComponent(new NSString(id.id)); | |
213 if (workspace.isFilePackageAtPath(fullPath)) { | |
214 NSBundle bundle = NSBundle.bundleWithPath(fullPath); | |
215 vector.addElement(getProgram(bundle)); | |
216 } | |
217 } | |
218 } | |
219 } | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
220 return vector.dup; |
45 | 221 } finally { |
222 pool.release(); | |
223 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
224 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
225 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
226 /** |
45 | 227 * Launches the operating system executable associated with the file or |
228 * URL (http:// or https://). If the file is an executable then the | |
229 * executable is launched. Note that a <code>Display</code> must already | |
230 * 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
|
231 * |
45 | 232 * @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
|
233 * @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
|
234 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
235 * @exception IllegalArgumentException <ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
236 * <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
|
237 * </ul> |
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 public static bool launch (String fileName) { |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
240 if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT); |
121 | 241 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 242 try { |
243 NSString unescapedStr = NSString.stringWith("%"); //$NON-NLS-1$ | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
244 if (dwt.dwthelper.utils.indexOf(fileName, ':') is -1) { |
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
245 fileName = PREFIX_FILE ~ fileName; |
45 | 246 } else { |
247 String lowercaseName = fileName.toLowerCase (); | |
248 if (lowercaseName.startsWith (PREFIX_HTTP) || lowercaseName.startsWith (PREFIX_HTTPS)) { | |
249 unescapedStr = NSString.stringWith("%#"); //$NON-NLS-1$ | |
250 } | |
251 } | |
252 NSString fullPath = NSString.stringWith(fileName); | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
253 CFStringRef ptr = OS.CFURLCreateStringByAddingPercentEscapes(null, cast(CFStringRef) fullPath.id, cast(CFStringRef) unescapedStr.id, null, OS.kCFStringEncodingUTF8); |
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
254 NSString escapedString = new NSString(cast(objc.id)ptr); |
45 | 255 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); |
256 bool result = workspace.openURL(NSURL.URLWithString(escapedString)); | |
257 OS.CFRelease(ptr); | |
258 return result; | |
259 } finally { | |
260 pool.release(); | |
261 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
262 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
263 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
264 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
265 * 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
|
266 * 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
|
267 * 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
|
268 * this program. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
269 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
270 * @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
|
271 * @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
|
272 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
273 * @exception IllegalArgumentException <ul> |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
274 * <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
|
275 * </ul> |
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 public bool execute (String fileName) { |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
278 if (fileName is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
121 | 279 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 280 try { |
281 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); | |
282 NSString fullPath = NSString.stringWith(fileName); | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
283 if (dwt.dwthelper.utils.indexOf(fileName, ':') is -1) { |
45 | 284 return workspace.openFile(fullPath, NSString.stringWith(name)); |
285 } | |
286 NSString unescapedStr = NSString.stringWith("%"); //$NON-NLS-1$ | |
287 String lowercaseName = fileName.toLowerCase (); | |
288 if (lowercaseName.startsWith (PREFIX_HTTP) || lowercaseName.startsWith (PREFIX_HTTPS)) { | |
289 unescapedStr = NSString.stringWith("%#"); //$NON-NLS-1$ | |
290 } | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
291 CFStringRef ptr = OS.CFURLCreateStringByAddingPercentEscapes(null, cast(CFStringRef) fullPath.id, cast(CFStringRef) unescapedStr.id, null, OS.kCFStringEncodingUTF8); |
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
292 NSString escapedString = new NSString(cast(objc.id) ptr); |
45 | 293 NSArray urls = NSArray.arrayWithObject(NSURL.URLWithString(escapedString)); |
294 OS.CFRelease(ptr); | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
295 return workspace.openURLs(urls, NSString.stringWith(identifier), NSWorkspaceLaunchOptions.init, null, null); |
45 | 296 } finally { |
297 pool.release(); | |
298 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
299 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
300 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
301 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
302 * 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
|
303 * 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
|
304 * system. |
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 * @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
|
307 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
308 public ImageData getImageData () { |
121 | 309 NSAutoreleasePool pool = cast(NSAutoreleasePool) (new NSAutoreleasePool()).alloc().init(); |
45 | 310 try { |
311 NSWorkspace workspace = NSWorkspace.sharedWorkspace(); | |
312 NSString fullPath; | |
313 if (this.fullPath !is null) { | |
314 fullPath = NSString.stringWith(this.fullPath); | |
315 } else { | |
316 fullPath = workspace.fullPathForApplication(NSString.stringWith(name)); | |
317 } | |
318 if (fullPath !is null) { | |
319 NSImage nsImage = workspace.iconForFile(fullPath); | |
320 if (nsImage !is null) { | |
46
cfa563df4fdd
Updated Widget and Display to 3.514
Jacob Carlborg <doob@me.com>
parents:
45
diff
changeset
|
321 NSSize size = NSSize(); |
45 | 322 size.width = size.height = 16; |
323 nsImage.setSize(size); | |
324 NSBitmapImageRep imageRep = null; | |
325 NSImageRep rep = nsImage.bestRepresentationForDevice(null); | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
326 if (rep.isKindOfClass(cast(objc.Class) OS.class_NSBitmapImageRep)) { |
45 | 327 imageRep = new NSBitmapImageRep(rep.id); |
328 } | |
329 if (imageRep !is null) { | |
121 | 330 int width = cast(int)/*64*/imageRep.pixelsWide(); |
331 int height = cast(int)/*64*/imageRep.pixelsHigh(); | |
332 int bpr = cast(int)/*64*/imageRep.bytesPerRow(); | |
333 int bpp = cast(int)/*64*/imageRep.bitsPerPixel(); | |
45 | 334 int dataSize = height * bpr; |
335 byte[] srcData = new byte[dataSize]; | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
336 OS.memmove(srcData.ptr, imageRep.bitmapData(), dataSize); |
45 | 337 //TODO check color info |
338 PaletteData palette = new PaletteData(0xFF000000, 0xFF0000, 0xFF00); | |
339 ImageData data = new ImageData(width, height, bpp, palette, 4, srcData); | |
340 data.bytesPerLine = bpr; | |
341 data.alphaData = new byte[width * height]; | |
342 for (int i = 3, o = 0; i < srcData.length; i+= 4, o++) { | |
343 data.alphaData[o] = srcData[i]; | |
344 } | |
345 return data; | |
346 } | |
347 } | |
348 } | |
349 return null; | |
350 } finally { | |
351 pool.release(); | |
352 } | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
353 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
354 |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
355 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
356 * 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
|
357 * 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
|
358 * 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
|
359 * 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
|
360 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
361 * @return the name of the program |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
362 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
363 public String getName () { |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
364 return name; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
365 } |
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 /** |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
368 * 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
|
369 * 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
|
370 * specific comparison. |
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 * @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
|
373 * @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
|
374 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
375 * @see #hashCode() |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
376 */ |
121 | 377 public int opEquals(Object other) { |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
378 if (this is other) return true; |
121 | 379 if (cast(Program) other) { |
380 final Program program = cast(Program) other; | |
122
2e671fa40eec
Ported dwt.dnd, dwt.opengl, dwt.printing and dwt.program
Jacob Carlborg <doob@me.com>
parents:
121
diff
changeset
|
381 return name == program.name; |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
382 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
383 return false; |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
384 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
385 |
121 | 386 alias opEquals equals; |
387 | |
0
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 * 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
|
390 * 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
|
391 * <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
|
392 * method. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
393 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
394 * @return the receiver's hash |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
395 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
396 * @see #equals(Object) |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
397 */ |
121 | 398 public hash_t toHash() { |
399 return .toHash(name); | |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
400 } |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
401 |
121 | 402 alias toHash hashCode; |
403 | |
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 * 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
|
406 * description of the receiver. |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
407 * |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
408 * @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
|
409 */ |
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
410 public String toString () { |
121 | 411 return "Program {" ~ name ~ "}"; |
0
380af2bdd8e5
Upload of whole dwt tree
Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
parents:
diff
changeset
|
412 } |
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 } |