diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j index c5033ed53..386c3d551 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -288,7 +288,9 @@ CPRunContinuesResponse = -1002; if (needsUntitled) [_documentController newDocument:self]; - + + [_documentController _updateRecentDocumentsMenu]; + [defaultCenter postNotificationName:CPApplicationDidFinishLaunchingNotification object:self]; diff --git a/AppKit/CPDocumentController.j b/AppKit/CPDocumentController.j index c392d172e..9431155fe 100644 --- a/AppKit/CPDocumentController.j +++ b/AppKit/CPDocumentController.j @@ -114,7 +114,7 @@ var CPSharedDocumentController = nil; [theDocument makeWindowControllers]; [theDocument showWindows]; } - + return theDocument; } @@ -145,10 +145,13 @@ var CPSharedDocumentController = nil; var type = [self typeForContentsOfURL:anAbsoluteURL error:anError]; result = [self makeDocumentWithContentsOfURL:anAbsoluteURL ofType:type delegate:self didReadSelector:@selector(document:didRead:contextInfo:) contextInfo:[CPDictionary dictionaryWithObject:shouldDisplay forKey:@"shouldDisplay"]]; + + if (result) + [self noteNewRecentDocument:result]; } else if (shouldDisplay) [result showWindows]; - + return result; } @@ -358,3 +361,90 @@ var CPSharedDocumentController = nil; } @end + +@implementation CPDocumentController (Recents) + +- (CPArray)recentDocumentURLs +{ + // FIXME move this to CP land + if (typeof window["cpRecentDocumentURLs"] === 'function') + return window.cpRecentDocumentURLs(); + + return []; +} + +- (void)clearRecentDocuments:(id)sender +{ + if (typeof window["cpClearRecentDocuments"] === 'function') + window.cpClearRecentDocuments(); + + [self _updateRecentDocumentsMenu]; +} + +- (void)noteNewRecentDocument:(CPDocument)aDocument +{ + [self noteNewRecentDocumentURL:[[aDocument fileURL] absoluteString]]; +} + +- (void)noteNewRecentDocumentURL:(CPString)aURL +{ + if (typeof window["cpNoteNewRecentDocumentURL"] === 'function') + window.cpNoteNewRecentDocumentURL(aURL); + + [self _updateRecentDocumentsMenu]; +} + +- (void)_removeAllRecentDocumentsFromMenu:(CPMenu)aMenu +{ + var items = [aMenu itemArray], + count = [items count]; + + while (count--) + { + var item = items[count]; + + if ([item action] === @selector(_openRecentDocument:)) + [aMenu removeItemAtIndex:count]; + } +} + +- (void)_updateRecentDocumentsMenu +{ + var menu = [[CPApp mainMenu] _menuWithName:@"_CPRecentDocumentsMenu"], + recentDocuments = [self recentDocumentURLs], + menuItems = [menu itemArray], + documentCount = [recentDocuments count], + menuItemCount = [menuItems count]; + + [self _removeAllRecentDocumentsFromMenu:menu]; + + if (menuItemCount) + { + if (!documentCount) + { + if ([menuItems[0] isSeparatorItem]) + [menu removeItemAtIndex:0]; + } + else + { + if (![menuItems[0] isSeparatorItem]) + [menu insertItem:[CPMenuItem separatorItem] atIndex:0]; + } + } + + while (documentCount--) + { + var path = recentDocuments[documentCount], + item = [[CPMenuItem alloc] initWithTitle:[path lastPathComponent] action:@selector(_openRecentDocument:) keyEquivalent:nil]; + + [item setTag:path]; + [menu insertItem:item atIndex:0]; + } +} + +- (void)_openRecentDocument:(id)sender +{ + [self openDocumentWithContentsOfURL:[sender tag] display:YES error:nil]; +} + +@end diff --git a/AppKit/CPMenu.j b/AppKit/CPMenu.j index ad0e2dad7..45845b168 100644 --- a/AppKit/CPMenu.j +++ b/AppKit/CPMenu.j @@ -865,6 +865,22 @@ var _CPMenuBarVisible = NO, } } +- (void)_menuWithName:(CPString)aName +{ + if (aName === _name) + return self; + + for (var i = 0, count = [_items count]; i < count; i++) + { + var menu = [[_items[i] submenu] _menuWithName:aName]; + + if (menu) + return menu; + } + + return nil; +} + @end diff --git a/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsaved.png b/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsaved.png index 2cb0e4929..9bd3566b1 100644 Binary files a/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsaved.png and b/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsaved.png differ diff --git a/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsavedHighlighted.png b/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsavedHighlighted.png index 29e0bd19e..a84804f09 100644 Binary files a/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsavedHighlighted.png and b/AppKit/Resources/CPWindow/Standard/CPWindowStandardCloseButtonUnsavedHighlighted.png differ