diff options
Diffstat (limited to 'src/common/Shape.m')
-rw-r--r-- | src/common/Shape.m | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/common/Shape.m b/src/common/Shape.m new file mode 100644 index 0000000..8fdfe8b --- /dev/null +++ b/src/common/Shape.m @@ -0,0 +1,144 @@ +// +// Shape.m +// TikZiT +// +// Copyright 2011 Aleks Kissinger. All rights reserved. +// +// +// This file is part of TikZiT. +// +// TikZiT is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TikZiT 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TikZiT. If not, see <http://www.gnu.org/licenses/>. +// + +#import "Edge.h" +#import "Shape.h" +#import "SupportDir.h" +#import "ShapeNames.h" +#import "CircleShape.h" +#import "RectangleShape.h" +#import "RegularPolyShape.h" +#import "TikzShape.h" +#import "util.h" + +@implementation Shape + +- (void)calcBoundingRect { + boundingRect = NSZeroRect; + + if (paths == nil) + return; + + for (NSArray *arr in paths) { + for (Edge *e in arr) { + boundingRect = NSUnionRect(boundingRect, [e boundingRect]); + } + } +} + +- (id)init { + [super init]; + paths = nil; + return self; +} + +- (NSSet*)paths {return paths;} +- (void)setPaths:(NSSet *)p { + if (paths != p) { + [paths release]; + paths = [p retain]; + [self calcBoundingRect]; + } +} + +- (NSRect)boundingRect { return boundingRect; } + +- (id)copyWithZone:(NSZone*)zone { + Shape *cp = [[[self class] allocWithZone:zone] init]; + [cp setPaths:paths]; + return cp; +} + +- (void)dealloc { + [paths release]; + [super dealloc]; +} + +NSDictionary *shapeDictionary = nil; + ++ (void)addShapesInDir:(NSString*)shapeDir to:(NSMutableDictionary*)shapeDict { + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSArray *files = [fileManager directoryContentsAtPath:shapeDir]; + + if (files != nil) { + NSString *nm; + for (NSString *f in files) { + if ([f hasSuffix:@".tikz"]) { + nm = [f substringToIndex:[f length]-5]; + NSLog(@"found: %@", nm); + TikzShape *sh = + [[TikzShape alloc] initWithTikzFile: + [shapeDir stringByAppendingPathComponent:f]]; + if (sh != nil) { + [shapeDict setObject:sh forKey:nm]; + [sh release]; + } + } + } + } else { + NSLog(@"shape directory \"%@\" not found", shapeDir); + } +} + ++ (void)refreshShapeDictionary { + Shape *shapes[5] = { + [[CircleShape alloc] init], + [[RectangleShape alloc] init], + [[RegularPolyShape alloc] initWithSides:4 rotation:(M_PI/2.0f)], + [[RegularPolyShape alloc] initWithSides:3 rotation:(M_PI/2.0f)], + [[RegularPolyShape alloc] initWithSides:3 rotation:(-M_PI/2.0f)]}; + NSMutableDictionary *shapeDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys: + shapes[0], SHAPE_CIRCLE, + shapes[1], SHAPE_RECTANGLE, + shapes[2], SHAPE_DIAMOND, + shapes[3], SHAPE_UP_TRIANGLE, + shapes[4], SHAPE_DOWN_TRIANGLE, + nil]; + for (int i = 0; i<5; ++i) [shapes[i] release]; + + NSString *systemShapeDir = [[SupportDir systemSupportDir] stringByAppendingPathComponent:@"shapes"]; + NSString *userShapeDir = [[SupportDir userSupportDir] stringByAppendingPathComponent:@"shapes"]; + + [Shape addShapesInDir:systemShapeDir to:shapeDict]; + [Shape addShapesInDir:userShapeDir to:shapeDict]; + + shapeDictionary = shapeDict; + + [[NSNotificationCenter defaultCenter] + postNotificationName:@"ShapeDictionaryReplaced" + object:self]; +} + ++ (NSDictionary*)shapeDictionary { + if (shapeDictionary == nil) [Shape refreshShapeDictionary]; + return shapeDictionary; +} + ++ (Shape*)shapeForName:(NSString*)shapeName { + Shape *s = [[[Shape shapeDictionary] objectForKey:shapeName] copy]; + return [s autorelease]; +} + +@end + +// vi:ft=objc:ts=4:noet:sts=4:sw=4 |