This is Controller.m in view mode; [Download] [Up]
#import "Controller.h"
#import "ShelfView.h"
#import <appkit/appkit.h>
@implementation Controller
- init
{
infoPanel = nil;
prefPanel = nil;
return self;
}
- appDidInit:sender
{
NXRect contentRect;
NXScreen *screens;
int screenCount;
id shelfWindow;
id workspace = [Application workspace];
char *mountedList = NULL;
#if 1 || WORK_AROUND_WORKSPACE_BUG
/*
* This code works around a Workspace bug in 3.0 that prevents Workspace
* from dealing with disks effectively if it gets a request for icons
* before it's really initialized. Calling this method before getting
* icons allows Workspace to initialize itself correctly. The bug is
* fixed in 3.1, so we can eventually delete this code.
*/
{
BOOL junk;
char *desc = NULL, *fsType = NULL;
[[Application workspace] getInfoForFileSystemAt:"/"
isRemovable:&junk isWritable:&junk
isUnmountable:&junk description:&desc
type:&fsType];
if (desc)
free(desc);
if (fsType)
free(fsType);
}
#endif
[NXApp getScreens:&screens count:&screenCount];
shelfWindow = [[Window allocFromZone:[self zone]]
initContent:&screens[0].screenBounds
style:NX_TOKENSTYLE
backing:NX_BUFFERED buttonMask:0 defer:NO];
[[shelfWindow contentView] getFrame:&contentRect];
shelfView = [[ShelfView allocFromZone:[shelfWindow zone]]
initFrame:&contentRect];
[[shelfWindow setContentView:shelfView] free];
PSsetwindowlevel(-2147483647, [shelfWindow windowNum]);
[shelfWindow setAvoidsActivation:YES];
[NXApp preventWindowOrdering];
[shelfWindow display];
[shelfWindow orderBack:self];
/*
* UI is up and initialized. Do some other things:
* 1) scan for mounted things that we should stick up on the UI
* NOTE: because we couldn't get the list of removable media
* prior to 3.1, we need to be careful.
* 2) start listening for changes in the file system
*/
if ([workspace respondsTo:@selector(getMountedRemovableMedia:)] &&
[workspace getMountedRemovableMedia:&mountedList])
[self perform:@selector(createViewFor:) withPaths:mountedList];
if (mountedList)
free(mountedList);
[workspace beginListeningForDeviceStatusChanges];
[NXApp hide:self];
return self;
}
/*
* Put up a panel. We have to handle two cases:
* 1) The panel is not present because it hasn't been loaded yet, or
* because the user closed a previous one. In this case, we load the
* panel from the nib section.
* 2) The panel hasn't been closed by the user. In this case, just
* pop up the window.
*/
- doPanel:(id *)panel named:(const char *) name
{
char path[MAXPATHLEN];
id bundle = [NXBundle mainBundle];
if (!*panel && [bundle getPath:path forResource:name ofType:"nib"])
[NXApp loadNibFile:path owner:self withNames:NO fromZone:[self zone]];
[*panel makeKeyAndOrderFront:self];
return self;
}
- doInfo:sender
{
return [self doPanel:&infoPanel named:"Info"];
}
- doPreferences:sender
{
[self doPanel:&prefPanel named:"Preferences"];
[gridValue setIntValue:[shelfView gridValue]];
if ([shelfView gridEnabled])
[gridSwitch setState:YES];
[tileSwitch setState:[shelfView useBackgroundTile]];
return self;
}
/*
* Find out if a window just closed. If it was the info panel or the pref
* panel, forget about its identity, since it will free itself on close.
*/
- windowWillClose:sender
{
if (sender == infoPanel)
infoPanel = nil;
else if (sender == prefPanel) {
[self enableGrid:self]; /* make sure we're in sync */
[self enableBG:self];
prefPanel = nil;
}
return self;
}
- enableGrid:sender
{
unsigned int newValue = [gridValue intValue];
[shelfView setGridValue:newValue];
if ([shelfView gridValue] != newValue)
[gridValue setIntValue:[shelfView gridValue]];
[shelfView setGridEnabled:[gridSwitch state]];
return self;
}
- enableBG:sender
{
[shelfView setBackgroundEnabled:[tileSwitch state]];
return self;
}
- createViewFor:(const char *) fullPath
{
[shelfView createViewForPath:fullPath at:NULL];
return self;
}
- app:sender mounted:(const char *) fullPath
{
[self createViewFor:fullPath];
return self;
}
- app:sender unmounted:(const char *) fullPath
{
[shelfView removeViewForPath:fullPath];
return self;
}
@end
@implementation Object(BriansPathMethods)
- (void) perform:(SEL) sel withPaths:(const char *) paths
{
const char *scan = paths;
char *copy;
char aPath[MAXPATHLEN];
if (!paths || !*paths)
return;
do {
copy = aPath;
while (*scan && *scan != '\t')
*copy++ = *scan++;
*copy = '\0';
if (*scan == '\t')
scan++;
[self perform:sel with:(id) aPath];
} while (*scan);
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.