Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions JWSplitView/JWSplitView-Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>AppJon.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2013 Jonathan Willing. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
7 changes: 7 additions & 0 deletions JWSplitView/JWSplitView-Prefix.pch
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
//
// Prefix header for all source files of the 'JWSplitView' target in the 'JWSplitView' project
//

#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif
22 changes: 14 additions & 8 deletions JWSplitView/JWSplitView.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,27 +27,33 @@ enum {
typedef NSInteger JWSplitViewDividerStyle;

@class JWDividerView;
@protocol JWSplitViewDelegate;

@interface JWSplitView : NSView

//- (void)setView:(NSView *)view forSplitView:(NSUInteger)splitView;
- (void)addSplitView:(NSView *)view;
- (NSView *)splitViewAtIndex:(NSUInteger)index;
- (JWDividerView *)dividerAtSplitViewIndex:(NSUInteger)index;

@property (nonatomic) NSArray *splitterPositions;
@property (nonatomic, weak) id <JWSplitViewDelegate> delegate;
@property (nonatomic, readwrite) CGFloat dividerThickness;
//@property (nonatomic, copy) TUIViewDrawRect dividerDrawRectBlock;

@property (nonatomic, getter = isHorizontal) BOOL horizontal;

@property (nonatomic, assign) JWSplitViewDividerStyle dividerStyle;

@property (nonatomic, copy) NSString *autosaveName;

//- (NSLayoutPriority)holdingPriorityForSubviewAtIndex:(NSInteger)subviewIndex;
//- (void)setHoldingPriority:(NSLayoutPriority)priority forSubviewAtIndex:(NSInteger)subviewIndex;

@end

@interface JWDividerView : NSView
@property (nonatomic, assign, readonly) NSLayoutConstraint *constraint;
@end

@protocol JWSplitViewDelegate <NSObject>
@optional

- (CGFloat)splitView:(JWSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMaximumPosition ofSubviewAt:(NSInteger)index;
- (CGFloat)splitView:(JWSplitView *)splitView constrainMaxCoordinate:(CGFloat)proposedMaximumPosition ofSubviewAt:(NSInteger)index;

@end

extern NSString * const JWSplitViewDidResizeNotification;
26 changes: 25 additions & 1 deletion JWSplitView/JWSplitView.m
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#import "JWSplitView.h"
#import <objc/runtime.h>

NSString * const JWSplitViewDidResizeNotification = @"JWSplitViewDidResizeNotification";

@class JWDividerView;
typedef void (^JWSplitViewDraggingHandler)(NSEvent *dragEvent, JWDividerView *divider, id sender);

Expand Down Expand Up @@ -194,14 +196,23 @@ - (void)mouseDownOnDivider:(JWDividerView *)divider withEvent:(NSEvent *)downEve
BOOL horizontal = self.horizontal;
CGFloat originalConstant = divider.constraint.constant;

__block JWSplitView *me = self;
self.dragHandler = ^(NSEvent *event, JWDividerView *currentDivider, id sender) {
CGPoint mouseCurrentPoint = [event locationInWindow];

CGFloat deltaY = ceil(mouseCurrentPoint.y - mouseDownPoint.y);
CGFloat deltaX = ceil(mouseDownPoint.x - mouseCurrentPoint.x);

CGFloat newConstant = originalConstant - (horizontal ? deltaX : deltaY);
CGFloat minimum = [me.delegate respondsToSelector:@selector(splitView:constrainMinCoordinate:ofSubviewAt:)] ? [me.delegate splitView:me constrainMinCoordinate:newConstant ofSubviewAt:[me.dividers indexOfObject:currentDivider] - 1] : -1;
CGFloat maximum = [me.delegate respondsToSelector:@selector(splitView:constrainMinCoordinate:ofSubviewAt:)] ? [me.delegate splitView:me constrainMaxCoordinate:newConstant ofSubviewAt:[me.dividers indexOfObject:currentDivider] - 1] : -1;

currentDivider.constraint.constant = newConstant;

if (maximum != -1 && newConstant > maximum) currentDivider.constraint.constant = maximum;
else if (maximum != -1 && newConstant < minimum) currentDivider.constraint.constant = minimum;

[[NSNotificationCenter defaultCenter] postNotificationName:JWSplitViewDidResizeNotification object:me];
};
}

Expand Down Expand Up @@ -252,6 +263,20 @@ - (void)savePositions {
[[NSUserDefaults standardUserDefaults] setObject:data forKey:self.autosaveName];
}

- (NSArray *)splitterPositions
{
NSMutableArray *array = [NSMutableArray array];
for (NSLayoutConstraint *constraint in self.dividerConstraints) [array addObject:@(constraint.constant)];

return array;
}

- (void)setSplitterPositions:(NSArray *)splitterPositions
{
NSInteger limit = splitterPositions.count;
for (NSInteger i = 0; i < limit; i++) [self.dividerConstraints[i] setConstant:[splitterPositions[i] doubleValue]];
}

@end


Expand Down Expand Up @@ -317,7 +342,6 @@ - (void)drawRect:(NSRect)dirtyRect {
@implementation NSView (LayoutExtensions)

static char NSViewLayoutPriorityKey;
static char NSViewLayoutConstraintKey;

- (void)setPriority:(NSLayoutPriority)priority {
NSAssert(priority > NSLayoutPriorityDragThatCanResizeWindow, @"Split view layout priority cannot exceed NSLayoutPriorityDragThatCannotResizeWindow");
Expand Down
2 changes: 2 additions & 0 deletions JWSplitView/en.lproj/InfoPlist.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */

Loading