This is BBBrowserManager.m in view mode; [Download] [Up]
/* BBBrowserManager.m
*
* This is my subclass of the IKSuitcase to allow browsing suitcases like
* the folder objects.
*
* For interface-info see the header file. The comments in this file mostly
* cover only the real implementation details.
*
* Written by: Thomas Engel
* Created: 14.05.1994 (Copyleft)
* Last modified: 14.05.1994
*/
#import "BBBrowserManager.h"
#import "BBAppManager.h"
#import "Inspector.subproj/BBMasterInspector.h"
#import "BBBeaker.h"
#import "BBCameraWindow.h"
#import "BBRegion.h"
#import "BBAtom.h"
#import "BBBond.h"
@implementation BBBrowserManager
- initBrowser:aBrowser root:anObject
{
// Here we setup all the messages for the different mouse clicks and
// we ensure that selecting multiple branches is allowed.
[super initBrowser:aBrowser root:anObject];
[browser setTarget:self];
[browser setAction:@selector(updateSelection:)];
[browser setDoubleAction:@selector(openSelection:)];
[browser setBranchSelectionEnabled:YES];
[shelf setTarget:self];
[shelf setDoubleAction:@selector(openSelection:)];
return self;
}
- free
{
if( selectionList ) [selectionList free];
return [super free];
}
- browser:sender setColumnIcon:cell for:(int)column
{
[super browser:sender setColumnIcon:cell for:(int)column];
[self updateSelection:self];
return self;
}
- updateSelection:sender
{
// We will take the selection that is inside the
int col;
if( selectionList ) [selectionList free];
col = [browser selectedColumn];
if( col == -1 )
{
selectionList = [List new];
[selectionList addObject:root];
}
else
selectionList = [browser getSelectionInColumn:col];
// According to the kind of selection we have different results:
// Here we set the images, inspector etc.
[[[NXApp delegate] inspector] inspectList:selectionList];
return self;
}
- openSelection:sender
{
// Here we will try to open the selection the sender does provide.
// It might be the shelf or the browser itself. We have to create a new
// list here because we don't know what will happen to it!
id aList;
id anObject;
id inspector;
if( sender == shelf )
{
anObject = [[shelf selectedCell] delegate];
if( [anObject respondsTo:@selector(count)] &&
[anObject respondsTo:@selector(objectAt:)] )
aList = [anObject copy];
else
{
aList = [List new];
[aList addObject:anObject];
}
}
else aList = [selectionList copy];
// Depending on the type of selection we will use different approaches.
// If it is one object we will try to use its open: method and exit from
// here.
if( [aList count] == 0 )
{
[aList free];
return self;
}
anObject = [aList objectAt:0];
if( [aList count] == 1 )
{
if( [anObject respondsTo:@selector(open:)] )
{
[aList free];
[anObject open:self];
return self;
}
}
// In every other case we will try if the first object does know its
// displayClass. This should work with a single or multiple selection.
// We will use this class to open the whole selection.
if( [anObject respondsTo:@selector(displayClass)] )
{
[[[anObject displayClass] alloc] initFrom:aList
asPartOf:root];
return self;
}
// In every other case we would just ask the inspector to inspect the
// selection.
// This is currently the browsers active selection. Double clicks from
// the shelf do NOT work! (see the bugs)
else
{
inspector = [[NXApp delegate] inspector];
[inspector makeKeyAndOrderFront:self];
[inspector inspectList:selectionList];
}
return self;
}
- group:sender
{
// We will try to group the selection inside the borwser.
id newGroup;
int i;
if( [selectionList count] < 1 ) return self;
// So it sames there is a valid selection. Depending on the type of a
// selection we have to make different grouping effords.
// Atoms or Bond will lead to a new region inside the relating molecule.
if( [[selectionList objectAt:0] isKindOf:[BBAtom class]] )
{
newGroup = [BBRegion new];
for( i=0; i<[selectionList count]; i++ )
[newGroup addAtom:[selectionList objectAt:i]];
[[[selectionList objectAt:0] molecule] addRegion:newGroup];
}
// Grouping Bonds is almost the same as grouping Atoms
else if( [[selectionList objectAt:0] isKindOf:[BBBond class]] )
{
newGroup = [BBRegion new];
for( i=0; i<[selectionList count]; i++ )
[newGroup addBond:[selectionList objectAt:i]];
[[[selectionList objectAt:0] molecule] addRegion:newGroup];
}
return self;
}
/*
* Here come the methods we will implement to satisfy our window.
* They are useful to change the inspector and handle oher tasks.
*/
- windowWillClose:sender
{
return [root close:sender];
}
- windowDidClose:sender
{
// OK we are closed...so lets make the root everything.
return [root free];
}
- windowDidBecomeMain:sender
{
// Here we get informed when we become the main window. This is the point
// to change the inspector to inspect our selection.
[[[NXApp delegate] inspector] inspectList:selectionList];
return self;
}
- windowDidResignMain:sender
{
return self;
}
/*
* History: 16.05.94 Now we do control the window and browsing stuff.
*
*
* Bugs: - Double clicking from the shelf will no show the inspector.
* This feature will be added once the iconPath can be set via a tree.
*/
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.