-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathSTDocument.m
126 lines (100 loc) · 3.59 KB
/
STDocument.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//
// Document.m
// Smalltalk
//
// Created by Marcel Weiher on 31.03.19.
//
#import "STDocument.h"
#import "STProgramTextView.h"
@interface STDocument(st)
-(IBAction)showWorkspace:(id)sender;
@end
@interface STDocument ()
@property (nonatomic, strong) NSMutableSet *workspaces;
@end
@implementation STDocument
- (nullable instancetype)initWithType:(NSString *)typeName error:(NSError **)outError;
{
self=[super initWithType:typeName error:outError];
[self showWorkspace:nil];
return self;
}
- (instancetype)init {
self = [super init];
if (self) {
self.workspaces = [NSMutableSet set];
}
return self;
}
+ (BOOL)autosavesInPlace {
return YES;
}
-(void)windowWillClose:(NSNotification*)closeNotification
{
NSWindow *windowToClose=closeNotification.object;
for ( NSView *workspace in [self.workspaces allObjects] ) {
if ( workspace.window == windowToClose) {
[self.workspaces removeObject:workspace];
}
}
}
- (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 @"Document";
}
-(STProgramTextView*)programTextView
{
return (STProgramTextView*)[[self workspaces] anyObject]; // FIXME: allow only a single text view
}
- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
return [[[self programTextView] text] asData];
}
-(BOOL)importOldWindowBasedWorkspace:(NSFileWrapper *)fileWrapper error:(NSError **)outError
{
NSError *unarchiveError=nil;
NSFileWrapper *windowsWrapper=[fileWrapper fileWrappers][@"windows"];
NSData *windowsArchive = [windowsWrapper regularFileContents];
NSLog(@"windowsArchive length: %ld",(long)windowsArchive.length);
if ( windowsArchive) {
NSArray *windowControllers = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class] fromData:windowsArchive error:&unarchiveError];
if ( !windowControllers && unarchiveError) {
NSLog(@"error unarchiving: %@",unarchiveError);
if ( outError ) {
*outError=unarchiveError;
}
}
for ( NSWindowController *c in windowControllers) {
if ( [c respondsToSelector:@selector(view)]) {
NSView *view=[[c contentViewController] view];
NSWindow *w = [view openInWindow:@"Workspace"];
[c setWindow:w];
NSLog(@"workspace view: %@",view);
if ( [view respondsToSelector:@selector(setDefaultAttributes)] ) {
[view setDefaultAttributes];
}
[[view documentView] setCompiler:[self compiler]];
[self.workspaces addObject:[view documentView]];
}
[self addWindowController:c];
}
}
return YES;
}
-(BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError * _Nullable *)outError
{
if ( [fileWrapper isDirectory]) {
return [self importOldWindowBasedWorkspace:fileWrapper error:outError];
} else {
return [self readFromData:[fileWrapper regularFileContents] ofType:typeName error:outError];
}
return YES;
}
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError {
NSLog(@"will show workspace");
[self showWorkspace:nil];
NSLog(@"did show workspace");
[[self programTextView] setString:[data stringValue]];
return YES;
}
@end