1 /*
2 * Copyright 2008, orangevolt.sf.net, and individual contributors as indicated
3 * by the @authors tag. See the copyright.txt in the distribution for a
4 * full listing of individual contributors.
5 *
6 * This is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as
8 * published by the Free Software Foundation; either version 3 of
9 * the License, or (at your option) any later version.
10 *
11 * This software is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this software; if not, write to the Free
18 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
20 *
21 * $Id: LnkFile.java 125 2008-11-04 07:18:28Z arnep $
22 *
23 */
24 package net.sf.ovanttasks.ovnative.win32;
25
26 import java.io.File;
27
28 /**
29 * LnkFile reads and writes Windows Shortcut files in the .lnk format.
30 * It can be used to create or read <i>.lnk</i> files which are used
31 * by Microsoft for Shortcuts (the IShellLink Interface).
32 * The destination (path) can be executable (cmd.exe) or normal files (text files and more).
33 * They will be opend / executed by the shell.
34 * <p>
35 * The HOTKEYF_XXX constants are taken from (MinGW) commctrl.h.
36 * <p>
37 * The SW_SHOWXX constants are taken from (MinGW) winuser.h.
38 *
39 * @author lars.gersmann@roxes.com
40 * @author arnep@users.sf.net
41 */
42 public class LnkFile {
43
44 private static final int SW_SHOWNORMAL = 1;
45 private static final int SW_SHOWMINIMIZED = 2;
46 private static final int SW_SHOWMAXIMIZED = 3;
47
48 /**
49 * Returns the initil state in wich the window will be appear on screen.
50 * This can be normal, minimalized or maxiamlized.
51 * @return The sow state
52 */
53 public ShowCmd getShowState() {
54 return ShowCmd.valueOf(showCmd);
55 }
56
57 /**
58 * Sets the initial state in wich the window will be appear on screen.
59 * This can be normal, minimalized or maxiamlized.
60 * @param swShow The state to set.
61 */
62 public void setShowState(ShowCmd swShow) {
63 this.showCmd = swShow.swShow;
64 }
65
66 /**
67 * The inital state of the window.
68 */
69 public static enum ShowCmd {
70
71 /**
72 * normal window state
73 */
74 SHOWNORMAL(SW_SHOWNORMAL),
75 /**
76 * maximized window state
77 */
78 SHOWMAXIMIZED(SW_SHOWMAXIMIZED),
79 /**
80 * minimized window state
81 */
82 SHOWMINIMIZED(SW_SHOWMINIMIZED);
83
84 final int swShow;
85
86 private static ShowCmd valueOf(int swShow) {
87 for (ShowCmd cmd : values()) {
88 if (cmd.swShow == swShow) {
89 return cmd;
90 }
91 }
92 return null;
93 }
94
95 private ShowCmd(int swShow) {
96 this.swShow = swShow;
97 }
98 }
99 private String arguments;
100 private String toolTipText;
101 private File srcFile;
102 private int iconIndex = -1;
103 private String iconLocation;
104 private String targetFile;
105 private String workingDirectory;
106 private short hotkey;
107 private int showCmd = SW_SHOWNORMAL;
108
109 /**
110 * Create a new <code>LnkFile</code> instance for a specified location.
111 * <p>
112 * {@link File#File(java.lang.String, java.lang.String)}
113 * If <code>load</code> is <code>true</code> the instance of
114 * <code>LnkFile</code> is initialized with the values from the file.
115 * <p>
116 * The native library is also loaded.
117 *
118 * @param directory The parent pathname string
119 * @param name The child pathname
120 * @param load wether or not load the data from existing file.
121 */
122 public LnkFile(final String directory, final String name, final boolean load) {
123 OvNativeLibLoader.loadLib();
124 setSrcFile(directory, name);
125 if (load) {
126 load();
127 }
128 }
129
130 /**
131 * Create a new <code>LnkFile</code> instance for a specified location.
132 * <p>
133 * If <code>load</code> is <code>true</code> the instance of
134 * <code>LnkFile</code> is initialized with the values from the <code>lnkFile</code>.
135 * <p>
136 * The native library is also loaded.
137 *
138 * @param lnkFile The lnkFile to use
139 * @param load wether or not load the data from existing file.
140 */
141 public LnkFile(final File lnkFile, final boolean load) {
142 OvNativeLibLoader.loadLib();
143 if (!lnkFile.getName().endsWith(".lnk")) {
144 throw new IllegalArgumentException("Link file name must end with \".lnk\"");
145 }
146 this.srcFile = lnkFile;
147 if (load) {
148 load();
149 }
150 }
151
152 /**
153 * Returns the arguments of the shortcut.
154 * The path points to an executable (<code>path</code>), the arguments
155 * specified here will be passed to the executable.
156 *
157 * @return The arguments of the shortcut
158 */
159 public String getArguments() {
160 return arguments;
161 }
162
163 /**
164 * Returns the toolTipText for this shortcut.
165 * The toolTipText is visibe to the user if the mouse
166 * hoovers longer over the file.
167 *
168 * @return the description of this shortcut
169 */
170 public String getToolTipText() {
171 return toolTipText;
172 }
173
174 /**
175 * Returns the source of the Link.
176 * This is the file with the .lnk extentiuon.
177 * @return
178 */
179 public File getSrcFile() {
180 return srcFile;
181 }
182
183 /**
184 * Returns the icon index for this shortcut.
185 * This is the index within the .ico file or the index in
186 * the icon resources of a .dll or .exe
187 *
188 * @return the index of the icon within the specified location.
189 */
190 public int getIconIndex() {
191 return iconIndex;
192 }
193
194 /**
195 * Returns the icon location for this shortcut.
196 * This can be a .ico, .dll or .exe file. The <code>iconIndex</code>
197 * indicates the index of the icon within the file.
198 * @return the location of the icon for the shortcut.
199 */
200 public String getIconLocation() {
201 return iconLocation;
202 }
203
204 /**
205 * Returns the taget for this shortcut.
206 * The target is an executabel file , or can be an ordinary
207 * file for example a .txt file.
208 * @return The taget of this shortcut as absolute path.
209 */
210 public String getTargetFile() {
211 return targetFile;
212 }
213
214 /**
215 * Returns the working directory for this shortcut.
216 *
217 * @return The working directory for the shortcut.
218 */
219 public String getWorkingDirectory() {
220 return workingDirectory;
221 }
222
223 /**
224 * Loads the link data from the filesystem.
225 * @throws net.sf.ovanttasks.ovnative.win32.Win32Exception
226 */
227 public void load() throws Win32Exception {
228 load(srcFile.getAbsolutePath());
229 }
230
231 private native void load(String lnkFileName) throws Win32Exception;
232
233 /**
234 * Resolve the link with UI interaction
235 * @throws net.sf.ovanttasks.ovnative.win32.Win32Exception
236 */
237 public void resolve() throws Win32Exception {
238 resolve(srcFile.getAbsolutePath());
239 }
240
241 private native void resolve(String filename) throws Win32Exception;
242
243 /**
244 * Save the link
245 * @param directory
246 * @param name
247 * @throws net.sf.ovanttasks.ovnative.win32.Win32Exception
248 */
249 public void save(final String directory, final String name) throws Win32Exception {
250 setSrcFile(directory, name);
251 save();
252 }
253
254 /**
255 * Save the link
256 * @throws net.sf.ovanttasks.ovnative.win32.Win32Exception
257 */
258 public void save() throws Win32Exception {
259 save(srcFile.getAbsolutePath());
260 }
261
262 private native void save(String filename) throws Win32Exception;
263
264 /**
265 * Set the Arguments
266 * @param arguments the arguments to set.
267 */
268 public void setArguments(final String arguments) {
269 this.arguments = arguments;
270 }
271
272 /**
273 * Set the toolTipText for this shortcut.
274 * The toolTipText is visible toi the user,
275 * if the mouse hoovers over the file.
276 *
277 * @param toolTipText The tooltiptext to display
278 */
279 public void setToolTipText(final String toolTipText) {
280 this.toolTipText = toolTipText;
281 }
282
283 /**
284 * Set the icon location for this shortcut.
285 * The icon will be displayed on the screen.
286 * The file can be an ico,dll or exe the <code>iconindex</code>
287 * is the index in the file.
288 *
289 * Both the file and the index into the file must be specified.
290 * @param iconLocation The path to the file.
291 * @param iconIndex The index of the icon within the file.
292 */
293 public void setIcon(final String iconLocation, final int iconIndex) {
294 this.iconLocation = iconLocation;
295 this.iconIndex = iconIndex;
296 }
297
298 /**
299 * Set the target for this shortcut.
300 *
301 * The target ist the path to the file of this link. If this is an executable,
302 * additional <code>arguments</code> and a <code>workingDirectory</code>
303 * can be provided.
304 *
305 * @param targetFile The target of this link
306 */
307 public void setTargetFile(final String targetFile) {
308 this.targetFile = targetFile;
309 }
310
311 /**
312 * Set the working directory for this shortcut.
313 * The <code>workingDirectory</code> is the directory in which the executable
314 * given by <code>path</code> will be executed.
315 *
316 *
317 * @param workingDirectory The working directory
318 */
319 public void setWorkingDirectory(final String workingDirectory) {
320 this.workingDirectory = workingDirectory;
321 }
322
323 /**
324 * Sets the hotkey.
325 *
326 * The hotkey is used to execute the link given by <code>path>/code> with keystoken.
327 * The following modifiers will be supported:
328 * <li>
329 * <item>Alt the Alt key.</item>
330 * <item>Ctrl the Ctrl key,</item>
331 * <item>Shift the Shift key</item>
332 * </li>
333 * Each separated by " + ".
334 * Example: <i>Ctrl + Shift + Alt + A</i>.
335 * @param hotkey The hotkey as String.
336 */
337 public void setHotkey(final String hotkey) {
338 this.hotkey = HotKeyTools.parseString(hotkey);
339 }
340
341 /**
342 * Returns the hotkey.
343 * The Hotkey will be returned as String {@link setHotKey}.
344 * @return the hotkey as String
345 */
346 public String getHotkey() {
347 return HotKeyTools.toString(hotkey);
348 }
349
350 /**
351 * The <code>file</code> in the filesystem which is the source of this link.
352 *
353 * The srcFile holds the real name of the shelllink.
354 * If the file extention ".lnk" is not given, it will be appended.
355 * The extention (.lnk)is usually not visible on Windows.
356 * @param directory The name of the directory.
357 * @param name The filenae in the directory
358 */
359 private void setSrcFile(final String directory, String name) {
360 if (!name.endsWith(".lnk")) {
361 name += ".lnk";
362 }
363 srcFile = new File(directory, name);
364 }
365 }