@@ -183,64 +183,50 @@ public async override void RenameItem (string newName)
183
183
}
184
184
}
185
185
}
186
-
186
+
187
187
public override void DeleteMultipleItems ( )
188
188
{
189
189
var projects = new Set < SolutionItem > ( ) ;
190
190
var folders = new List < ProjectFolder > ( ) ;
191
191
foreach ( ITreeNavigator node in CurrentNodes )
192
192
folders . Add ( ( ProjectFolder ) node . DataItem ) ;
193
193
194
- var removeButton = new AlertButton ( GettextCatalog . GetString ( "_Remove from Project" ) , Gtk . Stock . Remove ) ;
195
194
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
200
196
} ;
201
- question . Buttons . Add ( AlertButton . Delete ) ;
202
- question . Buttons . Add ( removeButton ) ;
203
197
question . Buttons . Add ( AlertButton . Cancel ) ;
198
+ question . Buttons . Add ( AlertButton . Delete ) ;
204
199
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
-
212
200
foreach ( var folder in folders ) {
213
201
var project = folder . Project ;
214
202
215
203
AlertButton result ;
216
204
217
205
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 ) ;
220
208
if ( result == AlertButton . Delete ) {
221
209
DeleteFolder ( folder ) ;
222
210
continue ;
223
211
} else
224
212
break ;
225
213
}
226
-
227
214
var folderRelativePath = folder . Path . ToRelative ( project . BaseDirectory ) ;
228
215
var files = project . Files . GetFilesInVirtualPath ( folderRelativePath ) . ToList ( ) ;
229
216
var folderPf = project . Files . GetFileWithVirtualPath ( folderRelativePath ) ;
230
217
bool isProjectFolder = files . Count == 0 && folderPf == null ;
231
218
232
219
//if the parent directory has already been removed, there may be nothing to do
233
220
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 )
237
224
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}?" ,
241
227
folder . Name , project . Name ) ;
242
228
result = MessageService . AskQuestion ( question ) ;
243
- if ( result != removeButton && result != AlertButton . Delete )
229
+ if ( result != AlertButton . Delete )
244
230
break ;
245
231
246
232
projects . Add ( project ) ;
@@ -255,13 +241,63 @@ public override void DeleteMultipleItems ()
255
241
project . Files . Remove ( folderPf ) ;
256
242
}
257
243
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 ;
260
286
} 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 ) ;
263
297
}
264
-
298
+
299
+ folder . Remove ( ) ;
300
+
265
301
if ( isProjectFolder && folder . Path . ParentDirectory != project . BaseDirectory ) {
266
302
// If it's the last item in the parent folder, make sure we keep a reference to the parent
267
303
// folder, so it is not deleted from the tree.
@@ -274,6 +310,13 @@ public override void DeleteMultipleItems ()
274
310
}
275
311
}
276
312
IdeApp . ProjectOperations . SaveAsync ( projects ) ;
313
+
314
+ }
315
+
316
+ [ CommandUpdateHandler ( ProjectCommands . ExcludeFromProject ) ]
317
+ void UpdateExcludeFolders ( CommandInfo info )
318
+ {
319
+ info . Enabled = CanDeleteMultipleItems ( ) ;
277
320
}
278
321
279
322
static void DeleteFolder ( ProjectFolder folder )
@@ -292,7 +335,6 @@ static void DeleteFolder (ProjectFolder folder)
292
335
public void UpdateRemoveItem ( CommandInfo info )
293
336
{
294
337
info . Enabled = CanDeleteMultipleItems ( ) ;
295
- info . Text = GettextCatalog . GetString ( "Remove" ) ;
296
338
}
297
339
298
340
[ CommandHandler ( ProjectCommands . IncludeToProject ) ]
0 commit comments