libs-gui/Source/NSSplitViewController.m

209 lines
5.5 KiB
Mathematica
Raw Permalink Normal View History

2020-07-20 05:02:22 +00:00
/* Implementation of class NSSplitViewController
Copyright (C) 2020 Free Software Foundation, Inc.
By: Gregory John Casamento
Date: Mon 20 Jul 2020 12:55:02 AM EDT
This file is part of the GNUstep Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110 USA.
*/
2020-07-20 06:17:00 +00:00
#import <Foundation/NSArray.h>
2020-07-21 10:38:47 +00:00
#import <Foundation/NSArchiver.h>
2020-07-20 06:17:00 +00:00
#import "AppKit/NSSplitView.h"
2020-07-20 05:02:22 +00:00
#import "AppKit/NSSplitViewController.h"
2020-07-20 06:17:00 +00:00
#import "AppKit/NSSplitViewItem.h"
#import "AppKit/NSView.h"
#import "NSViewPrivate.h"
2020-07-21 10:38:47 +00:00
2020-07-20 06:17:00 +00:00
#import "GSFastEnumeration.h"
2020-07-20 05:02:22 +00:00
@implementation NSSplitViewController
2020-07-20 06:17:00 +00:00
// return splitview...
- (NSSplitView *) splitView
{
2020-07-21 10:38:47 +00:00
return (NSSplitView *)[self view];
2020-07-20 21:26:40 +00:00
}
- (void) setSplitView: (NSSplitView *)splitView
{
[self setView: splitView];
[splitView setDelegate: self];
2020-07-20 06:17:00 +00:00
}
- (NSSplitViewItem *) splitViewItemForViewController: (NSViewController *)vc
{
2020-07-20 07:20:34 +00:00
FOR_IN (NSSplitViewItem*, svi, _splitViewItems)
2020-07-20 06:17:00 +00:00
if ([svi viewController] == vc)
{
return svi;
}
2020-07-20 07:20:34 +00:00
END_FOR_IN (_splitViewItems);
2020-07-20 06:17:00 +00:00
return nil;
}
- (CGFloat) minimumThicknessForInlineSidebars
{
return _minimumThicknessForInlineSidebars;
}
2020-07-26 04:20:09 +00:00
- (void) setMinimumThicknessForInlineSidebars: (CGFloat)value
{
_minimumThicknessForInlineSidebars = value;
}
2020-07-20 06:17:00 +00:00
// manage splitview items...
- (NSArray *) splitViewItems
{
return _splitViewItems;
}
2020-07-26 04:20:09 +00:00
- (void) setSplitViewItems: (NSArray *)items
{
NSMutableArray *mutableItems = [items mutableCopy];
ASSIGN(_splitViewItems, mutableItems);
}
2020-07-20 06:17:00 +00:00
- (void) addSplitViewItem: (NSSplitViewItem *)item
{
[self insertSplitViewItem: item atIndex: [_splitViewItems count]];
2020-07-20 06:17:00 +00:00
}
- (void) insertSplitViewItem: (NSSplitViewItem *)item atIndex: (NSInteger)index
{
NSSplitView *sv = [self splitView];
NSViewController *vc = [item viewController];
if (vc != nil)
{
NSView *v = [vc view];
if (v != nil)
{
[sv _insertSubview: v atIndex: index];
}
}
[_splitViewItems insertObject: item atIndex: index];
2020-07-20 06:17:00 +00:00
}
- (void) removeSplitViewItem: (NSSplitViewItem *)item
{
NSViewController *vc = [item viewController];
if (vc != nil)
{
NSView *v = [vc view];
if (v != nil)
{
[[self splitView] removeSubview: v];
}
}
2020-07-20 06:17:00 +00:00
[_splitViewItems removeObject: item];
}
2020-07-26 04:20:09 +00:00
- (void) dealloc
{
RELEASE(_splitViewItems);
[super dealloc];
}
2020-07-20 06:17:00 +00:00
// instance methods...
2020-07-26 06:15:53 +00:00
- (NSRect) splitView: (NSSplitView *)splitView additionalEffectiveRectOfDividerAtIndex: (NSInteger)dividerIndex
2020-07-20 06:17:00 +00:00
{
2020-07-21 10:38:47 +00:00
return [splitView frame];
2020-07-20 06:17:00 +00:00
}
2020-07-26 06:15:53 +00:00
- (BOOL) splitView: (NSSplitView *)splitView canCollapseSubview: (NSView *)subview
2020-07-20 06:17:00 +00:00
{
2020-07-21 10:38:47 +00:00
return YES;
2020-07-20 06:17:00 +00:00
}
2020-07-26 06:15:53 +00:00
- (NSRect) splitView: (NSSplitView *)splitView effectiveRect: (NSRect)proposedEffectiveRect forDrawnRect: (NSRect)drawnRect
ofDividerAtIndex: (NSInteger)dividerIndex
2020-07-20 06:17:00 +00:00
{
2020-07-21 10:38:47 +00:00
return proposedEffectiveRect;
2020-07-20 06:17:00 +00:00
}
2020-07-26 06:15:53 +00:00
- (BOOL) splitView:(NSSplitView *)splitView shouldCollapseSubview: (NSView *)subview forDoubleClickOnDividerAtIndex: (NSInteger)dividerIndex
2020-07-20 06:17:00 +00:00
{
2020-07-21 10:38:47 +00:00
return YES;
2020-07-20 06:17:00 +00:00
}
2020-07-26 06:15:53 +00:00
- (BOOL) splitView: (NSSplitView *)splitView shouldHideDividerAtIndex: (NSInteger)dividerIndex
2020-07-20 06:17:00 +00:00
{
2020-07-21 10:38:47 +00:00
return YES;
2020-07-20 06:17:00 +00:00
}
- (IBAction)toggleSidebar:(id)sender
{
2020-07-21 10:38:47 +00:00
NSLog(@"Toggle");
2020-07-20 06:17:00 +00:00
}
// NSCoding
- (instancetype) initWithCoder: (NSCoder *)coder
{
2020-07-21 10:38:47 +00:00
self = [super initWithCoder: coder];
if ([coder allowsKeyedCoding])
{
if ([coder containsValueForKey: @"NSSplitView"])
{
NSSplitView *sv = [coder decodeObjectForKey: @"NSSplitView"];
[self setSplitView: sv];
}
if ([coder containsValueForKey: @"NSSplitViewItems"])
{
NSArray *items = [coder decodeObjectForKey: @"NSSplitViewItems"];
[_splitViewItems addObjectsFromArray: items];
}
2020-07-26 04:20:09 +00:00
if ([coder containsValueForKey: @"NSMinimumThicknessForInlineSidebars"])
{
2020-07-26 04:28:52 +00:00
_minimumThicknessForInlineSidebars =
[coder decodeFloatForKey: @"NSMinimumThicknessForInlineSidebars"];
2020-07-26 04:20:09 +00:00
}
}
else
{
NSSplitView *sv = [coder decodeObject];
[self setSplitView: sv];
NSArray *items = [coder decodeObject];
[self setSplitViewItems: items];
[coder decodeValueOfObjCType: @encode(CGFloat) at: &_minimumThicknessForInlineSidebars];
2020-07-21 10:38:47 +00:00
}
return self;
2020-07-20 06:17:00 +00:00
}
- (void) encodeWithCoder: (NSCoder *)coder
{
2020-07-26 04:20:09 +00:00
[super encodeWithCoder: coder];
if ([coder allowsKeyedCoding])
{
NSSplitView *sv = [coder decodeObjectForKey: @"NSSplitView"];
[self setSplitView: sv];
NSArray *items = [coder decodeObjectForKey: @"NSSplitViewItems"];
[_splitViewItems addObjectsFromArray: items];
2020-07-26 04:28:52 +00:00
_minimumThicknessForInlineSidebars =
[coder decodeFloatForKey: @"NSMinimumThicknessForInlineSidebars"];
2020-07-26 04:20:09 +00:00
}
else
{
[coder encodeObject: [self splitView]];
[coder encodeObject: [self splitViewItems]];
2020-07-26 04:28:52 +00:00
[coder encodeValueOfObjCType: @encode(CGFloat)
at: &_minimumThicknessForInlineSidebars];
2020-07-26 04:20:09 +00:00
}
2020-07-20 06:17:00 +00:00
}
2020-07-20 05:02:22 +00:00
@end