summaryrefslogtreecommitdiff
path: root/tikzit/src/common/StyleManager.m
diff options
context:
space:
mode:
authorrandomguy3 <randomguy3@7c02a99a-9b00-45e3-bf44-6f3dd7fddb64>2012-01-09 11:00:50 +0000
committerrandomguy3 <randomguy3@7c02a99a-9b00-45e3-bf44-6f3dd7fddb64>2012-01-09 11:00:50 +0000
commita8a8dfb90d6a51ae369c042c95162f45754c7c4b (patch)
tree0e7a5f82febebe7129ebfb015f05b114064c39fd /tikzit/src/common/StyleManager.m
parente1cf0babff63e670e0d550b4072c22649a117fa7 (diff)
Move tikzit into "trunk" directory
git-svn-id: https://tikzit.svn.sourceforge.net/svnroot/tikzit/trunk@365 7c02a99a-9b00-45e3-bf44-6f3dd7fddb64
Diffstat (limited to 'tikzit/src/common/StyleManager.m')
-rw-r--r--tikzit/src/common/StyleManager.m339
1 files changed, 339 insertions, 0 deletions
diff --git a/tikzit/src/common/StyleManager.m b/tikzit/src/common/StyleManager.m
new file mode 100644
index 0000000..b5348c6
--- /dev/null
+++ b/tikzit/src/common/StyleManager.m
@@ -0,0 +1,339 @@
+/*
+ * Copyright 2011 Alex Merry <dev@randomguy3.me.uk>
+ *
+ * This program 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 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import "StyleManager.h"
+
+@implementation StyleManager
+
+- (void) nodeStylePropertyChanged:(NSNotification*)n {
+ if ([[[n userInfo] objectForKey:@"propertyName"] isEqual:@"name"]) {
+ NSDictionary *userInfo;
+ userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
+ [n object], @"style",
+ [[n userInfo] objectForKey:@"oldValue"], @"oldName",
+ nil];
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"NodeStyleRenamed"
+ object:self
+ userInfo:userInfo];
+ }
+}
+
+- (void) ignoreAllNodeStyles {
+ [[NSNotificationCenter defaultCenter]
+ removeObserver:self
+ name:@"NodeStylePropertyChanged"
+ object:nil];
+}
+
+- (void) ignoreNodeStyle:(NodeStyle*)style {
+ [[NSNotificationCenter defaultCenter]
+ removeObserver:self
+ name:@"NodeStylePropertyChanged"
+ object:style];
+}
+
+- (void) listenToNodeStyle:(NodeStyle*)style {
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(nodeStylePropertyChanged:)
+ name:@"NodeStylePropertyChanged"
+ object:style];
+}
+
+- (void) edgeStylePropertyChanged:(NSNotification*)n {
+ if ([[[n userInfo] objectForKey:@"propertyName"] isEqual:@"name"]) {
+ NSDictionary *userInfo;
+ userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
+ [n object], @"style",
+ [[n userInfo] objectForKey:@"oldValue"], @"oldName",
+ nil];
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"EdgeStyleRenamed"
+ object:self
+ userInfo:userInfo];
+ }
+}
+
+- (void) ignoreAllEdgeStyles {
+ [[NSNotificationCenter defaultCenter]
+ removeObserver:self
+ name:@"EdgeStylePropertyChanged"
+ object:nil];
+}
+
+- (void) ignoreEdgeStyle:(EdgeStyle*)style {
+ [[NSNotificationCenter defaultCenter]
+ removeObserver:self
+ name:@"EdgeStylePropertyChanged"
+ object:style];
+}
+
+- (void) listenToEdgeStyle:(EdgeStyle*)style {
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(edgeStylePropertyChanged:)
+ name:@"EdgeStylePropertyChanged"
+ object:style];
+}
+
++ (StyleManager*) manager {
+ return [[[self alloc] init] autorelease];
+}
+
+- (id) init {
+ self = [super init];
+
+ if (self) {
+ // we lazily load the default styles, since they may not be needed
+ nodeStyles = nil;
+ activeNodeStyle = nil;
+ edgeStyles = nil;
+ activeEdgeStyle = nil;
+ }
+
+ return self;
+}
+
+- (void) dealloc {
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ [nodeStyles release];
+ [edgeStyles release];
+
+ [super dealloc];
+}
+
+- (void) loadDefaultEdgeStyles {
+}
+
+- (void) loadDefaultNodeStyles {
+ [nodeStyles release];
+ nodeStyles = [[NSMutableArray alloc] initWithCapacity:3];
+
+ NodeStyle *rn = [NodeStyle defaultNodeStyleWithName:@"rn"];
+ [rn setStrokeThickness:2];
+ [rn setStrokeColorRGB:[ColorRGB colorWithFloatRed:0 green:0 blue:0]];
+ [rn setFillColorRGB:[ColorRGB colorWithFloatRed:1 green:0 blue:0]];
+ [self listenToNodeStyle:rn];
+
+ NodeStyle *gn = [NodeStyle defaultNodeStyleWithName:@"gn"];
+ [gn setStrokeThickness:2];
+ [gn setStrokeColorRGB:[ColorRGB colorWithFloatRed:0 green:0 blue:0]];
+ [gn setFillColorRGB:[ColorRGB colorWithFloatRed:0 green:1 blue:0]];
+ [self listenToNodeStyle:gn];
+
+ NodeStyle *yn = [NodeStyle defaultNodeStyleWithName:@"yn"];
+ [yn setStrokeThickness:2];
+ [yn setStrokeColorRGB:[ColorRGB colorWithFloatRed:0 green:0 blue:0]];
+ [yn setFillColorRGB:[ColorRGB colorWithFloatRed:1 green:1 blue:0]];
+ [self listenToNodeStyle:yn];
+
+ [nodeStyles addObject:rn];
+ [nodeStyles addObject:gn];
+ [nodeStyles addObject:yn];
+}
+
+- (void) postNodeStyleAdded:(NodeStyle*)style {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"NodeStyleAdded"
+ object:self
+ userInfo:[NSDictionary dictionaryWithObject:style forKey:@"style"]];
+}
+
+- (void) postNodeStyleRemoved:(NodeStyle*)style {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"NodeStyleRemoved"
+ object:self
+ userInfo:[NSDictionary dictionaryWithObject:style forKey:@"style"]];
+}
+
+- (void) postEdgeStyleAdded:(EdgeStyle*)style {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"EdgeStyleAdded"
+ object:self
+ userInfo:[NSDictionary dictionaryWithObject:style forKey:@"style"]];
+}
+
+- (void) postEdgeStyleRemoved:(EdgeStyle*)style {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"EdgeStyleRemoved"
+ object:self
+ userInfo:[NSDictionary dictionaryWithObject:style forKey:@"style"]];
+}
+
+- (void) postNodeStylesReplaced {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"NodeStylesReplaced" object:self];
+}
+
+- (void) postEdgeStylesReplaced {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"EdgeStylesReplaced" object:self];
+}
+
+- (void) postActiveNodeStyleChanged {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"ActiveNodeStyleChanged" object:self];
+}
+
+- (void) postActiveEdgeStyleChanged {
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"ActiveEdgeStyleChanged" object:self];
+}
+
+- (NSArray*) nodeStyles {
+ if (nodeStyles == nil) {
+ [self loadDefaultNodeStyles];
+ }
+ return nodeStyles;
+}
+
+- (NSArray*) edgeStyles {
+ if (edgeStyles == nil) {
+ [self loadDefaultEdgeStyles];
+ }
+ return edgeStyles;
+}
+
+- (void) _setNodeStyles:(NSMutableArray*)styles {
+ [self ignoreAllNodeStyles];
+ [nodeStyles release];
+ [styles retain];
+ nodeStyles = styles;
+ NodeStyle *oldActiveStyle = activeNodeStyle;
+ activeNodeStyle = nil;
+ for (NodeStyle *style in styles) {
+ [self listenToNodeStyle:style];
+ }
+ [self postNodeStylesReplaced];
+ if (oldActiveStyle != activeNodeStyle) {
+ [self postActiveNodeStyleChanged];
+ }
+}
+
+- (void) _setEdgeStyles:(NSMutableArray*)styles {
+ [self ignoreAllEdgeStyles];
+ [edgeStyles release];
+ [styles retain];
+ edgeStyles = styles;
+ EdgeStyle *oldActiveStyle = activeEdgeStyle;
+ activeEdgeStyle = nil;
+ for (EdgeStyle *style in styles) {
+ [self listenToEdgeStyle:style];
+ }
+ [self postEdgeStylesReplaced];
+ if (oldActiveStyle != activeEdgeStyle) {
+ [self postActiveEdgeStyleChanged];
+ }
+}
+
+- (NodeStyle*) activeNodeStyle {
+ if (nodeStyles == nil) {
+ [self loadDefaultNodeStyles];
+ }
+ return activeNodeStyle;
+}
+
+- (void) setActiveNodeStyle:(NodeStyle*)style {
+ if (style == activeNodeStyle) {
+ return;
+ }
+ if (style == nil || [nodeStyles containsObject:style]) {
+ activeNodeStyle = style;
+ [self postActiveNodeStyleChanged];
+ }
+}
+
+- (EdgeStyle*) activeEdgeStyle {
+ if (edgeStyles == nil) {
+ [self loadDefaultEdgeStyles];
+ }
+ return activeEdgeStyle;
+}
+
+- (void) setActiveEdgeStyle:(EdgeStyle*)style {
+ if (style == activeEdgeStyle) {
+ return;
+ }
+ if (style == nil || [edgeStyles containsObject:style]) {
+ activeEdgeStyle = style;
+ [self postActiveEdgeStyleChanged];
+ }
+}
+
+- (NodeStyle*) nodeStyleForName:(NSString*)name {
+ for (NodeStyle *s in nodeStyles) {
+ if ([[s name] isEqualToString:name]) {
+ return s;
+ }
+ }
+
+ return nil;
+}
+
+- (void) addNodeStyle:(NodeStyle*)style {
+ if (nodeStyles == nil) {
+ [self loadDefaultNodeStyles];
+ }
+ [nodeStyles addObject:style];
+ [self listenToNodeStyle:style];
+ [self postNodeStyleAdded:style];
+}
+
+- (void) removeNodeStyle:(NodeStyle*)style {
+ if (nodeStyles == nil) {
+ [self loadDefaultNodeStyles];
+ }
+ if (activeNodeStyle == style) {
+ [self setActiveNodeStyle:nil];
+ }
+
+ [self ignoreNodeStyle:style];
+ [style retain];
+ [nodeStyles removeObject:style];
+ [self postNodeStyleRemoved:style];
+ [style release];
+}
+
+- (EdgeStyle*) edgeStyleForName:(NSString*)name {
+ for (EdgeStyle *s in edgeStyles) {
+ if ([[s name] isEqualToString:name]) {
+ return s;
+ }
+ }
+
+ return nil;
+}
+
+- (void) addEdgeStyle:(EdgeStyle*)style {
+ if (edgeStyles == nil) {
+ [self loadDefaultEdgeStyles];
+ }
+ [edgeStyles addObject:style];
+ [self listenToEdgeStyle:style];
+ [self postEdgeStyleAdded:style];
+}
+
+- (void) removeEdgeStyle:(EdgeStyle*)style {
+ if (edgeStyles == nil) {
+ [self loadDefaultEdgeStyles];
+ }
+ if (activeEdgeStyle == style) {
+ [self setActiveEdgeStyle:nil];
+ }
+
+ [self ignoreEdgeStyle:style];
+ [style retain];
+ [edgeStyles removeObject:style];
+ [self postEdgeStyleRemoved:style];
+ [style release];
+}
+
+@end
+
+// vi:ft=objc:ts=4:noet:sts=4:sw=4