Skip to content
This repository has been archived by the owner on Aug 18, 2019. It is now read-only.

Commit

Permalink
Initial commit after separated from Fontcase
Browse files Browse the repository at this point in the history
  • Loading branch information
Pieter Omvlee committed Nov 25, 2010
0 parents commit 0106cd3
Show file tree
Hide file tree
Showing 9 changed files with 785 additions and 0 deletions.
25 changes: 25 additions & 0 deletions BCCollectionView+Keyboard.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// BCCollectionView+Keyboard.h
// Fontcase
//
// Created by Pieter Omvlee on 25/11/2010.
// Copyright 2010 Bohemian Coding. All rights reserved.
//

#import "BCCollectionView.h"

@interface BCCollectionView (BCCollectionView_Keyboard)
- (void)keyDown:(NSEvent *)theEvent;

- (void)moveLeft:(id)sender;
- (void)moveLeftAndModifySelection:(id)sender;

- (void)moveRight:(id)sender;
- (void)moveRightAndModifySelection:(id)sender;

- (void)moveUp:(id)sender;
- (void)moveUpAndModifySelection:(id)sender;

- (void)moveDown:(id)sender;
- (void)moveDownAndModifySelection:(id)sender;
@end
108 changes: 108 additions & 0 deletions BCCollectionView+Keyboard.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
//
// BCCollectionView+Keyboard.m
// Fontcase
//
// Created by Pieter Omvlee on 25/11/2010.
// Copyright 2010 Bohemian Coding. All rights reserved.
//

#import "BCCollectionView+Keyboard.h"

@implementation BCCollectionView (BCCollectionView_Keyboard)

- (void)keyDown:(NSEvent *)theEvent
{
[self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
}

- (void)moveLeft:(id)sender
{
NSUInteger index = lastSelectionIndex;
if (index % [self numberOfItemsPerRow] != 0) {
[self deselectAllItems];
[self selectItemAtIndex:index-1];
}
}

- (void)moveLeftAndModifySelection:(id)sender
{
if (lastSelectionIndex % [self numberOfItemsPerRow] != 0) {
NSUInteger index = lastSelectionIndex-1;
if ([selectionIndexes containsIndex:index])
[self deselectItemAtIndex:lastSelectionIndex];
else
[self selectItemAtIndex:index];
self.lastSelectionIndex = index;
}
}

- (void)moveRight:(id)sender
{
NSUInteger index = lastSelectionIndex;
if (index % [self numberOfItemsPerRow] != [self numberOfItemsPerRow]-1) {
[self deselectAllItems];
[self selectItemAtIndex:index+1];
}
}

- (void)moveRightAndModifySelection:(id)sender
{
if (lastSelectionIndex % [self numberOfItemsPerRow] != [self numberOfItemsPerRow]-1) {
NSUInteger index = lastSelectionIndex+1;
if ([selectionIndexes containsIndex:index])
[self deselectItemAtIndex:lastSelectionIndex];
else
[self selectItemAtIndex:index];
self.lastSelectionIndex = index;
}
}

- (void)moveUp:(id)sender
{
NSUInteger index = lastSelectionIndex;
if (index > [self numberOfItemsPerRow]-1) {
[self deselectAllItems];
[self selectItemAtIndex:index-[self numberOfItemsPerRow]];
}
}

- (void)moveUpAndModifySelection:(id)sender
{
if (lastSelectionIndex > [self numberOfItemsPerRow]-1) {
NSUInteger index = lastSelectionIndex - [self numberOfItemsPerRow];
NSRange range = NSMakeRange(index, [self numberOfItemsPerRow]);
if ([selectionIndexes containsIndex:index]) {
range.location++;
[self deselectItemsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];
} else
[self selectItemsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];
self.lastSelectionIndex = index;
}
}

- (void)moveDown:(id)sender
{
NSUInteger index = lastSelectionIndex;
if (index + [self numberOfItemsPerRow] < [contentArray count]) {
[self deselectAllItems];
[self selectItemAtIndex:index + [self numberOfItemsPerRow]];
}
}

- (void)moveDownAndModifySelection:(id)sender
{
NSUInteger index = lastSelectionIndex;
if (index + [self numberOfItemsPerRow] < [contentArray count]) {
NSUInteger index = lastSelectionIndex + [self numberOfItemsPerRow];
NSRange range = NSMakeRange(lastSelectionIndex, [self numberOfItemsPerRow]);
if ([selectionIndexes containsIndex:index])
[self deselectItemsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];
else {
range.length++;
[self selectItemsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range]];
}
self.lastSelectionIndex = index;
}
}

@end
17 changes: 17 additions & 0 deletions BCCollectionView+Mouse.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// BCCollectionView+Mouse.h
// Fontcase
//
// Created by Pieter Omvlee on 25/11/2010.
// Copyright 2010 Bohemian Coding. All rights reserved.
//

#import "BCCollectionView.h"

@interface BCCollectionView (BCCollectionView_Mouse)
- (void)mouseDown:(NSEvent *)theEvent;
- (void)mouseDragged:(NSEvent *)theEvent;
- (void)mouseUp:(NSEvent *)theEvent;

