mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			218 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| /*
 | |
|  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"
 |