GVExportViewController.m 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*************************************************************************
  2. * Copyright (c) 2011 AT&T Intellectual Property
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * https://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors: Details at http://www.graphviz.org/
  9. *************************************************************************/
  10. #import "GVExportViewController.h"
  11. #import "GVZGraph.h"
  12. static NSMutableArray *_formatRenders = nil;
  13. @implementation GVExportViewController
  14. @synthesize URL = _url;
  15. @synthesize render = _render;
  16. + (void)initialize
  17. {
  18. if (!_formatRenders) {
  19. _formatRenders = [[NSMutableArray alloc] init];
  20. NSString *lastFormat = nil;
  21. NSMutableArray *lastRenders = nil;
  22. for (NSString *device in [GVZGraph pluginsWithAPI:API_device]) {
  23. NSArray *deviceComponents = [device componentsSeparatedByString:@":"];
  24. NSUInteger componentCount = [deviceComponents count];
  25. if (componentCount > 0) {
  26. NSString *format = [deviceComponents objectAtIndex:0];
  27. if (![lastFormat isEqualToString:format]) {
  28. lastFormat = format;
  29. lastRenders = [NSMutableArray array];
  30. [_formatRenders addObject:[NSDictionary dictionaryWithObjectsAndKeys:lastFormat, @"format", lastRenders, @"renders", nil]];
  31. }
  32. }
  33. if (componentCount > 1)
  34. [lastRenders addObject:[deviceComponents objectAtIndex:1]];
  35. }
  36. }
  37. }
  38. - (id)init
  39. {
  40. if (self = [super initWithNibName:@"Export" bundle:nil]) {
  41. _panel = nil;
  42. _url = nil;
  43. _formatRender = nil;
  44. _render = nil;
  45. for (NSDictionary *formatRender in _formatRenders)
  46. if ([[formatRender objectForKey:@"format"] isEqualToString:@"pdf"]) {
  47. _formatRender = [formatRender retain];
  48. if ([[formatRender objectForKey:@"renders"] containsObject:@"quartz"])
  49. _render = @"quartz";
  50. break;
  51. }
  52. }
  53. return self;
  54. }
  55. - (NSArray *)formatRenders
  56. {
  57. return _formatRenders;
  58. }
  59. - (NSString *)device
  60. {
  61. NSString *format = [_formatRender objectForKey:@"format"];
  62. return _render ? [NSString stringWithFormat:@"%@:%@", format, _render] : format;
  63. }
  64. - (NSDictionary *)formatRender
  65. {
  66. return _formatRender;
  67. }
  68. - (void)setFormatRender:(NSDictionary *)formatRender
  69. {
  70. if (_formatRender != formatRender) {
  71. [_formatRender release];
  72. _formatRender = [formatRender retain];
  73. /* force save panel to use this file type */
  74. [_panel setAllowedFileTypes:[NSArray arrayWithObject:[_formatRender objectForKey:@"format"]]];
  75. /* remove existing render if it's not compatible with format */
  76. if (![[_formatRender objectForKey:@"renders"] containsObject:_render])
  77. [self setRender:nil];
  78. }
  79. }
  80. - (void)beginSheetModalForWindow:(NSWindow *)window modalDelegate:(id)modalDelegate didEndSelector:(SEL)selector
  81. {
  82. /* remember to invoke end selector on the modal delegate */
  83. NSInvocation *endInvocation = [NSInvocation invocationWithMethodSignature:[modalDelegate methodSignatureForSelector:selector]];
  84. [endInvocation setTarget:modalDelegate];
  85. [endInvocation setSelector:selector];
  86. [endInvocation setArgument:&self atIndex:2];
  87. [endInvocation retain];
  88. _panel = [NSSavePanel savePanel];
  89. [_panel setAccessoryView:[self view]];
  90. [_panel setAllowedFileTypes:[NSArray arrayWithObject:[_formatRender objectForKey:@"format"]]];
  91. [_panel setDirectoryURL:[_url URLByDeletingLastPathComponent]];
  92. [_panel setNameFieldStringValue:[_url lastPathComponent]];
  93. [_panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {
  94. if (result == NSOKButton) {
  95. NSURL *url = [_panel URL];
  96. if (_url != url) {
  97. [_url release];
  98. _url = [url retain];
  99. }
  100. /* invoke the end selector on the modal delegate */
  101. [endInvocation invoke];
  102. }
  103. [endInvocation release];
  104. [_panel setAccessoryView:nil];
  105. _panel = nil;
  106. }];
  107. }
  108. - (void)dealloc
  109. {
  110. [_panel release];
  111. [_url release];
  112. [_formatRender release];
  113. [_render release];
  114. [super dealloc];
  115. }
  116. @end