This is MiscSwitchViewConnectInspector.m in view mode; [Download] [Up]
// Suppress compiler warning about rcsid being unused, yet prevent assembler // code for this function from being produced. inline extern const char *suppressCompilerWarning(void) { static const char *rcsid = "$Id$ cc: "__FILE__" "__DATE__" "__TIME__; return rcsid; } // // ---------- MiscSwitchViewConnectInspector Class Implementation ------------- // // IB MiscSwitchView Connection inspector. // // Written by Art Isbell. // Copyright 1996 by Art Isbell. // Version 1.0. All rights reserved. // // This notice may not be removed from this source code. // // This object is included in the MiscKit by permission from the author // and its use is governed by the MiscKit license, found in the file // "License.rtf" in the MiscKit distribution. Please refer to that file // for a list of all applicable permissions and restrictions. // // ---------------------------------------------------------------------------- // // ----------------------------- Header Files --------------------------------- #import <AppKit/AppKit.h> #import <InterfaceBuilder/InterfaceBuilder.h> #ifndef NOMISC #import <misckit/MiscSwitchViewConnectInspector.h> #import <misckit/MiscSwitchView.h> #import <misckit/MiscDraggableCellMatrix.h> #else NOMISC #import "MiscSwitchViewConnectInspector.h" #import "MiscSwitchView.h" #import "MiscDraggableCellMatrix.h" #endif NOMISC // ---------------- Typedef, Struct, and Union Declarations ------------------- // --------------------- Constant and Enum Definitions ------------------------ enum { MiscConnect = 1, MiscDisconnect }; // Button labels static NSString *MiscConnectLabel = @"Connect"; static NSString *MiscDisconnectLabel = @"Disconnect"; // ------------------------- Function Declarations ---------------------------- @interface MiscSwitchViewConnectInspector(Private) // ---------------------- Private Method Declarations ------------------------- - (void)_replaceBrowser; - (void)_setOkButtonTag:(int)aTag isEnabled:(BOOL)yesNo; - (void)_deselectBrowser; - (NSString *)_contentsOfCellAtIndex:(unsigned)aRow; @end @implementation MiscSwitchViewConnectInspector // ---------------------- Factory Method Definitions -------------------------- // ---------------- Overridden Instance Method Definitions -------------------- - (id)init { self = [super init]; // If self in not nil and inspector nib can't be loaded, autorelease self. if ((self != nil) && ![NSBundle loadNibNamed:@"MiscSwitchViewConnectInspector" owner:self]) { [self autorelease]; self = nil; } return self; } - (void)ok:(id)aSender { MiscSwitchView *switchViewL = [self object]; // If aSender is "Connect" button, add view. if ([aSender tag] == MiscConnect) { id connectDestinationL = [NSApp connectDestination]; // If connectDestination is a view, add it to switchView's views. if ([connectDestinationL isKindOfClass:[NSView class]]) { [switchViewL addView:connectDestinationL]; [browser reloadColumn:0]; [browser selectRow:[[browser matrixInColumn:0] numberOfRows] - 1 inColumn:0]; [self _setOkButtonTag:MiscDisconnect isEnabled:YES]; } // connectDestination isn't a view, so open Alert panel. else { NSRunInformationalAlertPanel(@"Error", @"Connection to non-NSView objects not supported.", nil, nil, nil); [NSApp stopConnecting]; } } // aSender is "Disconnect" button, so remove view. else { int selectedRowL = [browser selectedRowInColumn:0]; // If selectedRow is less that the number of switchView views, remove // the indicated view. if (selectedRowL < [switchViewL count]) { [switchViewL removeViewAtIndex:selectedRowL]; [browser reloadColumn:0]; // If the last view was removed, deselect browser. [self _deselectBrowser]; [self _setOkButtonTag:MiscConnect isEnabled:YES]; } } [super ok:aSender]; } - (void)revert:(id)sender { // If this isn't the first time revert: is sent, list the switchView's // views. if (!_isFirstConnectingRevert) { // If the browser has already been loaded, reload it. if ([browser isLoaded]) { [browser reloadColumn:0]; } // browser hasn't been loaded, so load it and add self as an observer // for MiscMatrixRowDidMove notifications. else { [browser loadColumnZero]; [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(rowDidMove:) name:MiscMatrixRowDidMove object:[browser matrixInColumn:0]]; } // If a connection is being made, update browser selection. if ([NSApp isConnecting]) { unsigned rowNumberL = [[self object] indexOfView:[NSApp connectDestination]]; // If the connected view is already a switchView view, select the // browser entry for that view and enable the "Disconnect" button. if (rowNumberL != NSNotFound) { if ([browser selectedRowInColumn:0] != rowNumberL) { [browser selectRow:rowNumberL inColumn:0]; } [self _setOkButtonTag:MiscDisconnect isEnabled:YES]; } // The connected view isn't a switchView view, so deselect the // browser cell and enable the "Connect" button. else { [self _deselectBrowser]; [self _setOkButtonTag:MiscConnect isEnabled:YES]; } } // No connection is being made, so deselect the browser cell and // disable the "Connect" button. else { [self _deselectBrowser]; [self _setOkButtonTag:MiscConnect isEnabled:NO]; } [[self window] displayIfNeeded]; [super revert:sender]; } // During the first revert: message, set up ok and revert buttons. These // buttons haven't been assigned in awakeFromNib, else { [self _setOkButtonTag:MiscConnect isEnabled:NO]; _isFirstConnectingRevert = NO; } } - (BOOL)wantsButtons { return YES; } // -------------------- New Instance Method Definitions ----------------------- - (void)awakeFromNib { _isFirstConnectingRevert = YES; // In OS/Mach 4.0 PR2 IB, an installed browser already has column 0 loaded, // so browser must be replaced to use MiscDraggableCellMatrix. Maybe this // will change with later releases. [self _replaceBrowser]; } - (void)selectConnection:(id)aSender { int selectedRowL = [aSender selectedRowInColumn:0]; if (selectedRowL != -1) { MiscSwitchView *switchViewL = [self object]; unsigned maxRowL = [switchViewL count] - 1; if (maxRowL < selectedRowL) { selectedRowL = maxRowL; } // Draw the connection. [NSApp displayConnectionBetween:switchViewL and:[switchViewL viewAtIndex:selectedRowL]]; _isFirstConnectingRevert = YES; [self _setOkButtonTag:MiscDisconnect isEnabled:YES]; } else { [self _setOkButtonTag:MiscConnect isEnabled:NO]; } } - (void)clickConnectButton:(id)aSender { [[self okButton] performClick:aSender]; } - (void)rowDidMove:(NSNotification *)aNotification { NSDictionary *userInfoL = [aNotification userInfo]; MiscSwitchView *switchViewL = [self object]; int oldRowL = [[userInfoL objectForKey:@"OldRow"] intValue]; // Prevent possible release of view when it's removed from its superview. NSView *movedView = [[switchViewL viewAtIndex:oldRowL] retain]; [switchViewL removeViewAtIndex:oldRowL]; [switchViewL addView:movedView atIndex:[[userInfoL objectForKey:@"NewRow"] intValue]]; [movedView release]; [[NSApp activeDocument] touch]; [browser reloadColumn:0]; } // ----------------- Delegate Instance Method Definitions --------------------- - (int)browser:(NSBrowser *)aBrowser numberOfRowsInColumn:(int)aColumn { return [[self object] count]; } - (void)browser:(NSBrowser *)aBrowser willDisplayCell:(id)aCell atRow:(int)aRow column:(int)aColumn { if (aRow < [[self object] count]) { [aCell setStringValue:[self _contentsOfCellAtIndex:aRow]]; } else { [aCell setStringValue:@""]; } [aCell setLeaf:YES]; } @end @implementation MiscSwitchViewConnectInspector(Private) // ---------------------- Private Method Definitions -------------------------- - (void)_replaceBrowser { NSBrowser *newBrowserL = [[NSBrowser allocWithZone:[self zone]] initWithFrame:[browser frame]]; [newBrowserL setAction:[browser action]]; [newBrowserL setTarget:[browser target]]; [newBrowserL setDelegate:[browser delegate]]; [newBrowserL setAllowsBranchSelection:[browser allowsBranchSelection]]; [newBrowserL setAllowsEmptySelection:[browser allowsEmptySelection]]; [newBrowserL setAllowsMultipleSelection:[browser allowsMultipleSelection]]; [newBrowserL setHasHorizontalScroller:[browser hasHorizontalScroller]]; [newBrowserL setMaxVisibleColumns:1]; [newBrowserL setSeparatesColumns:[browser separatesColumns]]; [newBrowserL setTitled:[browser isTitled]]; [newBrowserL setTitle:[browser titleOfColumn:0] ofColumn:0]; [newBrowserL setDoubleAction:@selector(clickConnectButton:)]; [newBrowserL setMatrixClass:[MiscDraggableCellMatrix class]]; [[browser superview] addSubview:newBrowserL]; [newBrowserL release]; [browser removeFromSuperview]; browser = newBrowserL; } - (void)_setOkButtonTag:(int)aTag isEnabled:(BOOL)yesNo { NSButton *revertButtonL; NSButton *okButtonL = [self okButton]; // If aTag differs from okButton's tag, change button label. if ([okButtonL tag] != aTag) { [okButtonL setTag:aTag]; if (aTag == MiscConnect) { [okButtonL setTitle:MiscConnectLabel]; } else { [okButtonL setTitle:MiscDisconnectLabel]; } } // Set button's enabled state, if necessary. if (yesNo != [okButtonL isEnabled]) { [okButtonL setEnabled:yesNo]; } // Ensure that revertButton is disabled, if necessary. revertButtonL = [self revertButton]; if ([revertButtonL isEnabled]) { [revertButtonL setEnabled:NO]; } } - (void)_deselectBrowser { if ([browser selectedColumn] == 0) { [[browser matrixInColumn:0] deselectAllCells]; } } - (NSString *)_contentsOfCellAtIndex:(unsigned)aRow { NSString *contentsL; MiscSwitchView *switchViewL = [self object]; id objectL = [switchViewL viewAtIndex:aRow]; if ([objectL isKindOfClass:[NSMatrix class]]) { NSCell *cellL = [objectL selectedCell]; if (cellL != nil) { objectL = cellL; } else { objectL = [objectL cellAtRow:0 column:0]; } } // NSBox, NSButton, NSSlider, ... if ([objectL respondsToSelector:@selector(title)]) { contentsL = [objectL title]; } // NSControl, NSPopUpButton, ... else if ([objectL respondsToSelector:@selector(stringValue)]) { contentsL = [objectL stringValue]; } else { contentsL = @""; } return [NSString stringWithFormat:@"% d %@ (%@)", aRow, [[objectL class] description], contentsL]; } @end // ------------------------- Function Definitions -----------------------------
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.