diff options
| author | Joshua Peek <josh@joshpeek.com> | 2012-07-23 15:52:49 -0500 |
|---|---|---|
| committer | Joshua Peek <josh@joshpeek.com> | 2012-07-23 15:52:49 -0500 |
| commit | 7b6caa0f6c7603aabb5e6ed657e24aaddbeafc78 (patch) | |
| tree | ec0522eae75bb04ae73d28ae3f599682a2bfdaeb /samples/Objective-C/TUITableView.h | |
| parent | 314f0e485227915931db361be14d308a210bedea (diff) | |
Rename samples subdirectories
Diffstat (limited to 'samples/Objective-C/TUITableView.h')
| -rw-r--r-- | samples/Objective-C/TUITableView.h | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/samples/Objective-C/TUITableView.h b/samples/Objective-C/TUITableView.h new file mode 100644 index 0000000..d7036c5 --- /dev/null +++ b/samples/Objective-C/TUITableView.h @@ -0,0 +1,217 @@ +/* + Copyright 2011 Twitter, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this work except in compliance with the License. + You may obtain a copy of the License in the LICENSE file, or at: + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "TUIScrollView.h" +#import "TUIFastIndexPath.h" + +typedef enum { + TUITableViewStylePlain, // regular table view + TUITableViewStyleGrouped, // grouped table view—headers stick to the top of the table view and scroll with it +} TUITableViewStyle; + +typedef enum { + TUITableViewScrollPositionNone, + TUITableViewScrollPositionTop, + TUITableViewScrollPositionMiddle, + TUITableViewScrollPositionBottom, + TUITableViewScrollPositionToVisible, // currently the only supported arg +} TUITableViewScrollPosition; + +typedef enum { + TUITableViewInsertionMethodBeforeIndex = NSOrderedAscending, + TUITableViewInsertionMethodAtIndex = NSOrderedSame, + TUITableViewInsertionMethodAfterIndex = NSOrderedDescending +} TUITableViewInsertionMethod; + +@class TUITableViewCell; +@protocol TUITableViewDataSource; + +@class TUITableView; + +@protocol TUITableViewDelegate<NSObject, TUIScrollViewDelegate> + +- (CGFloat)tableView:(TUITableView *)tableView heightForRowAtIndexPath:(TUIFastIndexPath *)indexPath; + +@optional + +- (void)tableView:(TUITableView *)tableView willDisplayCell:(TUITableViewCell *)cell forRowAtIndexPath:(TUIFastIndexPath *)indexPath; // called after the cell's frame has been set but before it's added as a subview +- (void)tableView:(TUITableView *)tableView didSelectRowAtIndexPath:(TUIFastIndexPath *)indexPath; // happens on left/right mouse down, key up/down +- (void)tableView:(TUITableView *)tableView didDeselectRowAtIndexPath:(TUIFastIndexPath *)indexPath; +- (void)tableView:(TUITableView *)tableView didClickRowAtIndexPath:(TUIFastIndexPath *)indexPath withEvent:(NSEvent *)event; // happens on left/right mouse up (can look at clickCount) + +- (BOOL)tableView:(TUITableView*)tableView shouldSelectRowAtIndexPath:(TUIFastIndexPath*)indexPath forEvent:(NSEvent*)event; // YES, if not implemented +- (NSMenu *)tableView:(TUITableView *)tableView menuForRowAtIndexPath:(TUIFastIndexPath *)indexPath withEvent:(NSEvent *)event; + +// the following are good places to update or restore state (such as selection) when the table data reloads +- (void)tableViewWillReloadData:(TUITableView *)tableView; +- (void)tableViewDidReloadData:(TUITableView *)tableView; + +// the following is optional for row reordering +- (TUIFastIndexPath *)tableView:(TUITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(TUIFastIndexPath *)fromPath toProposedIndexPath:(TUIFastIndexPath *)proposedPath; + +@end + +@interface TUITableView : TUIScrollView +{ + TUITableViewStyle _style; + __unsafe_unretained id <TUITableViewDataSource> _dataSource; // weak + NSArray * _sectionInfo; + + TUIView * _pullDownView; + TUIView * _headerView; + + CGSize _lastSize; + CGFloat _contentHeight; + + NSMutableIndexSet * _visibleSectionHeaders; + NSMutableDictionary * _visibleItems; + NSMutableDictionary * _reusableTableCells; + + TUIFastIndexPath * _selectedIndexPath; + TUIFastIndexPath * _indexPathShouldBeFirstResponder; + NSInteger _futureMakeFirstResponderToken; + TUIFastIndexPath * _keepVisibleIndexPathForReload; + CGFloat _relativeOffsetForReload; + + // drag-to-reorder state + TUITableViewCell * _dragToReorderCell; + CGPoint _currentDragToReorderLocation; + CGPoint _currentDragToReorderMouseOffset; + TUIFastIndexPath * _currentDragToReorderIndexPath; + TUITableViewInsertionMethod _currentDragToReorderInsertionMethod; + TUIFastIndexPath * _previousDragToReorderIndexPath; + TUITableViewInsertionMethod _previousDragToReorderInsertionMethod; + + struct { + unsigned int animateSelectionChanges:1; + unsigned int forceSaveScrollPosition:1; + unsigned int derepeaterEnabled:1; + unsigned int layoutSubviewsReentrancyGuard:1; + unsigned int didFirstLayout:1; + unsigned int dataSourceNumberOfSectionsInTableView:1; + unsigned int delegateTableViewWillDisplayCellForRowAtIndexPath:1; + unsigned int maintainContentOffsetAfterReload:1; + } _tableFlags; + +} + +- (id)initWithFrame:(CGRect)frame style:(TUITableViewStyle)style; // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain + +@property (nonatomic,unsafe_unretained) id <TUITableViewDataSource> dataSource; +@property (nonatomic,unsafe_unretained) id <TUITableViewDelegate> delegate; + +@property (readwrite, assign) BOOL animateSelectionChanges; +@property (nonatomic, assign) BOOL maintainContentOffsetAfterReload; + +- (void)reloadData; + +/** + The table view itself has mechanisms for maintaining scroll position. During a live resize the table view should automatically "do the right thing". This method may be useful during a reload if you want to stay in the same spot. Use it instead of -reloadData. + */ +- (void)reloadDataMaintainingVisibleIndexPath:(TUIFastIndexPath *)indexPath relativeOffset:(CGFloat)relativeOffset; + +// Forces a re-calculation and re-layout of the table. This is most useful for animating the relayout. It is potentially _more_ expensive than -reloadData since it has to allow for animating. +- (void)reloadLayout; + +- (NSInteger)numberOfSections; +- (NSInteger)numberOfRowsInSection:(NSInteger)section; + +- (CGRect)rectForHeaderOfSection:(NSInteger)section; +- (CGRect)rectForSection:(NSInteger)section; +- (CGRect)rectForRowAtIndexPath:(TUIFastIndexPath *)indexPath; + +- (NSIndexSet *)indexesOfSectionsInRect:(CGRect)rect; +- (NSIndexSet *)indexesOfSectionHeadersInRect:(CGRect)rect; +- (TUIFastIndexPath *)indexPathForCell:(TUITableViewCell *)cell; // returns nil if cell is not visible +- (NSArray *)indexPathsForRowsInRect:(CGRect)rect; // returns nil if rect not valid +- (TUIFastIndexPath *)indexPathForRowAtPoint:(CGPoint)point; +- (TUIFastIndexPath *)indexPathForRowAtVerticalOffset:(CGFloat)offset; +- (NSInteger)indexOfSectionWithHeaderAtPoint:(CGPoint)point; +- (NSInteger)indexOfSectionWithHeaderAtVerticalOffset:(CGFloat)offset; + +- (void)enumerateIndexPathsUsingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block; +- (void)enumerateIndexPathsWithOptions:(NSEnumerationOptions)options usingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block; +- (void)enumerateIndexPathsFromIndexPath:(TUIFastIndexPath *)fromIndexPath toIndexPath:(TUIFastIndexPath *)toIndexPath withOptions:(NSEnumerationOptions)options usingBlock:(void (^)(TUIFastIndexPath *indexPath, BOOL *stop))block; + +- (TUIView *)headerViewForSection:(NSInteger)section; +- (TUITableViewCell *)cellForRowAtIndexPath:(TUIFastIndexPath *)indexPath; // returns nil if cell is not visible or index path is out of range +- (NSArray *)visibleCells; // no particular order +- (NSArray *)sortedVisibleCells; // top to bottom +- (NSArray *)indexPathsForVisibleRows; + +- (void)scrollToRowAtIndexPath:(TUIFastIndexPath *)indexPath atScrollPosition:(TUITableViewScrollPosition)scrollPosition animated:(BOOL)animated; + +- (TUIFastIndexPath *)indexPathForSelectedRow; // return nil or index path representing section and row of selection. +- (TUIFastIndexPath *)indexPathForFirstRow; +- (TUIFastIndexPath *)indexPathForLastRow; + +- (void)selectRowAtIndexPath:(TUIFastIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(TUITableViewScrollPosition)scrollPosition; +- (void)deselectRowAtIndexPath:(TUIFastIndexPath *)indexPath animated:(BOOL)animated; + +/** + Above the top cell, only visible if you pull down (if you have scroll bouncing enabled) + */ +@property (nonatomic, strong) TUIView *pullDownView; + +- (BOOL)pullDownViewIsVisible; + +@property (nonatomic, strong) TUIView *headerView; + +/** + Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one. + */ +- (TUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier; + +@end + +@protocol TUITableViewDataSource<NSObject> + +@required + +- (NSInteger)tableView:(TUITableView *)table numberOfRowsInSection:(NSInteger)section; + +- (TUITableViewCell *)tableView:(TUITableView *)tableView cellForRowAtIndexPath:(TUIFastIndexPath *)indexPath; + +@optional + +- (TUIView *)tableView:(TUITableView *)tableView headerViewForSection:(NSInteger)section; + +// the following are required to support row reordering +- (BOOL)tableView:(TUITableView *)tableView canMoveRowAtIndexPath:(TUIFastIndexPath *)indexPath; +- (void)tableView:(TUITableView *)tableView moveRowAtIndexPath:(TUIFastIndexPath *)fromIndexPath toIndexPath:(TUIFastIndexPath *)toIndexPath; + +// the following are required to support row reordering +- (BOOL)tableView:(TUITableView *)tableView canMoveRowAtIndexPath:(TUIFastIndexPath *)indexPath; +- (void)tableView:(TUITableView *)tableView moveRowAtIndexPath:(TUIFastIndexPath *)fromIndexPath toIndexPath:(TUIFastIndexPath *)toIndexPath; + +/** + Default is 1 if not implemented + */ +- (NSInteger)numberOfSectionsInTableView:(TUITableView *)tableView; + +@end + +@interface NSIndexPath (TUITableView) + ++ (NSIndexPath *)indexPathForRow:(NSUInteger)row inSection:(NSUInteger)section; + +@property(nonatomic,readonly) NSUInteger section; +@property(nonatomic,readonly) NSUInteger row; + +@end + +#import "TUITableViewCell.h" +#import "TUITableView+Derepeater.h" |
