1/*
2
3  PreferencesController.m
4  Zipper
5
6  Copyright (C) 2012 Free Software Foundation, Inc
7
8  Authors: Dirk Olmes <dirk@xanthippe.ping.de>
9           Riccardo Mottola <rm@gnu.org>
10
11  This application is free software; you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by the Free
13  Software Foundation; either version 2 of the License, or (at your option)
14  any later version.
15
16  This program is distributed in the hope that it will be useful, but
17  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18  or FITNESS FOR A PARTICULAR PURPOSE.
19  See the GNU General Public License for more details
20
21 */
22
23#import <Foundation/Foundation.h>
24#import <AppKit/AppKit.h>
25
26#import "PreferencesController.h"
27#import "Preferences.h"
28#import "Archive.h"
29
30#define TAG_TAR		1
31#define TAG_UNZIP	2
32#define TAG_RAR		3
33#define TAG_LHA		4
34#define TAG_LZX		5
35#define TAG_SEVEN_ZIP	6
36#define TAG_ZIP		7
37#define TAG_GZIP	8
38#define TAG_GUNZIP	9
39#define TAG_BZIP2	10
40#define TAG_BUNZIP2	11
41#define TAG_UNARJ	12
42#define TAG_UNACE	13
43#define TAG_ZOO		14
44#define TAG_XZ		15
45
46@implementation PreferencesController : NSObject
47
48- (id)init
49{
50  NSString *string;
51  BOOL tarFlag;
52
53  [super init];
54  [NSBundle loadNibNamed: @"Preferences" owner: self];
55
56  // tar
57  string = [Preferences tarExecutable];
58  if (!string)
59    string = @"";
60  [_tarTextField setStringValue:string];
61
62  // unzip
63  string = [Preferences unzipExecutable];
64  if (!string)
65    string = @"";
66  [_unzipTextField setStringValue:string];
67
68  // zip
69  string = [Preferences zipExecutable];
70  if (!string)
71    string = @"";
72  [_zipTextField setStringValue:string];
73
74  // rar
75  string = [Preferences rarExecutable];
76  if (!string)
77    string = @"";
78  [_rarTextField setStringValue:string];
79
80  // lha
81  string = [Preferences lhaExecutable];
82  if (!string)
83    string = @"";
84  [_lhaTextField setStringValue:string];
85
86  // lzx
87  string = [Preferences lzxExecutable];
88  if (!string)
89    string = @"";
90  [_lzxTextField setStringValue:string];
91
92  // 7z
93  string = [Preferences sevenZipExecutable];
94  if (!string)
95    string = @"";
96  [_sevenZipTextField setStringValue:string];
97
98  // gzip
99  string = [Preferences gzipExecutable];
100  if (!string)
101    string = @"";
102  [_gzipTextField setStringValue:string];
103
104  // gunzip
105  string = [Preferences gunzipExecutable];
106  if (!string)
107    string = @"";
108  [_gunzipTextField setStringValue:string];
109
110  // bzip2
111  string = [Preferences bzip2Executable];
112  if (!string)
113    string = @"";
114  [_bzip2TextField setStringValue:string];
115
116  // bunzip2
117  string = [Preferences bunzip2Executable];
118  if (!string)
119    string = @"";
120  [_bunzip2TextField setStringValue:string];
121
122  // unarj
123  string = [Preferences unarjExecutable];
124  if (!string)
125    string = @"";
126  [_unarjTextField setStringValue:string];
127
128  // unace
129  string = [Preferences unaceExecutable];
130  if (!string)
131    string = @"";
132  [_unaceTextField setStringValue:string];
133
134  // zoo
135  string = [Preferences zooExecutable];
136  if (!string)
137    string = @"";
138  [_zooTextField setStringValue:string];
139
140  // xz
141  string = [Preferences xzExecutable];
142  if (!string)
143    string = @"";
144  [_xzTextField setStringValue:string];
145
146  // bsd tar checkbox
147  tarFlag = [Preferences isBsdTar];
148  [_bsdTarButton setState:tarFlag];
149
150  // default open app text field
151  string = [[Preferences defaultOpenApp] lastPathComponent];
152  if (!string)
153    string = @"";
154  [_defaultOpenApp setStringValue:string];
155
156  return self;
157}
158
159- (void)awakeFromNib
160{
161  NSClipView *cView;
162
163  NSLog(@"fix scroll");
164  cView = [scrollView contentView];
165  [cView scrollToPoint: NSMakePoint(0.0, NSMaxY([[scrollView documentView] frame])-NSHeight([cView bounds]))];
166  [scrollView reflectScrolledClipView: cView];
167}
168
169- (void)dealloc
170{
171        [_panel release];
172        [_archiveClass release];
173        [super dealloc];
174}
175
176/**
177 * runs the Preferences Panel in a modal event loop
178 */
179- (void)showPreferencesPanel
180{
181  [NSApp runModalForWindow:_panel];
182  // control flow returns to the panel ... until 'ok' or 'cancel' is pressed
183
184  [_panel close];
185}
186
187-(void)windowWillClose:(NSNotification *)aNotification
188{
189  [NSApp stopModal];
190}
191
192- (IBAction)okPressed:(id)sender
193{
194	NSString *string;
195
196	NS_DURING
197		string = [_tarTextField stringValue];
198		[Preferences setTarExecutable:string];
199
200		string = [_unzipTextField stringValue];
201		[Preferences setUnzipExecutable:string];
202
203		string = [_zipTextField stringValue];
204		[Preferences setZipExecutable:string];
205
206		string = [_rarTextField stringValue];
207		[Preferences setRarExecutable:string];
208
209		string = [_lhaTextField stringValue];
210		[Preferences setLhaExecutable:string];
211
212		string = [_lzxTextField stringValue];
213		[Preferences setLzxExecutable:string];
214
215		string = [_sevenZipTextField stringValue];
216		[Preferences setSevenZipExecutable:string];
217
218		string = [_gzipTextField stringValue];
219		[Preferences setGzipExecutable:string];
220
221		string = [_gunzipTextField stringValue];
222		[Preferences setGunzipExecutable:string];
223
224		string = [_bzip2TextField stringValue];
225		[Preferences setBzip2Executable:string];
226
227		string = [_bunzip2TextField stringValue];
228		[Preferences setBunzip2Executable:string];
229
230		string = [_unarjTextField stringValue];
231		[Preferences setUnarjExecutable:string];
232
233		string = [_unaceTextField stringValue];
234		[Preferences setUnaceExecutable:string];
235
236		string = [_zooTextField stringValue];
237		[Preferences setZooExecutable:string];
238
239		string = [_xzTextField stringValue];
240		[Preferences setXzExecutable:string];
241
242		[Preferences setIsBsdTar:[_bsdTarButton state]];
243		[Preferences save];
244
245		[_panel performClose:self];
246	NS_HANDLER
247		NSRunAlertPanel(@"Error in Preferences", [localException reason], nil, nil, nil);
248	NS_ENDHANDLER
249}
250
251- (IBAction)cancelPressed:(id)sender
252{
253  [_panel performClose:self];
254}
255
256- (IBAction)findExecutable:(id)sender
257{
258	NSOpenPanel *openPanel;
259	int rc;
260
261	openPanel = [NSOpenPanel openPanel];
262	[openPanel setTitle:@"Find executable"];
263	[openPanel setCanChooseFiles:YES];
264	[openPanel setCanChooseDirectories:NO];
265
266	rc = [openPanel runModalForDirectory:@"/" file:nil types:nil];
267	if (rc == NSOKButton)
268	{
269		NSString *path = [openPanel filename];
270
271		NS_DURING
272			switch ([sender tag])
273			{
274				case TAG_TAR:
275					[_tarTextField setStringValue:path];
276					[Preferences setTarExecutable:path];
277					break;
278
279				case TAG_UNZIP:
280					[_unzipTextField setStringValue:path];
281					[Preferences setUnzipExecutable:path];
282					break;
283
284				case TAG_ZIP:
285					[_zipTextField setStringValue:path];
286					[Preferences setZipExecutable:path];
287					break;
288
289				case TAG_RAR:
290					[_rarTextField setStringValue:path];
291					[Preferences setRarExecutable:path];
292					break;
293
294				case TAG_LHA:
295					[_lhaTextField setStringValue:path];
296					[Preferences setLhaExecutable:path];
297					break;
298
299				case TAG_LZX:
300					[_lzxTextField setStringValue:path];
301					[Preferences setLzxExecutable:path];
302					break;
303
304				case TAG_SEVEN_ZIP:
305					[_sevenZipTextField setStringValue:path];
306					[Preferences setSevenZipExecutable:path];
307					break;
308
309				case TAG_GZIP:
310					[_gzipTextField setStringValue:path];
311					[Preferences setGzipExecutable:path];
312					break;
313
314				case TAG_GUNZIP:
315					[_gunzipTextField setStringValue:path];
316					[Preferences setGunzipExecutable:path];
317					break;
318
319				case TAG_BZIP2:
320					[_bzip2TextField setStringValue:path];
321					[Preferences setBzip2Executable:path];
322					break;
323
324				case TAG_BUNZIP2:
325					[_bunzip2TextField setStringValue:path];
326					[Preferences setBunzip2Executable:path];
327					break;
328
329				case TAG_UNARJ:
330					[_unarjTextField setStringValue:path];
331					[Preferences setUnarjExecutable:path];
332					break;
333
334				case TAG_UNACE:
335					[_unaceTextField setStringValue:path];
336					[Preferences setUnaceExecutable:path];
337					break;
338
339				case TAG_ZOO:
340					[_zooTextField setStringValue:path];
341					[Preferences setZooExecutable:path];
342					break;
343
344				case TAG_XZ:
345					[_xzTextField setStringValue:path];
346					[Preferences setXzExecutable:path];
347					break;
348
349				default:
350					[NSException raise:NSInvalidArgumentException
351						format:@"invalid tag of find button"];
352			}
353		NS_HANDLER
354			NSRunAlertPanel(@"Error in Preferences", [localException reason], nil, nil, nil);
355		NS_ENDHANDLER
356	}
357}
358
359- (IBAction)findDefaultOpenApp:(id)sender
360{
361	NSOpenPanel *openPanel;
362	NSString *gnustepSystemApps;
363	int rc;
364
365	gnustepSystemApps = [NSSearchPathForDirectoriesInDomains(NSApplicationDirectory,
366				NSSystemDomainMask, YES) objectAtIndex:0];
367
368	openPanel = [NSOpenPanel openPanel];
369	[openPanel setTitle:@"Find default open app"];
370	[openPanel setTreatsFilePackagesAsDirectories:YES];
371	[openPanel setCanChooseFiles:NO];
372	[openPanel setCanChooseDirectories:YES];
373
374	rc = [openPanel runModalForDirectory:gnustepSystemApps file:nil types:nil];
375	if (rc == NSOKButton)
376	{
377		[_defaultOpenApp setStringValue:[[openPanel filename] lastPathComponent]];
378		[Preferences setDefaultOpenApp:[openPanel filename]];
379	}
380}
381
382@end
383