88import AppKit
99
1010class RecentProjectsMenu : NSObject {
11+ let projectsStore : RecentProjectsStore
12+
13+ init ( projectsStore: RecentProjectsStore = . default) {
14+ self . projectsStore = projectsStore
15+ }
16+
1117 func makeMenu( ) -> NSMenu {
1218 let menu = NSMenu ( title: NSLocalizedString ( " Open Recent " , comment: " Open Recent menu title " ) )
1319
14- projectItems ( menu : menu)
20+ addFileURLs ( to : menu, fileURLs : projectsStore . recentProjectURLs ( ) . prefix ( 10 ) )
1521 menu. addItem ( NSMenuItem . separator ( ) )
16- fileItems ( menu: menu)
17-
22+ addFileURLs ( to: menu, fileURLs: projectsStore. recentFileURLs ( ) . prefix ( 10 ) )
1823 menu. addItem ( NSMenuItem . separator ( ) )
24+
1925 let clearMenuItem = NSMenuItem (
2026 title: NSLocalizedString ( " Clear Menu " , comment: " Recent project menu clear button " ) ,
2127 action: #selector( clearMenuItemClicked ( _: ) ) ,
@@ -27,67 +33,23 @@ class RecentProjectsMenu: NSObject {
2733 return menu
2834 }
2935
30- private func projectItems( menu: NSMenu ) {
31- let projectPaths = RecentProjectsStore . recentProjectURLs ( ) . prefix ( 10 )
32-
33- for projectPath in projectPaths {
34- let icon = NSWorkspace . shared. icon ( forFile: projectPath. path ( ) )
35- icon. size = NSSize ( width: 16 , height: 16 )
36- let alternateTitle = alternateTitle ( for: projectPath)
37-
38- let primaryItem = NSMenuItem (
39- title: projectPath. lastPathComponent,
40- action: #selector( recentProjectItemClicked ( _: ) ) ,
41- keyEquivalent: " "
42- )
43- primaryItem. target = self
44- primaryItem. image = icon
45- primaryItem. representedObject = projectPath
46-
47- let containsDuplicate = projectPaths. contains { url in
48- url != projectPath && url. lastPathComponent == projectPath. lastPathComponent
49- }
50-
51- // If there's a duplicate, add the path.
52- if containsDuplicate {
53- primaryItem. attributedTitle = alternateTitle
54- }
55-
56- let alternateItem = NSMenuItem (
57- title: " " ,
58- action: #selector( recentProjectItemClicked ( _: ) ) ,
59- keyEquivalent: " "
60- )
61- alternateItem. attributedTitle = alternateTitle
62- alternateItem. target = self
63- alternateItem. image = icon
64- alternateItem. representedObject = projectPath
65- alternateItem. isAlternate = true
66- alternateItem. keyEquivalentModifierMask = [ . option]
67-
68- menu. addItem ( primaryItem)
69- menu. addItem ( alternateItem)
70- }
71- }
72-
73- private func fileItems( menu: NSMenu ) {
74- let filePaths = RecentProjectsStore . recentFileURLs ( ) . prefix ( 10 )
75- for filePath in filePaths {
76- let icon = NSWorkspace . shared. icon ( forFile: filePath. path ( ) )
36+ private func addFileURLs( to menu: NSMenu , fileURLs: ArraySlice < URL > ) {
37+ for url in fileURLs {
38+ let icon = NSWorkspace . shared. icon ( forFile: url. path ( ) )
7739 icon. size = NSSize ( width: 16 , height: 16 )
78- let alternateTitle = alternateTitle ( for: filePath )
40+ let alternateTitle = alternateTitle ( for: url )
7941
8042 let primaryItem = NSMenuItem (
81- title: filePath . lastPathComponent,
43+ title: url . lastPathComponent,
8244 action: #selector( recentProjectItemClicked ( _: ) ) ,
8345 keyEquivalent: " "
8446 )
8547 primaryItem. target = self
8648 primaryItem. image = icon
87- primaryItem. representedObject = filePath
49+ primaryItem. representedObject = url
8850
89- let containsDuplicate = filePaths . contains { url in
90- url != filePath && url. lastPathComponent == filePath . lastPathComponent
51+ let containsDuplicate = fileURLs . contains { otherURL in
52+ url != otherURL && url. lastPathComponent == otherURL . lastPathComponent
9153 }
9254
9355 // If there's a duplicate, add the path.
@@ -103,7 +65,7 @@ class RecentProjectsMenu: NSObject {
10365 alternateItem. attributedTitle = alternateTitle
10466 alternateItem. target = self
10567 alternateItem. image = icon
106- alternateItem. representedObject = filePath
68+ alternateItem. representedObject = url
10769 alternateItem. isAlternate = true
10870 alternateItem. keyEquivalentModifierMask = [ . option]
10971
@@ -141,6 +103,6 @@ class RecentProjectsMenu: NSObject {
141103
142104 @objc
143105 func clearMenuItemClicked( _ sender: NSMenuItem ) {
144- RecentProjectsStore . clearList ( )
106+ projectsStore . clearList ( )
145107 }
146108}
0 commit comments