@@ -183,64 +183,50 @@ public async override void RenameItem (string newName)
183183 }
184184 }
185185 }
186-
186+
187187 public override void DeleteMultipleItems ( )
188188 {
189189 var projects = new Set < SolutionItem > ( ) ;
190190 var folders = new List < ProjectFolder > ( ) ;
191191 foreach ( ITreeNavigator node in CurrentNodes )
192192 folders . Add ( ( ProjectFolder ) node . DataItem ) ;
193193
194- var removeButton = new AlertButton ( GettextCatalog . GetString ( "_Remove from Project" ) , Gtk . Stock . Remove ) ;
195194 var question = new QuestionMessage ( ) {
196- AllowApplyToAll = folders . Count > 1 ,
197- SecondaryText = GettextCatalog . GetString (
198- "The Delete option permanently removes the directory and any files it contains from your hard disk. " +
199- "Click Remove from Project if you only want to remove it from your current solution." )
195+ AllowApplyToAll = folders . Count > 1
200196 } ;
201- question . Buttons . Add ( AlertButton . Delete ) ;
202- question . Buttons . Add ( removeButton ) ;
203197 question . Buttons . Add ( AlertButton . Cancel ) ;
198+ question . Buttons . Add ( AlertButton . Delete ) ;
204199
205- var deleteOnlyQuestion = new QuestionMessage ( ) {
206- AllowApplyToAll = folders . Count > 1 ,
207- SecondaryText = GettextCatalog . GetString ( "The directory and any files it contains will be permanently removed from your hard disk. " )
208- } ;
209- deleteOnlyQuestion . Buttons . Add ( AlertButton . Delete ) ;
210- deleteOnlyQuestion . Buttons . Add ( AlertButton . Cancel ) ;
211-
212200 foreach ( var folder in folders ) {
213201 var project = folder . Project ;
214202
215203 AlertButton result ;
216204
217205 if ( project == null ) {
218- deleteOnlyQuestion . Text = GettextCatalog . GetString ( "Are you sure you want to remove directory {0}?" , folder . Name ) ;
219- result = MessageService . AskQuestion ( deleteOnlyQuestion ) ;
206+ question . Text = GettextCatalog . GetString ( "Are you sure you want to delete directory {0}?" , folder . Name ) ;
207+ result = MessageService . AskQuestion ( question ) ;
220208 if ( result == AlertButton . Delete ) {
221209 DeleteFolder ( folder ) ;
222210 continue ;
223211 } else
224212 break ;
225213 }
226-
227214 var folderRelativePath = folder . Path . ToRelative ( project . BaseDirectory ) ;
228215 var files = project . Files . GetFilesInVirtualPath ( folderRelativePath ) . ToList ( ) ;
229216 var folderPf = project . Files . GetFileWithVirtualPath ( folderRelativePath ) ;
230217 bool isProjectFolder = files . Count == 0 && folderPf == null ;
231218
232219 //if the parent directory has already been removed, there may be nothing to do
233220 if ( isProjectFolder ) {
234- deleteOnlyQuestion . Text = GettextCatalog . GetString ( "Are you sure you want to remove directory {0}?" , folder . Name ) ;
235- result = MessageService . AskQuestion ( deleteOnlyQuestion ) ;
236- if ( result != AlertButton . Delete )
221+ question . Text = GettextCatalog . GetString ( "Are you sure you want to delete directory {0}?" , folder . Name ) ;
222+ result = MessageService . AskQuestion ( question ) ;
223+ if ( result != AlertButton . Delete )
237224 break ;
238- }
239- else {
240- question . Text = GettextCatalog . GetString ( "Are you sure you want to remove directory {0} from project {1}?" ,
225+ } else {
226+ question . Text = GettextCatalog . GetString ( "Are you sure you want to delete directory {0} from project {1}?" ,
241227 folder . Name , project . Name ) ;
242228 result = MessageService . AskQuestion ( question ) ;
243- if ( result != removeButton && result != AlertButton . Delete )
229+ if ( result != AlertButton . Delete )
244230 break ;
245231
246232 projects . Add ( project ) ;
@@ -255,13 +241,63 @@ public override void DeleteMultipleItems ()
255241 project . Files . Remove ( folderPf ) ;
256242 }
257243
258- if ( result == AlertButton . Delete ) {
259- DeleteFolder ( folder ) ;
244+ DeleteFolder ( folder ) ;
245+
246+ if ( isProjectFolder && folder . Path . ParentDirectory != project . BaseDirectory ) {
247+ // If it's the last item in the parent folder, make sure we keep a reference to the parent
248+ // folder, so it is not deleted from the tree.
249+ var inParentFolder = project . Files . GetFilesInVirtualPath ( folderRelativePath . ParentDirectory ) ;
250+ if ( ! inParentFolder . Skip ( 1 ) . Any ( ) ) {
251+ project . Files . Add ( new ProjectFile ( folder . Path . ParentDirectory ) {
252+ Subtype = Subtype . Directory ,
253+ } ) ;
254+ }
255+ }
256+ }
257+ IdeApp . ProjectOperations . SaveAsync ( projects ) ;
258+ }
259+
260+ [ CommandHandler ( ProjectCommands . ExcludeFromProject ) ]
261+ [ AllowMultiSelection ]
262+ void OnExcludeFoldersFromProject ( )
263+ {
264+ var projects = new Set < SolutionItem > ( ) ;
265+ var folders = new List < ProjectFolder > ( ) ;
266+ foreach ( ITreeNavigator node in CurrentNodes )
267+ folders . Add ( ( ProjectFolder ) node . DataItem ) ;
268+
269+ foreach ( var folder in folders ) {
270+ var project = folder . Project ;
271+
272+ AlertButton result ;
273+
274+ if ( project == null ) {
275+ break ;
276+ }
277+
278+ var folderRelativePath = folder . Path . ToRelative ( project . BaseDirectory ) ;
279+ var files = project . Files . GetFilesInVirtualPath ( folderRelativePath ) . ToList ( ) ;
280+ var folderPf = project . Files . GetFileWithVirtualPath ( folderRelativePath ) ;
281+ bool isProjectFolder = files . Count == 0 && folderPf == null ;
282+
283+ //if the parent directory has already been removed, there may be nothing to do
284+ if ( isProjectFolder ) {
285+ break ;
260286 } else {
261- //explictly remove the node from the tree, since it currently only tracks real folder deletions
262- folder . Remove ( ) ;
287+ projects . Add ( project ) ;
288+
289+ //remove the files and link files in the directory
290+ foreach ( var f in files )
291+ project . Files . Remove ( f ) ;
292+
293+ // also remove the folder's own ProjectFile, if it exists
294+ // FIXME: it probably was already in the files list
295+ if ( folderPf != null )
296+ project . Files . Remove ( folderPf ) ;
263297 }
264-
298+
299+ folder . Remove ( ) ;
300+
265301 if ( isProjectFolder && folder . Path . ParentDirectory != project . BaseDirectory ) {
266302 // If it's the last item in the parent folder, make sure we keep a reference to the parent
267303 // folder, so it is not deleted from the tree.
@@ -274,6 +310,13 @@ public override void DeleteMultipleItems ()
274310 }
275311 }
276312 IdeApp . ProjectOperations . SaveAsync ( projects ) ;
313+
314+ }
315+
316+ [ CommandUpdateHandler ( ProjectCommands . ExcludeFromProject ) ]
317+ void UpdateExcludeFolders ( CommandInfo info )
318+ {
319+ info . Enabled = CanDeleteMultipleItems ( ) ;
277320 }
278321
279322 static void DeleteFolder ( ProjectFolder folder )
@@ -292,7 +335,6 @@ static void DeleteFolder (ProjectFolder folder)
292335 public void UpdateRemoveItem ( CommandInfo info )
293336 {
294337 info . Enabled = CanDeleteMultipleItems ( ) ;
295- info . Text = GettextCatalog . GetString ( "Remove" ) ;
296338 }
297339
298340 [ CommandHandler ( ProjectCommands . IncludeToProject ) ]
0 commit comments