MessageSplitViewController.swift 7.85 KB
Newer Older
1
////////////////////////////////////////////////////////////////////////////////
2
3
4
5
6
7
8
//
//  MessageSplitViewController.swift
//  MessageTextEntrySpike
//
//  Created by Aral Balkan on 03/01/2015.
//  Copyright (c) 2015 ind.ie. All rights reserved.
//
9
////////////////////////////////////////////////////////////////////////////////
10
11

import Cocoa
12

13
14
class MessageSplitViewController: NSSplitViewController
{
15

16
    var sendMessageNotificationHandler:NotificationHandler?
17
    
18
19
20
21
22
23
24
    //
    // MARK: - View lifecycle
    //
    
    override func viewWillAppear()
    {
        createConstraints()
25
26
        
        addNotificationHandlers()
27
28
29
    }
    
    
30
    override func viewWillDisappear()
31
    {
32
        removeNotificationHandlers()
33
34
35
    }
    
    //
36
    // MARK: - Notification handlers
37
38
    //
    
39
    func addNotificationHandlers()
40
    {
41
        sendMessageNotificationHandler = handle(MessageNotification.named(.SendMessage))
42
        {
43
            /* as */ notification in
44
            
45
            if let userInfo = (notification.userInfo as Dictionary!), messageAttributedString = userInfo["message"] as? NSAttributedString
46
            {
47
48
49
50
51
52
                println("Send message: received text: \(messageAttributedString)")
                
                //
                // Get the folder to save the message to based on the current timeline
                //
                
53
                if CurrentTimeline.path == nil
54
55
56
57
                {
                    fatalError("Conversation messages not implemented yet. Panicing!")
                }
                
58
                println("Current timeline path = \(CurrentTimeline.path)")
59
60
61
62
                
                //
                // Get the correct web prefix
                //
63
                if CurrentTimeline.relativeWebPrefix == nil
64
                {
65
                    fatalError("Could not get relative web prefix for current timeline — not implemented. Only Private, All Friends, and Public timelines implemented at the moment.")
66
67
                }
                
68
                println("Current timeline relative web prefix: \(CurrentTimeline.relativeWebPrefix)")
69
70
71
72
73
74
75
                
                //
                // Create a file wrapper to save the contents as a directory.
                //
                let messageDirectoryWrapper:NSFileWrapper? = messageAttributedString.fileWrapperFromRange(NSMakeRange(0, messageAttributedString.length), documentAttributes: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding, NSExcludedElementsDocumentAttribute: ["xml", "html", "head", "body", "font", "span"], NSPrefixSpacesDocumentAttribute: 4], error: nil)
                
                // The file name of the message folder (this is the unique ID — unique per message folder) is the current timestamp in ISO 8601 format
76
                let messageFileName = "\(CurrentTimeline.messageClock)-\(ISO8601DateString())"
77
78
                
                // This is the URL that will be prefixed to all assets in the HTML (images, etc.)
79
                let assetURLPrefix = CurrentTimeline.relativeWebPrefix!.stringByAppendingPathComponent(messageFileName)
80
                
81
82
                println("Asset URL Prefix: \(assetURLPrefix)")
                
83
84
                println("Message file name: \(messageFileName)")
                
85
                let filePath = NSHomeDirectory().stringByAppendingPathComponent("Pulse/Sync").stringByAppendingPathComponent(CurrentTimeline.path!).stringByAppendingPathComponent(messageFileName)
86
87
88
89
                
                println("About to save message at path: \(filePath)")
                
                let fileURL:NSURL? = NSURL(fileURLWithPath: filePath, isDirectory: true)
90
                
91
                if let messageDirectoryWrapper = messageDirectoryWrapper, fileURL = fileURL
92
                {
93
94
95
                    let messageFileWrappers:[NSObject:AnyObject] = messageDirectoryWrapper.fileWrappers
                    
                    for (fileName, fileWrapper) in messageFileWrappers
96
                    {
97
98
                        println(" * \(fileName): \(fileWrapper)")
                        if fileName == "index.html"
99
                        {
100
101
                            let indexData:NSData? = fileWrapper.regularFileContents
                            if let indexData = indexData
102
                            {
103
104
                                let indexHTML = NSString(data: indexData, encoding: NSUTF8StringEncoding)
                                if var indexHTML = indexHTML
105
                                {
106
107
108
109
                                    //
                                    // Massage the HTML.
                                    //
                                    
110
111
                                    println(indexHTML)
                                    
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
                                    // Fix image URLs
                                    indexHTML = indexHTML.stringByReplacingOccurrencesOfString("file:///", withString: assetURLPrefix.stringByAppendingString("/"))
                                    
                                    // Remove redundant empty lines.
                                    indexHTML = indexHTML.stringByReplacingOccurrencesOfString("<p><br></p>", withString: "")
                                    
                                    //
                                    // Update the index.html.
                                    //
                                    
                                    // Remove the index.html file wrapper.
                                    messageDirectoryWrapper.removeFileWrapper(fileWrapper as! NSFileWrapper)
                                    
                                    // And replace it with the new index.html we created.
                                    let newIndexHTMLData:NSData? = indexHTML.dataUsingEncoding(NSUTF8StringEncoding)
                                    
                                    if let newIndexHTMLData = newIndexHTMLData
                                    {
                                        let newIndexHTMLFileWrapper = NSFileWrapper(regularFileWithContents: newIndexHTMLData)
                                        newIndexHTMLFileWrapper.preferredFilename = "index.html"
                                        messageDirectoryWrapper.addFileWrapper(newIndexHTMLFileWrapper)
                                    }
                                    
                                    // TODO: Error checking.
                                    messageDirectoryWrapper.writeToURL(fileURL, options: NSFileWrapperWritingOptions.Atomic, originalContentsURL: nil, error: nil)
                                    println(messageDirectoryWrapper)
                                    
                                    //
140
                                    // Create the message object and broadcast it.
141
142
                                    //
                                    let message = Message(id: messageFileName, assetURLPrefix: assetURLPrefix, folderURL: fileURL, html: indexHTML as String, synced: false)
143
144
                            
                                    post(MessageNotification.named(.ShowMessage), from: self, with: ["message": message])
145
146
                                    
                                    break
147
148
149
150
151
152
153
154
                                }
                            }
                        }
                    }
                }
            }
        }
    }
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
    
    
    func removeNotificationHandlers()
    {
        sendMessageNotificationHandler?.remove()
    }
    
    
    //
    // MARK: - Layout
    //
    
    func createConstraints()
    {
        view.removeConstraints(view.constraints)
        
        layout(view)
        {
            /* as */ view in
            
            view.width == view.superview!.width
            view.height == view.superview!.height
        }
    }
    
180
}