[102] | 1 | //
|
---|
| 2 | // NJRSplitView.m
|
---|
| 3 | // Pester
|
---|
| 4 | //
|
---|
| 5 | // Created by Nicholas Riley on Thu Feb 20 2003.
|
---|
| 6 | // Copyright (c) 2003 Nicholas Riley. All rights reserved.
|
---|
| 7 | //
|
---|
| 8 |
|
---|
| 9 | #import "NJRSplitView.h"
|
---|
| 10 |
|
---|
| 11 |
|
---|
| 12 | @implementation NJRSplitView
|
---|
| 13 |
|
---|
| 14 | // inspiration (but very little code remaining) from <http://cocoa.mamasam.com/COCOADEV/2003/02/1/55911.php>
|
---|
| 15 | // XXX need to generalize: assumes the split is vertical, and you want to collapse a previous view
|
---|
| 16 | // XXX shouldn't set width to 0 as it can destroy layouts, but we have no other choice
|
---|
| 17 |
|
---|
| 18 | - (void)collapseSubview:(NSView *)subview;
|
---|
| 19 | {
|
---|
| 20 | NSSize size = [subview frame].size;
|
---|
| 21 | NSAssert([self isVertical] && size.width > 1, @"unsupported configuration");
|
---|
| 22 | expandedWidth = size.width;
|
---|
| 23 | size.width = 0;
|
---|
| 24 | [subview setFrameSize: size];
|
---|
| 25 | [self setNeedsDisplay: YES];
|
---|
| 26 | }
|
---|
| 27 |
|
---|
| 28 | // XXX this is a horrendous hack to work around NSSplitView bugs, and leaks memory
|
---|
| 29 | - (void)expandSubview:(NSView *)subview;
|
---|
| 30 | {
|
---|
| 31 | NSArray *subviews = [self subviews];
|
---|
| 32 | NSAssert([subviews count] == 2, @"unsupported configuration");
|
---|
| 33 | NSBox *leftView = [subviews objectAtIndex: 0];
|
---|
| 34 | NSView *rightView = [subviews objectAtIndex: 1];
|
---|
| 35 | NSRect leftFrame = [leftView frame], rightFrame = [rightView frame];
|
---|
| 36 | NSAssert([self isVertical] && subview == leftView, @"unsupported configuration");
|
---|
| 37 | if (expandedWidth == 0) {
|
---|
| 38 | expandedWidth = (rightFrame.size.width - [self dividerThickness]) / 2;
|
---|
| 39 | }
|
---|
| 40 | if ([[self delegate] respondsToSelector: @selector(splitView:constrainMaxCoordinate:ofSubviewAt:)]) {
|
---|
| 41 | expandedWidth = [[self delegate] splitView: self constrainMaxCoordinate: expandedWidth ofSubviewAt: 0];
|
---|
| 42 | }
|
---|
| 43 | // begin hack
|
---|
| 44 | NSBox *newLeftView = [[NSBox alloc] initWithFrame: leftFrame];
|
---|
| 45 | [newLeftView setBorderType: [leftView borderType]];
|
---|
| 46 | [newLeftView setTitlePosition: [leftView titlePosition]];
|
---|
| 47 | [newLeftView setBoxType: [leftView boxType]];
|
---|
| 48 | [newLeftView setAutoresizingMask: [leftView autoresizingMask]];
|
---|
| 49 | [newLeftView setContentViewMargins: [leftView contentViewMargins]];
|
---|
| 50 | NSView *leftContentView = [leftView contentView];
|
---|
| 51 | [leftContentView retain];
|
---|
| 52 | [leftContentView removeFromSuperviewWithoutNeedingDisplay];
|
---|
| 53 | [newLeftView setContentView: leftContentView];
|
---|
| 54 | [leftContentView release];
|
---|
| 55 | leftFrame.origin = NSZeroPoint;
|
---|
| 56 | rightFrame.origin.x += expandedWidth;
|
---|
| 57 | leftFrame.size.width = expandedWidth;
|
---|
| 58 | rightFrame.size.width -= expandedWidth;
|
---|
| 59 | [leftView removeFromSuperviewWithoutNeedingDisplay];
|
---|
| 60 | [rightView retain];
|
---|
| 61 | [rightView removeFromSuperviewWithoutNeedingDisplay];
|
---|
| 62 | [newLeftView setFrame: leftFrame];
|
---|
| 63 | [rightView setFrame: rightFrame];
|
---|
| 64 | [self addSubview: newLeftView];
|
---|
| 65 | [self addSubview: rightView];
|
---|
| 66 | [newLeftView release];
|
---|
| 67 | [rightView release];
|
---|
| 68 | // end hack
|
---|
| 69 | [self setNeedsDisplay: YES];
|
---|
| 70 | }
|
---|
| 71 |
|
---|
| 72 | - (void)mouseDown:(NSEvent *)event;
|
---|
| 73 | {
|
---|
| 74 | if ([event clickCount] == 2) {
|
---|
| 75 | NSPoint location = [self convertPoint: [event locationInWindow] fromView: nil];
|
---|
| 76 | NSArray *subviews = [self subviews];
|
---|
| 77 | NSView *leftView = [subviews objectAtIndex: 0];
|
---|
| 78 | if (NSPointInRect(location, [leftView frame]) ||
|
---|
| 79 | NSPointInRect(location, [[subviews objectAtIndex: 1] frame])) return;
|
---|
| 80 | if ([self isSubviewCollapsed: leftView]) {
|
---|
| 81 | [self expandSubview: leftView];
|
---|
| 82 | } else {
|
---|
| 83 | [self collapseSubview: leftView];
|
---|
| 84 | }
|
---|
| 85 | }
|
---|
| 86 | [super mouseDown: event];
|
---|
| 87 | }
|
---|
| 88 |
|
---|
| 89 | - (BOOL)isSubviewCollapsed:(NSView *)subview;
|
---|
| 90 | {
|
---|
| 91 | NSRect frame = [subview frame];
|
---|
| 92 | if (frame.origin.x == 1e6) return YES;
|
---|
| 93 | if (frame.size.width <= 1) return YES;
|
---|
| 94 | return NO;
|
---|
| 95 | }
|
---|
| 96 |
|
---|
| 97 | @end
|
---|