@@ -56,15 +56,72 @@ final class ProjectNavigatorTableViewCell: FileSystemTableViewCell {
5656
5757 override func controlTextDidEndEditing( _ obj: Notification ) {
5858 guard let fileItem else { return }
59- textField? . backgroundColor = fileItem. validateFileName ( for: textField? . stringValue ?? " " ) ? . none : errorRed
60- if fileItem. validateFileName ( for: textField? . stringValue ?? " " ) {
61- let destinationURL = fileItem. url
62- . deletingLastPathComponent ( )
63- . appending ( path: textField? . stringValue ?? " " )
64- delegate? . moveFile ( file: fileItem, to: destinationURL)
59+
60+ if fileItem. isPhantom {
61+ handlePhantomFileCompletion ( fileItem: fileItem, wasCancelled: false )
6562 } else {
66- textField? . stringValue = fileItem. labelFileName ( )
63+ textField? . backgroundColor = fileItem. validateFileName ( for: textField? . stringValue ?? " " ) ? . none : errorRed
64+ if fileItem. validateFileName ( for: textField? . stringValue ?? " " ) {
65+ let destinationURL = fileItem. url
66+ . deletingLastPathComponent ( )
67+ . appending ( path: textField? . stringValue ?? " " )
68+ delegate? . moveFile ( file: fileItem, to: destinationURL)
69+ } else {
70+ textField? . stringValue = fileItem. labelFileName ( )
71+ }
6772 }
6873 delegate? . cellDidFinishEditing ( )
6974 }
75+
76+ private func handlePhantomFileCompletion( fileItem: CEWorkspaceFile , wasCancelled: Bool ) {
77+ if wasCancelled {
78+ if let workspace = delegate as? ProjectNavigatorViewController ,
79+ let workspaceFileManager = workspace. workspace? . workspaceFileManager {
80+ removePhantomFile ( fileItem: fileItem, fileManager: workspaceFileManager)
81+ }
82+ return
83+ }
84+
85+ let newName = textField? . stringValue ?? " "
86+ if !newName. isEmpty && newName. isValidFilename {
87+ if let workspace = delegate as? ProjectNavigatorViewController ,
88+ let workspaceFileManager = workspace. workspace? . workspaceFileManager,
89+ let parent = fileItem. parent {
90+ do {
91+ let newFile = try workspaceFileManager. addFile (
92+ fileName: newName,
93+ toFile: parent
94+ )
95+
96+ removePhantomFile ( fileItem: fileItem, fileManager: workspaceFileManager)
97+ workspace. workspace? . listenerModel. highlightedFileItem = newFile
98+ workspace. workspace? . editorManager? . openTab ( item: newFile)
99+
100+ } catch {
101+ let alert = NSAlert ( error: error)
102+ alert. addButton ( withTitle: " Dismiss " )
103+ alert. runModal ( )
104+ removePhantomFile ( fileItem: fileItem, fileManager: workspaceFileManager)
105+ }
106+ }
107+ } else {
108+ if let workspace = delegate as? ProjectNavigatorViewController ,
109+ let workspaceFileManager = workspace. workspace? . workspaceFileManager {
110+ removePhantomFile ( fileItem: fileItem, fileManager: workspaceFileManager)
111+ }
112+ }
113+ }
114+
115+ private func removePhantomFile( fileItem: CEWorkspaceFile , fileManager: CEWorkspaceFileManager ) {
116+ fileManager. flattenedFileItems. removeValue ( forKey: fileItem. id)
117+
118+ if let parent = fileItem. parent,
119+ let childrenIds = fileManager. childrenMap [ parent. id] {
120+ fileManager. childrenMap [ parent. id] = childrenIds. filter { $0 != fileItem. id }
121+ }
122+
123+ if let workspace = delegate as? ProjectNavigatorViewController {
124+ workspace. outlineView. reloadData ( )
125+ }
126+ }
70127}
0 commit comments