Added Lots of Documentation
Added some nice to haves Improved and Unified General Code Layout
This commit is contained in:
@@ -1,34 +0,0 @@
|
||||
//
|
||||
// MPArrayCache.h
|
||||
// MathPad
|
||||
//
|
||||
// Created by Kim Wittenburg on 31.08.14.
|
||||
// Copyright (c) 2014 Kim Wittenburg. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// A wrapper around NSCache to support index-based caches. Indexes are
|
||||
// automatically adjusted to represent array-like behaviours.
|
||||
@interface MPArrayCache : NSObject {
|
||||
@private
|
||||
NSCache *_cache;
|
||||
}
|
||||
|
||||
- (id)init; /* designated initializer */
|
||||
|
||||
- (void)cacheObject:(id)object
|
||||
forIndex:(NSUInteger)index;
|
||||
- (id)cachedObjectForIndex:(NSUInteger)index;
|
||||
|
||||
- (void)clearCacheAtIndex:(NSUInteger)index
|
||||
replacementLength:(NSUInteger)replacementLength;
|
||||
- (void)clearCacheInRange:(NSRange)range
|
||||
replacementLength:(NSUInteger)replacementLength;
|
||||
|
||||
- (void)replaceCachedObjectAtIndex:(NSUInteger)index
|
||||
withObjects:(NSArray *)objects;
|
||||
- (void)replaceCachedObjectsInRange:(NSRange)range
|
||||
withObjects:(NSArray *)objects;
|
||||
|
||||
@end
|
||||
@@ -1,59 +0,0 @@
|
||||
//
|
||||
// MPArrayCache.m
|
||||
// MathPad
|
||||
//
|
||||
// Created by Kim Wittenburg on 31.08.14.
|
||||
// Copyright (c) 2014 Kim Wittenburg. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPArrayCache.h"
|
||||
|
||||
@implementation MPArrayCache {
|
||||
NSUInteger lastIndex;
|
||||
}
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
lastIndex = 0;
|
||||
_cache = [[NSCache alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)cacheObject:(id)object
|
||||
forIndex:(NSUInteger)index
|
||||
{
|
||||
[_cache setObject:object
|
||||
forKey:@(index)];
|
||||
if (index > lastIndex) {
|
||||
lastIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
- (id)cachedObjectForIndex:(NSUInteger)index
|
||||
{
|
||||
return [_cache objectForKey:@(index)];
|
||||
}
|
||||
|
||||
- (void)clearCacheAtIndex:(NSUInteger)index replacementLength:(NSUInteger)replacementLength
|
||||
{
|
||||
[_cache removeObjectForKey:@(index)];
|
||||
for (NSUInteger i = index+1; i < lastIndex; i++) {
|
||||
id object = [_cache objectForKey:@(i)];
|
||||
if (object) {
|
||||
[_cache removeObjectForKey:@(i)];
|
||||
}
|
||||
}
|
||||
lastIndex += replacementLength - 1;
|
||||
}
|
||||
|
||||
- (void)clearCacheInRange:(NSRange)range replacementLength:(NSUInteger)replacementLength;
|
||||
|
||||
- (void)replaceCachedObjectAtIndex:(NSUInteger)index
|
||||
withObjects:(NSArray *)objects;
|
||||
- (void)replaceCachedObjectsInRange:(NSRange)range
|
||||
withObjects:(NSArray *)objects;
|
||||
|
||||
@end
|
||||
@@ -8,11 +8,39 @@
|
||||
|
||||
#import <MathKit/MathKit.h>
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
@class MPDocument
|
||||
@abstract This class is the document class that displays the MathPad user
|
||||
interface.
|
||||
*/
|
||||
@interface MPDocument : NSDocument
|
||||
|
||||
|
||||
/*!
|
||||
@property expressionView
|
||||
@abstract The main expression view.
|
||||
*/
|
||||
@property (weak) IBOutlet MPExpressionView *expressionView;
|
||||
|
||||
|
||||
/*!
|
||||
@property resultLabel
|
||||
@abstract The label which displays the result of the calculation.
|
||||
|
||||
@discussion The label is placed inside the expression view.
|
||||
*/
|
||||
@property (weak) IBOutlet NSTextField *resultLabel;
|
||||
|
||||
|
||||
/*!
|
||||
@method evaluateExpression:
|
||||
@abstract Called by the expression view when it should be evaluated.
|
||||
|
||||
@param sender
|
||||
Typically the object that invoked the method.
|
||||
*/
|
||||
- (IBAction)evaluateExpression:(id)sender;
|
||||
|
||||
@end
|
||||
|
||||
@@ -8,9 +8,11 @@
|
||||
|
||||
#import "MPDocument.h"
|
||||
|
||||
#import "MPParsedExpression.h"
|
||||
|
||||
@implementation MPDocument
|
||||
|
||||
@implementation MPDocument {
|
||||
MPExpression *loadedExpression;
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
@@ -21,46 +23,47 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
- (NSString *)windowNibName
|
||||
{
|
||||
// Override returning the nib file name of the document
|
||||
// If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
|
||||
return @"MPDocument";
|
||||
}
|
||||
|
||||
|
||||
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
|
||||
{
|
||||
[super windowControllerDidLoadNib:aController];
|
||||
self.expressionView.target = self;
|
||||
self.expressionView.action = @selector(evaluateExpression:);
|
||||
// Add any code here that needs to be executed once the windowController has loaded the document's window.
|
||||
if (loadedExpression) {
|
||||
[self.expressionView.expressionStorage appendElements:[loadedExpression allItemsInReferenceFrame:MPElementReferenceFrame]];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+ (BOOL)autosavesInPlace
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
||||
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
|
||||
{
|
||||
// Insert code here to write your document to data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning nil.
|
||||
// You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.
|
||||
NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil];
|
||||
@throw exception;
|
||||
return nil;
|
||||
return [NSKeyedArchiver archivedDataWithRootObject:self.expressionView.expressionStorage];
|
||||
}
|
||||
|
||||
|
||||
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
|
||||
{
|
||||
// Insert code here to read your document from the given data of the specified type. If outError != NULL, ensure that you create and set an appropriate error when returning NO.
|
||||
// You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead.
|
||||
// If you override either of these, you should also override -isEntireFileLoaded to return NO if the contents are lazily loaded.
|
||||
NSException *exception = [NSException exceptionWithName:@"UnimplementedMethod" reason:[NSString stringWithFormat:@"%@ is unimplemented", NSStringFromSelector(_cmd)] userInfo:nil];
|
||||
@throw exception;
|
||||
MPExpression *expression = [NSKeyedUnarchiver unarchiveObjectWithData:data];
|
||||
loadedExpression = expression;
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark Actions
|
||||
|
||||
|
||||
- (IBAction)evaluateExpression:(id)sender {
|
||||
NSArray *errors;
|
||||
MPParsedExpression *parsedExpression = [self.expressionView.expressionStorage parse:&errors];
|
||||
@@ -74,4 +77,5 @@
|
||||
self.resultLabel.stringValue = result != nil ? [result descriptionWithLocale:[NSLocale currentLocale]] : @"";
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
Reference in New Issue
Block a user