annotate dwt/program/Program.d @ 239:43b41c7fe84a

work on allow null strings and arrays
author Frank Benoit <benoit@tionex.de>
date Fri, 20 Jun 2008 16:27:36 +0200
parents 36f5cb12e1a2
children fd9c62a2998e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2007 IBM Corporation and others.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 * Port to the D Programming language:
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 * Frank Benoit <benoit@tionex.de>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.program.Program;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 import dwt.DWT;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.graphics.Image;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.graphics.ImageData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.internal.win32.OS;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.dwthelper.utils;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 static import tango.text.convert.Utf;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 * Instances of this class represent programs and
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 * their associated file extensions in the operating
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 * system.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 public final class Program {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
29 String name;
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
30 String command;
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
31 String iconName;
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
32 String extension;
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
33 static const String[] ARGUMENTS = ["%1"[], "%l", "%L"]; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 * Prevents uninitialized instances from being created outside the package.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 this () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
41 static String assocQueryString (int assocStr, TCHAR[] key, bool expand) {
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 TCHAR[] pszOut = NewTCHARs(0, 1024);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 uint[1] pcchOut;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 pcchOut[0] = pszOut.length;
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
45 int flags = OS.ASSOCF_NOTRUNCATE | OS.ASSOCF_INIT_IGNOREUNKNOWN;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
46 int result = OS.AssocQueryString (flags, assocStr, key.ptr, null, pszOut.ptr, pcchOut.ptr);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 if (result is OS.E_POINTER) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 pszOut = NewTCHARs(0, pcchOut [0]);
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
49 result = OS.AssocQueryString (flags, assocStr, key.ptr, null, pszOut.ptr, pcchOut.ptr);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 if (result is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 if (!OS.IsWinCE && expand) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 int length_ = OS.ExpandEnvironmentStrings (pszOut.ptr, null, 0);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 if (length_ !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 TCHAR[] lpDst = NewTCHARs (0, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 OS.ExpandEnvironmentStrings (pszOut.ptr, lpDst.ptr, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 return tango.text.convert.Utf.toString( lpDst[ 0 .. Math.max (0, length_ - 1) ] );
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 } else {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 return "";
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 } else {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 return tango.text.convert.Utf.toString( pszOut[ 0 .. Math.max (0, pcchOut [0] - 1)]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * Finds the program that is associated with an extension.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 * The extension may or may not begin with a '.'. Note that
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * a <code>Display</code> must already exist to guarantee that
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * this method returns an appropriate result.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 * @param extension the program extension
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 * @return the program or <code>null</code>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
78 public static Program findProgram (String extension) {
239
43b41c7fe84a work on allow null strings and arrays
Frank Benoit <benoit@tionex.de>
parents: 213
diff changeset
79 // DWT extension: allow null string
43b41c7fe84a work on allow null strings and arrays
Frank Benoit <benoit@tionex.de>
parents: 213
diff changeset
80 //if (extension is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 if (extension.length is 0) return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 if (extension.charAt (0) !is '.') extension = "." ~ extension; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 TCHAR[] key = StrToTCHARs (0, extension, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 Program program = null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 if (OS.IsWinCE) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 void*[1] phkResult;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 if (OS.RegOpenKeyEx ( cast(void*)OS.HKEY_CLASSES_ROOT, key.ptr, 0, OS.KEY_READ, phkResult.ptr) !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 uint [1] lpcbData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 int result = OS.RegQueryValueEx (phkResult [0], null, null, null, null, lpcbData.ptr);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 if (result is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 TCHAR[] lpData = NewTCHARs (0, lpcbData [0] / TCHAR.sizeof);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 result = OS.RegQueryValueEx (phkResult [0], null, null, null, cast(ubyte*)lpData.ptr, lpcbData.ptr);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 if (result is 0) program = getProgram ( TCHARzToStr( lpData.ptr ), extension);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 OS.RegCloseKey (phkResult [0]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 } else {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
100 String command = assocQueryString (OS.ASSOCSTR_COMMAND, key, true);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 if (command !is null) {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
102 String name = null;
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 if (name is null) name = assocQueryString (OS.ASSOCSTR_FRIENDLYDOCNAME, key, false);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 if (name is null) name = assocQueryString (OS.ASSOCSTR_FRIENDLYAPPNAME, key, false);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 if (name is null) name = "";
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
106 String iconName = assocQueryString (OS.ASSOCSTR_DEFAULTICON, key, true);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 if (iconName is null) iconName = "";
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 program = new Program ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 program.name = name;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 program.command = command;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 program.iconName = iconName;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 program.extension = extension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 return program;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 * Answer all program extensions in the operating system. Note
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 * that a <code>Display</code> must already exist to guarantee
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 * that this method returns an appropriate result.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 * @return an array of extensions
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
125 public static String [] getExtensions () {
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
126 String [] extensions = new String [1024];
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 TCHAR[] lpName = NewTCHARs (0, 1024);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 uint [1] lpcName; lpcName[0] = lpName.length;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 FILETIME ft;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 int dwIndex = 0, count = 0;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 while (OS.RegEnumKeyEx ( cast(void*)OS.HKEY_CLASSES_ROOT, dwIndex, lpName.ptr, lpcName.ptr, null, null, null, &ft) !is OS.ERROR_NO_MORE_ITEMS) {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
133 String extension = TCHARsToStr( lpName[0 .. lpcName[0] ]);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 lpcName [0] = lpName.length;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 if (extension.length > 0 && extension.charAt (0) is '.') {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 if (count is extensions.length) {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
137 String[] newExtensions = new String[]( extensions.length + 1024 );
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 System.arraycopy (extensions, 0, newExtensions, 0, extensions.length);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 extensions = newExtensions;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 extensions [count++] = extension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 dwIndex++;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 if (count !is extensions.length) {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
146 String[] newExtension = new String[]( count );
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 System.arraycopy (extensions, 0, newExtension, 0, count);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 extensions = newExtension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 return extensions;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
153 static String getKeyValue (String string, bool expand) {
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 TCHAR[] key = StrToTCHARs (0, string, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 void* [1] phkResult;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 if (OS.RegOpenKeyEx (cast(void*)OS.HKEY_CLASSES_ROOT, key.ptr, 0, OS.KEY_READ, phkResult.ptr) !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 }
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
160 String result = null;
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 uint [1] lpcbData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 if (OS.RegQueryValueEx (phkResult [0], null, null, null, null, lpcbData.ptr) is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 result = "";
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 int length_ = lpcbData [0] / TCHAR.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 if (length_ !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 TCHAR[] lpData = NewTCHARs (0, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 if (OS.RegQueryValueEx (phkResult [0], null, null, null, cast(ubyte*)lpData.ptr, lpcbData.ptr) is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 if (!OS.IsWinCE && expand) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 length_ = OS.ExpandEnvironmentStrings (lpData.ptr, null, 0);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 if (length_ !is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 TCHAR[] lpDst = NewTCHARs (0, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 OS.ExpandEnvironmentStrings (lpData.ptr, lpDst.ptr, length_);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 result = tango.text.convert.Utf.toString ( lpDst[0 .. Math.max (0, length_ - 1) ] );
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 } else {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 length_ = Math.max (0, lpData.length - 1);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 result = tango.text.convert.Utf.toString ( lpData[0 .. length_]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 if (phkResult [0] !is null) OS.RegCloseKey (phkResult [0]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 return result;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
187 static Program getProgram (String key, String extension) {
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 /* Name */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
190 String name = getKeyValue (key, false);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 if (name is null || name.length is 0) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 name = key;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 /* Command */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
196 String DEFAULT_COMMAND = "\\shell"; //$NON-NLS-1$
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
197 String defaultCommand = getKeyValue (key ~ DEFAULT_COMMAND, true);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 if (defaultCommand is null || defaultCommand.length is 0) defaultCommand = "open"; //$NON-NLS-1$
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
199 String COMMAND = "\\shell\\" ~ defaultCommand ~ "\\command"; //$NON-NLS-1$
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
200 String command = getKeyValue (key ~ COMMAND, true);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 if (command is null || command.length is 0) return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 /* Icon */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
204 String DEFAULT_ICON = "\\DefaultIcon"; //$NON-NLS-1$
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
205 String iconName = getKeyValue (key ~ DEFAULT_ICON, true);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 if (iconName is null) iconName = ""; //$NON-NLS-1$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 /* Program */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 Program program = new Program ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 program.name = name;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 program.command = command;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 program.iconName = iconName;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 program.extension = extension;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 return program;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 * Answers all available programs in the operating system. Note
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 * that a <code>Display</code> must already exist to guarantee
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 * that this method returns an appropriate result.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 * @return an array of programs
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 public static Program [] getPrograms () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 Program [] programs = new Program [1024];
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 TCHAR[] lpName = NewTCHARs (0, 1024);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 uint [1] lpcName; lpcName[0] = lpName.length;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 FILETIME ft;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 int dwIndex = 0, count = 0;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 while (OS.RegEnumKeyEx (cast(void*)OS.HKEY_CLASSES_ROOT, dwIndex, lpName.ptr, lpcName.ptr, null, null, null, &ft) !is OS.ERROR_NO_MORE_ITEMS) {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
232 String path = tango.text.convert.Utf.toString ( lpName[0 .. lpcName [0]]);
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 lpcName [0] = lpName.length ;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 Program program = getProgram (path, null);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 if (program !is null) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 if (count is programs.length) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 Program [] newPrograms = new Program [programs.length + 1024];
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 System.arraycopy (programs, 0, newPrograms, 0, programs.length);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 programs = newPrograms;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 programs [count++] = program;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 dwIndex++;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 if (count !is programs.length) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 Program [] newPrograms = new Program [count];
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 System.arraycopy (programs, 0, newPrograms, 0, count);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 programs = newPrograms;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 return programs;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 /**
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
254 * Launches the operating system executable associated with the file or
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
255 * URL (http:// or https://). If the file is an executable then the
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
256 * executable is launched. Note that a <code>Display</code> must already
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
257 * exist to guarantee that this method returns an appropriate result.
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 *
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
259 * @param fileName the file or program name or URL (http:// or https://)
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 * @return <code>true</code> if the file is launched, otherwise <code>false</code>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 * @exception IllegalArgumentException <ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 * <li>ERROR_NULL_ARGUMENT when fileName is null</li>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 * </ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
266 public static bool launch (String fileName) {
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 auto hHeap = OS.GetProcessHeap ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 TCHAR[] buffer = StrToTCHARs (0, fileName, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 int byteCount = buffer.length * TCHAR.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 auto lpFile = cast(wchar*) OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 OS.MoveMemory (lpFile, buffer.ptr, byteCount);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 SHELLEXECUTEINFO info;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 info.cbSize = SHELLEXECUTEINFO.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 info.lpFile = lpFile;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 info.nShow = OS.SW_SHOW;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 bool result = cast(bool) OS.ShellExecuteEx (&info);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 if (lpFile !is null) OS.HeapFree (hHeap, 0, lpFile);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 return result;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 * Executes the program with the file as the single argument
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 * in the operating system. It is the responsibility of the
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 * programmer to ensure that the file contains valid data for
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 * this program.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 * @param fileName the file or program name
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 * @return <code>true</code> if the file is launched, otherwise <code>false</code>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 * @exception IllegalArgumentException <ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 * <li>ERROR_NULL_ARGUMENT when fileName is null</li>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 * </ul>
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
297 public bool execute (String fileName) {
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 int index = 0;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 bool append = true;
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
301 String prefix = command, suffix = ""; //$NON-NLS-1$
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 while (index < ARGUMENTS.length) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 int i = command.indexOf (ARGUMENTS [index]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 if (i !is -1) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 append = false;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 prefix = command.substring (0, i);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 suffix = command.substring (i + ARGUMENTS [index].length , command.length );
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 break;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 index++;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 if (append) fileName = " \"" ~ fileName ~ "\"";
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
313 String commandLine = prefix ~ fileName ~ suffix;
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 auto hHeap = OS.GetProcessHeap ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 TCHAR[] buffer = StrToTCHARs (0, commandLine, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 int byteCount = buffer.length * TCHAR.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 auto lpCommandLine = cast(TCHAR*)OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 OS.MoveMemory (lpCommandLine, buffer.ptr, byteCount);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 STARTUPINFO lpStartupInfo;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 lpStartupInfo.cb = STARTUPINFO.sizeof;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 PROCESS_INFORMATION lpProcessInformation;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 bool success = cast(bool) OS.CreateProcess (null, lpCommandLine, null, null, false, 0, null, null, &lpStartupInfo, &lpProcessInformation);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 if (lpCommandLine !is null) OS.HeapFree (hHeap, 0, lpCommandLine);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 if (lpProcessInformation.hProcess !is null) OS.CloseHandle (lpProcessInformation.hProcess);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 if (lpProcessInformation.hThread !is null) OS.CloseHandle (lpProcessInformation.hThread);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 return success;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 * Returns the receiver's image data. This is the icon
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 * that is associated with the receiver in the operating
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 * system.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 * @return the image data for the program, may be null
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 public ImageData getImageData () {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 if (extension !is null) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 SHFILEINFOW shfi;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 int flags = OS.SHGFI_ICON | OS.SHGFI_SMALLICON | OS.SHGFI_USEFILEATTRIBUTES;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 TCHAR[] pszPath = StrToTCHARs (0, extension, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 OS.SHGetFileInfo (pszPath.ptr, OS.FILE_ATTRIBUTE_NORMAL, &shfi, SHFILEINFO.sizeof, flags);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 if (shfi.hIcon !is null) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 Image image = Image.win32_new (null, DWT.ICON, shfi.hIcon);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 ImageData imageData = image.getImageData ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 image.dispose ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 return imageData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 int nIconIndex = 0;
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
351 String fileName = iconName;
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 int index = iconName.indexOf (',');
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 if (index !is -1) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 fileName = iconName.substring (0, index);
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
355 String iconIndex = iconName.substring (index + 1, iconName.length ).trim ();
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 try {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 nIconIndex = Integer.parseInt (iconIndex);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 } catch (NumberFormatException e) {}
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
360 int length = fileName.length;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
361 if (length !is 0 && fileName.charAt (0) is '\"') {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
362 if (fileName.charAt (length - 1) is '\"') {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
363 fileName = fileName.substring (1, length - 1);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
364 }
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
365 }
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 /* Use the character encoding for the default locale */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 TCHAR[] lpszFile = StrToTCHARs (0, fileName, true);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 HICON [1] phiconSmall, phiconLarge;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 OS.ExtractIconEx (lpszFile.ptr, nIconIndex, phiconLarge.ptr, phiconSmall.ptr, 1);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 if (phiconSmall [0] is null) return null;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 Image image = Image.win32_new (null, DWT.ICON, phiconSmall [0]);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 ImageData imageData = image.getImageData ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 image.dispose ();
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 return imageData;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 * Returns the receiver's name. This is as short and
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 * descriptive a name as possible for the program. If
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 * the program has no descriptive name, this string may
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 * be the executable name, path or empty.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 * @return the name of the program
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
385 public String getName () {
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 return name;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 * Compares the argument to the receiver, and returns true
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 * if they represent the <em>same</em> object using a class
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 * specific comparison.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 * @param other the object to compare with this object
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 * @see #hashCode()
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 public override int opEquals(Object other) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 if (this is other) return true;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 if ( auto program = cast(Program)other ) {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 return name.equals(program.name) && command.equals(program.command)
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 && iconName.equals(program.iconName);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 return false;
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 * Returns an integer hash code for the receiver. Any two
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 * objects that return <code>true</code> when passed to
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 * <code>equals</code> must return the same value for this
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 * method.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 * @return the receiver's hash
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 * @see #equals(Object)
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 */
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 public override hash_t toHash() {
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 return .toHash(name) ^ .toHash(command) ^ .toHash(iconName);
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 /**
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 * Returns a string containing a concise, human-readable
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 * description of the receiver.
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 *
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 * @return a string representation of the program
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
428 public String toString () {
191
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 return "Program {" ~ name ~ "}"; //$NON-NLS-1$ //$NON-NLS-2$
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 }
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431
528e7db39d9e now really
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 }