DeleteEditorFileHandler.java
package com.codeaffine.extras.ide.internal.delete;
import java.io.File;
import java.text.MessageFormat;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.DeleteResourceAction;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.ide.ResourceUtil;
public class DeleteEditorFileHandler extends AbstractHandler {
public interface DeleteEditorFilePrompter {
boolean confirmDelete( IShellProvider shellProvider, File file );
void showError( IShellProvider shellProvider, String message );
}
public static final String COMMAND_ID
= "com.codeaffine.extras.ide.internal.DeleteEditorFileCommand";
private final DeleteEditorFilePrompter prompter;
public DeleteEditorFileHandler() {
this( new DefaultDeleteEditorFilePrompter() );
}
public DeleteEditorFileHandler( DeleteEditorFilePrompter prompter ) {
this.prompter = prompter;
}
@Override
public Object execute( ExecutionEvent event ) {
IEditorInput editorInput = HandlerUtil.getActiveEditorInput( event );
IFile resource = ResourceUtil.getFile( editorInput );
if( resource != null ) {
if( resource.isAccessible() ) {
deleteResource( HandlerUtil.getActiveWorkbenchWindow( event ), resource );
}
} else {
File file = getFile( editorInput );
IWorkbenchWindow workbenchWindow = HandlerUtil.getActiveWorkbenchWindow( event );
if( file != null && prompter.confirmDelete( workbenchWindow, file )) {
deleteFile( workbenchWindow, file );
}
}
return null;
}
@Override
public void setEnabled( Object evaluationContext ) {
if( evaluationContext instanceof IEvaluationContext ) {
setBaseEnabled( isEnabled( ( IEvaluationContext )evaluationContext ) );
} else {
setBaseEnabled( false );
}
}
protected void deleteResource( IShellProvider shellProvier, IFile file ) {
DeleteResourceAction deleteAction = new DeleteResourceAction( shellProvier );
deleteAction.selectionChanged( new StructuredSelection( file ) );
deleteAction.run();
}
private void deleteFile( IWorkbenchWindow workbenchWindow, File file ) {
if( file.delete() ) {
closeEditors( workbenchWindow.getWorkbench(), file );
} else {
String message = MessageFormat.format( "The file ''{0}'' could not be deleted.", file.getName() );
prompter.showError( workbenchWindow, message );
}
}
private static void closeEditors( IWorkbench workbench, File file ) {
for( IWorkbenchWindow workbenchWindow : workbench.getWorkbenchWindows() ) {
closeEditors( workbenchWindow, file );
}
}
private static void closeEditors( IWorkbenchWindow workbenchWindow, File file ) {
IEditorReference[] editorReferences = workbenchWindow.getActivePage().getEditorReferences();
for( IEditorReference editorReference : editorReferences ) {
if( file.equals( getFile( editorReference ) ) ) {
workbenchWindow.getActivePage().closeEditors( new IEditorReference[] { editorReference }, false );
}
}
}
private static boolean isEnabled( IEvaluationContext evaluationContext ) {
Object variable = evaluationContext.getVariable( ISources.ACTIVE_EDITOR_INPUT_NAME );
boolean result = false;
if( variable instanceof IEditorInput ) {
IEditorInput editorInput = ( IEditorInput )variable;
result = ResourceUtil.getFile( editorInput ) != null || getFile( editorInput ) != null;
}
return result;
}
private static File getFile( IEditorReference editorReference ) {
try {
return getFile( editorReference.getEditorInput() );
} catch( PartInitException e ) {
return null;
}
}
private static File getFile( IEditorInput editorInput ) {
File result = null;
if( editorInput instanceof IPathEditorInput ) {
IPathEditorInput pathEditorInput = ( IPathEditorInput )editorInput;
result = pathEditorInput.getPath().toFile();
} else if( editorInput instanceof IURIEditorInput ) {
IURIEditorInput uriEditorInput = ( IURIEditorInput )editorInput;
result = URIUtil.toFile( uriEditorInput.getURI() );
}
return result;
}
private static class DefaultDeleteEditorFilePrompter implements DeleteEditorFilePrompter {
private static final String TITLE = "Delete File";
@Override
public boolean confirmDelete( IShellProvider shellProvider, File file ) {
String text = "Are you sure you want to delete ''{0}'' from the file system?";
String message = MessageFormat.format( text, file.getName() );
return MessageDialog.openConfirm( shellProvider.getShell(), TITLE, message );
}
@Override
public void showError( IShellProvider shellProvider, String message ) {
MessageDialog.openError( shellProvider.getShell(), TITLE, message );
}
}
}