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
|
---|