- (BOOL)shiftOrCommandKeyPressed;
@end
71 changes: 71 additions & 0 deletions BCCollectionView+Mouse.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
//
// BCCollectionView+Mouse.m
// Fontcase
//
// Created by Pieter Omvlee on 25/11/2010.
// Copyright 2010 Bohemian Coding. All rights reserved.
//

#import "BCCollectionView+Mouse.h"
#import "BCGeometryExtensions.h"

@implementation BCCollectionView (BCCollectionView_Mouse)

- (BOOL)shiftOrCommandKeyPressed
{
return [NSEvent modifierFlags] & NSShiftKeyMask || [NSEvent modifierFlags] & NSCommandKeyMask;
}

- (void)mouseDown:(NSEvent *)theEvent
{
[[self window] makeFirstResponder:self];

if (![self shiftOrCommandKeyPressed])
[self deselectAllItems];

self.originalSelectionIndexes = [[selectionIndexes copy] autorelease];

mouseDownLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil];
mouseDraggedLocation = mouseDownLocation;

NSUInteger index = [self indexOfItemAtPoint:mouseDownLocation];
if ([self shiftOrCommandKeyPressed] && [self.originalSelectionIndexes containsIndex:index])
[self deselectItemAtIndex:index];
else
[self selectItemAtIndex:index];
}

- (void)mouseDragged:(NSEvent *)theEvent
{
[self deselectAllItems];
if ([self shiftOrCommandKeyPressed]) {
[self.originalSelectionIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
[self selectItemAtIndex:idx];
}];
}
[self setNeedsDisplayInRect:BCRectFromTwoPoints(mouseDownLocation, mouseDraggedLocation)];

mouseDraggedLocation = [self convertPoint:[theEvent locationInWindow] fromView:nil];

NSIndexSet *newIndexes = [self indexesOfItemsInRect:BCRectFromTwoPoints(mouseDownLocation, mouseDraggedLocation)];
[newIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
if ([self.originalSelectionIndexes containsIndex:idx])
[self deselectItemAtIndex:idx];
else
[self selectItemAtIndex:idx];
}];

[self setNeedsDisplayInRect:BCRectFromTwoPoints(mouseDownLocation, mouseDraggedLocation)];
}

- (void)mouseUp:(NSEvent *)theEvent
{
[self setNeedsDisplayInRect:BCRectFromTwoPoints(mouseDownLocation, mouseDraggedLocation)];

mouseDownLocation = NSZeroPoint;
mouseDraggedLocation = NSZeroPoint;

self.originalSelectionIndexes = nil;
}

@end
62 changes: 62 additions & 0 deletions BCCollectionView.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//
// BCCollectionView.h
// Fontcase
//
// Created by Pieter Omvlee on 24/11/2010.
// Copyright 2010 Bohemian Coding. All rights reserved.
//

#import <Cocoa/Cocoa.h>
#import "BCCollectionViewDelegate.h"

@interface BCCollectionView : NSView
{
IBOutlet id<BCCollectionViewDelegate> delegate;

NSArray *contentArray;

NSMutableArray *reusableViewControllers;
NSMutableDictionary *visibleViewControllers;

NSMutableIndexSet *selectionIndexes;
NSIndexSet *originalSelectionIndexes;

NSPoint mouseDownLocation;
NSPoint mouseDraggedLocation;

NSColor *backgroundColor;

NSUInteger lastSelectionIndex;
}
@property (nonatomic, assign) id<BCCollectionViewDelegate> delegate;
@property (nonatomic, retain) NSColor *backgroundColor;

//by setting the contentArray, the view will load itself up.
@property (nonatomic, copy) NSArray *contentArray;

//private
@property (nonatomic, copy) NSIndexSet *originalSelectionIndexes;
@property (nonatomic) NSUInteger lastSelectionIndex;

- (void)reloadData;

//Managing Selections
- (void)selectItemAtIndex:(NSUInteger)index;
- (void)selectItemsAtIndexes:(NSIndexSet *)indexes;
- (void)deselectItemAtIndex:(NSUInteger)index;
- (void)deselectItemsAtIndexes:(NSIndexSet *)indexes;
- (void)deselectAllItems;

//Basic Cell Information
- (NSUInteger)numberOfRows;
- (NSUInteger)numberOfItemsPerRow;
- (NSSize)cellSize;
- (NSRect)rectOfItemAtIndex:(NSUInteger)anIndex;
- (NSIndexSet *)indexesOfItemsInRect:(NSRect)aRect;
- (NSUInteger)indexOfItemAtPoint:(NSPoint)p;
- (NSUInteger)indexOfItemAtPointOrClosestGuess:(NSPoint)p;

//Querying ViewControllers
- (NSIndexSet *)indexesOfViewControllers;
- (NSIndexSet *)indexesOfInvisibleViewControllers;
@end
Loading

0 comments on commit 0106cd3

Please sign in to comment.