97 unsigned _untitledDocumentIndex;
120 _windowControllers = [];
123 _hasUndoManager = YES;
138 - (id)initWithType:(
CPString)aType error:({CPError})anError
159 - (id)initWithContentsOfURL:(
CPURL)anAbsoluteURL ofType:(
CPString)aType delegate:(
id)aDelegate didReadSelector:(
SEL)aDidReadSelector contextInfo:(
id)aContextInfo
184 - (id)initForURL:(
CPURL)anAbsoluteURL withContentsOfURL:(
CPURL)absoluteContentsURL ofType:(
CPString)aType delegate:(
id)aDelegate didReadSelector:(
SEL)aDidReadSelector contextInfo:(
id)aContextInfo
210 reason:"dataOfType:error: must be overridden by the document subclass."];
225 reason:"readFromData:ofType: must be overridden by the document subclass."];
245 - (void)makeWindowControllers
250 - (void)makeViewAndWindowControllers
253 viewController = nil,
254 windowController = nil;
257 if ([viewCibName length])
265 if (!windowController)
270 if ([windowCibName length])
274 else if (viewController)
276 var view = [viewController view],
277 viewFrame = [view frame];
279 viewFrame.origin = CGPointMake(50, 50);
287 if (windowController && viewController)
288 [windowController setSupportsMultipleDocuments:YES];
290 if (windowController)
302 return _windowControllers;
312 [_windowControllers addObject:aWindowController];
314 if ([aWindowController document] !==
self)
325 if (aWindowController)
326 [_windowControllers removeObject:aWindowController];
328 if ([aWindowController document] ===
self)
339 return [_viewControllersForWindowControllers allValues];
345 [_viewControllersForWindowControllers setObject:aViewController forKey:[aWindowController
UID]];
347 if ([aWindowController document] ===
self)
353 [_viewControllersForWindowControllers removeObject:aViewController];
358 return [_viewControllersForWindowControllers objectForKey:[aWindowController
UID]];
367 [_windowControllers makeObjectsPerformSelector:@selector(setDocument:) withObject:self];
368 [_windowControllers makeObjectsPerformSelector:@selector(showWindow:) withObject:self];
377 return [_fileURL lastPathComponent];
379 if (!_untitledDocumentIndex)
382 if (_untitledDocumentIndex == 1)
385 return @"Untitled " + _untitledDocumentIndex;
426 - (void)readFromURL:(
CPURL)anAbsoluteURL ofType:(
CPString)aType delegate:(
id)aDelegate didReadSelector:(
SEL)aDidReadSelector contextInfo:(
id)aContextInfo
428 [_readConnection cancel];
433 _readConnection.session = _CPReadSessionMake(aType, aDelegate, aDidReadSelector, aContextInfo);
450 if (_fileURL === aFileURL)
455 [_windowControllers makeObjectsPerformSelector:@selector(synchronizeWindowTitleWithDocumentName)];
468 - (void)saveToURL:(
CPURL)anAbsoluteURL ofType:(
CPString)aTypeName forSaveOperation:(CPSaveOperationType)aSaveOperation delegate:(
id)aDelegate didSaveSelector:(
SEL)aDidSaveSelector contextInfo:(
id)aContextInfo
471 oldChangeCount = _changeCount;
477 [_writeRequest setHTTPMethod:@"POST"];
479 [_writeRequest setHTTPMethod:@"PUT"];
481 [_writeRequest setHTTPBody:[data rawString]];
483 [_writeRequest setValue:@"close" forHTTPHeaderField:@"Connection"];
486 [_writeRequest setValue:@"true" forHTTPHeaderField:@"x-cappuccino-overwrite"];
494 connection.session = _CPSaveSessionMake(anAbsoluteURL, aSaveOperation, oldChangeCount, aDelegate, aDidSaveSelector, aContextInfo, connection);
507 var statusCode = [aResponse statusCode];
510 if (statusCode === 200)
513 var session = aConnection.session;
515 if (aConnection == _readConnection)
519 alert(
"There was an error retrieving the document.");
521 objj_msgSend(session.delegate, session.didReadSelector,
self, NO, session.contextInfo);
526 if (statusCode == 409)
530 if (confirm(
"There already exists a file with that name, would you like to overwrite it?"))
532 [_writeRequest setValue:@"true" forHTTPHeaderField:@"x-cappuccino-overwrite"];
540 _changeCount += session.changeCount;
541 [_windowControllers makeObjectsPerformSelector:@selector(setDocumentEdited:) withObject:[
self isDocumentEdited]];
546 objj_msgSend(session.delegate, session.didSaveSelector,
self, NO, session.contextInfo);
547 [
self _sendDocumentSavedNotification:NO];
559 var session = aConnection.session;
562 if (aConnection == _readConnection)
566 objj_msgSend(session.delegate, session.didReadSelector,
self, YES, session.contextInfo);
575 objj_msgSend(session.delegate, session.didSaveSelector,
self, YES, session.contextInfo);
576 [
self _sendDocumentSavedNotification:YES];
586 var session = aConnection.session;
588 if (_readConnection == aConnection)
589 objj_msgSend(session.delegate, session.didReadSelector,
self, NO, session.contextInfo);
595 _changeCount += session.changeCount;
596 [_windowControllers makeObjectsPerformSelector:@selector(setDocumentEdited:) withObject:[
self isDocumentEdited]];
601 alert(
"There was an error saving the document.");
603 objj_msgSend(session.delegate, session.didSaveSelector,
self, NO, session.contextInfo);
604 [
self _sendDocumentSavedNotification:NO];
614 if (_readConnection == aConnection)
615 _readConnection = nil;
622 - (BOOL)isDocumentEdited
624 return _changeCount != 0;
631 - (void)updateChangeCount:(CPDocumentChangeType)aChangeType
643 [_windowControllers makeObjectsPerformSelector:@selector(setDocumentEdited:) withObject:[
self isDocumentEdited]];
669 - (BOOL)hasUndoManager
671 return _hasUndoManager;
678 - (void)setHasUndoManager:(BOOL)aFlag
680 if (_hasUndoManager == aFlag)
683 _hasUndoManager = aFlag;
685 if (!_hasUndoManager)
692 var undoManager = [aNotification
object];
694 if ([undoManager isUndoing] || [undoManager isRedoing])
697 [
self updateChangeCount:CPChangeDone];
703 [
self updateChangeCount:CPChangeUndone];
709 [
self updateChangeCount:CPChangeDone];
723 [defaultCenter removeObserver:self
724 name:CPUndoManagerDidUndoChangeNotification
725 object:_undoManager];
727 [defaultCenter removeObserver:self
728 name:CPUndoManagerDidRedoChangeNotification
729 object:_undoManager];
731 [defaultCenter removeObserver:self
732 name:CPUndoManagerWillCloseUndoGroupNotification
733 object:_undoManager];
736 _undoManager = anUndoManager;
741 [defaultCenter addObserver:self
742 selector:@selector(_undoManagerDidUndoChange:)
743 name:CPUndoManagerDidUndoChangeNotification
744 object:_undoManager];
746 [defaultCenter addObserver:self
747 selector:@selector(_undoManagerDidRedoChange:)
748 name:CPUndoManagerDidRedoChangeNotification
749 object:_undoManager];
751 [defaultCenter addObserver:self
752 selector:@selector(_undoManagerWillCloseGroup:)
753 name:CPUndoManagerWillCloseUndoGroupNotification
754 object:_undoManager];
766 if (_hasUndoManager && !_undoManager)
788 - (void)saveDocument:(
id)aSender
793 - (void)saveDocumentWithDelegate:(
id)delegate didSaveSelector:(
SEL)didSaveSelector contextInfo:(Object)contextInfo
801 [
self saveToURL:_fileURL
ofType:[
self fileType] forSaveOperation:CPSaveOperation delegate:delegate didSaveSelector:didSaveSelector contextInfo:contextInfo];
804 [
self _saveDocumentAsWithDelegate:delegate didSaveSelector:didSaveSelector contextInfo:contextInfo];
811 - (void)saveDocumentAs:(
id)aSender
813 [
self _saveDocumentAsWithDelegate:nil didSaveSelector:nil contextInfo:nil];
816 - (void)_saveDocumentAsWithDelegate:(
id)delegate didSaveSelector:(
SEL)didSaveSelector contextInfo:(Object)contextInfo
819 response = [savePanel runModal];
824 var saveURL = [savePanel URL];
830 [
self saveToURL:saveURL ofType:[
self fileType] forSaveOperation:CPSaveAsOperation delegate:delegate didSaveSelector:didSaveSelector contextInfo:contextInfo];
836 - (void)_sendDocumentSavedNotification:(BOOL)didSave
854 [_windowControllers makeObjectsPerformSelector:@selector(removeDocumentAndCloseIfNecessary:) withObject:self];
858 - (void)shouldCloseWindowController:(
CPWindowController)controller delegate:(
id)delegate shouldCloseSelector:(
SEL)selector contextInfo:(Object)info
860 if ([controller shouldCloseDocument] || ([_windowControllers count] < 2 && [_windowControllers indexOfObject:controller] !==
CPNotFound))
861 [
self canCloseDocumentWithDelegate:self shouldCloseSelector:@selector(_document:shouldClose:context:) contextInfo:{delegate:delegate, selector:selector, context:info}];
863 else if ([delegate respondsToSelector:selector])
864 objj_msgSend(delegate, selector,
self, YES, info);
867 - (void)_document:(
CPDocument)aDocument shouldClose:(BOOL)shouldClose context:(Object)context
869 if (aDocument ===
self && shouldClose)
872 objj_msgSend(context.delegate, context.selector, aDocument, shouldClose, context.context);
875 - (void)canCloseDocumentWithDelegate:(
id)aDelegate shouldCloseSelector:(
SEL)aSelector contextInfo:(Object)context
877 if (![
self isDocumentEdited])
878 return [aDelegate respondsToSelector:aSelector] && objj_msgSend(aDelegate, aSelector,
self, YES, context);
882 [_canCloseAlert setDelegate:self];
883 [_canCloseAlert setAlertStyle:CPWarningAlertStyle];
884 [_canCloseAlert setTitle:@"Unsaved Document"];
885 [_canCloseAlert setMessageText:@"Do you want to save the changes you've made to the document \"" + ([
self displayName] || [
self fileName]) + "\"?"];
887 [_canCloseAlert addButtonWithTitle:@"Save"];
888 [_canCloseAlert addButtonWithTitle:@"Cancel"];
889 [_canCloseAlert addButtonWithTitle:@"Don't Save"];
891 _canCloseAlert._context = {delegate:aDelegate, selector:aSelector, context:context};
893 [_canCloseAlert runModal];
896 - (void)alertDidEnd:(
CPAlert)alert returnCode:(
int)returnCode
898 if (alert !== _canCloseAlert)
901 var delegate = alert._context.
delegate,
902 selector = alert._context.selector,
903 context = alert._context.context;
905 if (returnCode === 0)
908 objj_msgSend(delegate, selector,
self, returnCode === 2, context);
910 _canCloseAlert = nil;
915 var _CPReadSessionMake =
function(aType, aDelegate, aDidReadSelector, aContextInfo)
917 return { fileType:aType, delegate:aDelegate, didReadSelector:aDidReadSelector, contextInfo:aContextInfo };
920 var _CPSaveSessionMake =
function(anAbsoluteURL, aSaveOperation, aChangeCount, aDelegate, aDidSaveSelector, aContextInfo, aConnection)
922 return { absoluteURL:anAbsoluteURL, saveOperation:aSaveOperation, changeCount:aChangeCount, delegate:aDelegate, didSaveSelector:aDidSaveSelector, contextInfo:aContextInfo, connection:aConnection };