123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /*************************************************************************
- * Copyright (c) 2011 AT&T Intellectual Property
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors: Details at http://www.graphviz.org/
- *************************************************************************/
- #import "GVDocument.h"
- #import "GVExportViewController.h"
- #import "GVFileNotificationCenter.h"
- #import "GVZGraph.h"
- #import "GVWindowController.h"
- @implementation GVDocument
- @synthesize graph = _graph;
- - (id)init
- {
- if (self = [super init]) {
- _exporter = nil;
- _graph = nil;
- }
- return self;
- }
- - (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError
- {
- [_graph release];
- _graph = [[GVZGraph alloc] initWithURL:absoluteURL error:outError];
- [_graph.arguments setValue:@"dot" forKey:@"layout"];
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(graphDidChange:) name:@"GVGraphDidChange" object:_graph];
- [[GVFileNotificationCenter defaultCenter] addObserver:self selector:@selector(fileDidChange:) path:[absoluteURL path]];
-
- return _graph != nil;
- }
- - (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError
- {
- return [_graph writeToURL:absoluteURL error:outError];
- }
- - (void)makeWindowControllers
- {
- [self addWindowController: [[[GVWindowController alloc] init] autorelease]];
- }
- - (void)setPrintInfo:(NSPrintInfo *)printInfo
- {
- /* after Page Setup is run, change the page size and margins of the graph to fit the page setup parameters */
- [super setPrintInfo:printInfo];
- NSSize paperSize = [printInfo paperSize];
- NSRect imageablePageBounds = [printInfo imageablePageBounds];
- double scalingFactor = 72.0 * [[[printInfo dictionary] objectForKey:NSPrintScalingFactor] doubleValue];
-
- [_graph.graphAttributes setObject:[NSString stringWithFormat:@"%f,%f",
- paperSize.width / scalingFactor,
- paperSize.height / scalingFactor]
- forKey:@"page"];
- [_graph.graphAttributes setObject:[NSString stringWithFormat:@"%f,%f",
- fmax(imageablePageBounds.origin.x, paperSize.width - imageablePageBounds.size.width - imageablePageBounds.origin.x) / scalingFactor,
- fmax(imageablePageBounds.origin.y, paperSize.height - imageablePageBounds.size.height - imageablePageBounds.origin.y) / scalingFactor]
- forKey:@"margin"];
- }
- - (IBAction)exportDocument:(id)sender
- {
- if (!_exporter) {
- _exporter = [[GVExportViewController alloc] init];
- [_exporter setURL:[[self fileURL] URLByDeletingPathExtension]];
- }
- [_exporter beginSheetModalForWindow:[self windowForSheet] modalDelegate:self didEndSelector:@selector(exporterDidEnd:)];
- }
- - (void)exporterDidEnd:(GVExportViewController *)exporter
- {
- [_graph renderWithFormat:[exporter device] toURL:[exporter URL]];
- }
- - (void)fileDidChange:(NSString *)path
- {
- NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
- [defaultCenter removeObserver:self name:@"GVGraphDidChange" object:_graph];
-
- /* reparse the graph fresh from the file */
- [_graph release];
- _graph = [[GVZGraph alloc] initWithURL:[self fileURL] error:nil];
- [_graph.arguments setValue:@"dot" forKey:@"layout"];
- [defaultCenter addObserver:self selector:@selector(graphDidChange:) name:@"GVGraphDidChange" object:_graph];
-
- [defaultCenter postNotificationName:@"GVGraphDocumentDidChange" object:self];
- }
- - (void)graphDidChange:(NSNotification *)notification
- {
- [[NSNotificationCenter defaultCenter] postNotificationName:@"GVGraphDocumentDidChange" object:self];
- }
- - (void)dealloc
- {
- [[NSNotificationCenter defaultCenter] removeObserver:self name:@"GVGraphDidChange" object:_graph];
- [[GVFileNotificationCenter defaultCenter] removeObserver:self path:[[self fileURL] path]];
- [_exporter release];
- [_graph release];
- [super dealloc];
- }
- @end
|