1/*
2 * BrowserController.m created by phr on 2000-10-21 09:35:35 +0000
3 *
4 * Project ImageViewer
5 *
6 * Created with ProjectCenter - http://www.gnustep.org
7 *
8 * $Id: BrowserController.m,v 1.9.2.1 2003/08/01 15:30:49 probert Exp $
9 */
10
11#include "BrowserController.h"
12#include "ImageCache.h"
13#include "ImageHolder.h"
14
15@implementation BrowserController
16
17- (id)initWithBrowser:(NSBrowser *)browser
18{
19  NSAssert(browser, _(@"No browser provided!"));
20
21  if ((self = [super init]))
22  {
23    _browser = [browser retain];
24    [_browser setDelegate:self];
25
26    _files = [[NSMutableArray alloc] init];
27    _imageCache = [ImageCache sharedCache];
28  }
29  return self;
30}
31
32- (void)dealloc
33{
34  RELEASE(_browser);
35  RELEASE(_files);
36  RELEASE(_path);
37  RELEASE(_imageView);
38
39  RELEASE(currentPath);
40  RELEASE(currentImgRep);
41  RELEASE(currentAttribs);
42
43  [super dealloc];
44}
45
46- (id)delegate
47{
48    return delegate;
49}
50
51- (void)setDelegate:(id)aDelegate
52{
53    delegate = aDelegate;
54}
55
56- (void)setPath:(NSString *)path
57{
58  NSFileManager  *fm = [NSFileManager defaultManager];
59  NSString       *file;
60  NSArray        *directoryContent = [fm directoryContentsAtPath:path];
61  NSArray        *fileTypes = [NSImage imageFileTypes];
62  NSEnumerator   *enumerator;
63  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
64
65  AUTORELEASE(_path);
66  _path = [path copy];
67
68  [_files removeAllObjects];
69
70  if( [[ud objectForKey:@"OpenRec"] isEqualToString:@"YES"] )
71  {
72    enumerator = [fm enumeratorAtPath:path];
73  }
74  else
75  {
76    enumerator = [directoryContent objectEnumerator];
77  }
78
79  while(file = [enumerator nextObject])
80  {
81    if ([fileTypes containsObject:[file pathExtension]])
82    {
83      [_files addObject:file];
84    }
85  }
86
87  [_files sortUsingSelector:@selector(compare:)];
88}
89
90- (void)setImageView:(NSImageView *)imageView
91{
92  AUTORELEASE(_imageView);
93  _imageView = RETAIN(imageView);
94}
95
96- (int)browser:(NSBrowser *)sender numberOfRowsInColumn:(int)column
97{
98  if ( _files != nil )
99  {
100    return [_files count];
101  }
102
103  return 0;
104}
105
106- (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(int)row
107         column:(int)column
108{
109  if ([sender isEqual:_browser])
110  {
111    [cell setLeaf:YES];
112    [cell setStringValue:[_files objectAtIndex:row]];
113  }
114}
115
116- (BOOL)browser:(NSBrowser *)sender isColumnValid:(int)column
117{
118}
119
120- (void)showImage:(NSBrowser *)sender
121{
122  NSString *pth = [_path stringByAppendingPathComponent:
123    [[sender selectedCell] stringValue]];
124
125  NSImage *image;
126  ImageHolder *holder;
127  NSRect vframe;
128  NSRect frame = NSMakeRect(0,0,10,10);
129  NSArray *array;
130
131  if (![[NSFileManager defaultManager] isReadableFileAtPath:pth])
132  {
133    // Substitute
134    pth = [[NSBundle mainBundle] pathForResource:@"genericImage"
135                                          ofType:@"tiff"];
136  }
137
138  AUTORELEASE(currentPath);
139  currentPath = [pth copy];
140
141  AUTORELEASE(currentAttribs);
142  AUTORELEASE(currentImgRep);
143
144  if (!(holder = [_imageCache imageHolderForKey:pth]))
145  {
146    NSFileManager *fm = [NSFileManager defaultManager];
147
148    image = [[NSImage alloc] initWithContentsOfFile:pth];
149
150    //    array = [NSImageRep imageRepsWithContentsOfFile:currentPath];
151    if( image == nil )
152    {
153      NSRunAlertPanel(_(@"Attention!"),
154                      _(@"Couldn't load image at %@"),
155                      _(@"Abort!"),nil,nil,pth);
156
157      currentPath = nil;
158      currentAttribs = nil;
159      currentImgRep = nil;
160      return;
161    }
162    else
163    {
164      [image setBackgroundColor: [NSColor darkGrayColor]];
165      array = [image representations];
166      currentAttribs = [fm fileAttributesAtPath:currentPath traverseLink:NO];
167
168      holder = [[ImageHolder alloc] initWithImage:image
169                                             reps:array
170                                       attributes:currentAttribs];
171
172      [_imageCache cacheImageHolder:holder forKey:pth];
173      RELEASE(holder);
174      RELEASE(image);
175    }
176
177  }
178  else
179  {
180    array = [holder imageReps];
181    image = [holder image];
182    currentAttribs = [holder attributes];
183  }
184
185  reps  = [array count];
186  currentImgRep = [array objectAtIndex:0];
187
188  RETAIN(currentImgRep);
189  RETAIN(currentAttribs);
190
191  currentImgSize = [image size];
192  frame.size = [image size];
193
194  [_imageView setImage:image];
195  [_imageView setFrame:frame];
196
197  /*
198  vframe = [[_imageView superview] frame];
199  if (frame.size.width < vframe.size.width) {
200    int wd = (vframe.size.width - frame.size.width)/2;
201
202    frame.origin.x   += wd;
203    frame.size.width += wd;
204  }
205
206  if (frame.size.height < vframe.size.height) {
207    int wd = (vframe.size.height - frame.size.height)/2;
208
209    frame.origin.y   += wd;
210    frame.size.height += wd;
211  }
212  */
213
214  if(delegate &&
215    [delegate respondsToSelector:@selector(browserSelectionDidChange:)])
216  {
217    [delegate browserSelectionDidChange:self];
218  }
219
220}
221
222- (NSString *)currentPath
223{
224  return currentPath;
225}
226
227- (NSImageRep *)currentImgRep
228{
229  return currentImgRep;
230}
231
232- (NSDictionary *)currentAttribs
233{
234  return currentAttribs;
235}
236
237- (int)currentImgRepCount
238{
239  return reps;
240}
241
242- (NSSize)currentImgSize
243{
244  return currentImgSize;
245}
246
247@end
248
249