ImageViewerEditor.java
package com.codeaffine.extras.imageviewer.internal;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IReusableEditor;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IWorkbenchPartConstants;
import org.eclipse.ui.dialogs.SaveAsDialog;
import org.eclipse.ui.ide.ResourceUtil;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.statushandlers.StatusManager;
public class ImageViewerEditor extends EditorPart implements IReusableEditor {
public static final String ID = "com.codeaffine.extras.imageviewer.internal.ImageViewerEditor";
ImageViewer imageCanvas;
@Override
public void init( IEditorSite site, IEditorInput input ) {
setSite( site );
setInput( input );
}
@Override
public void createPartControl( Composite parent ) {
parent.setLayout( FillLayoutFactory.newFillLayout( 0 ) );
imageCanvas = new ImageViewer( parent );
addPropertyListener( ( source, propertyId ) -> handlePropertyChangedEvent( propertyId ) );
updateContent();
}
@Override
public void setFocus() {
imageCanvas.getControl().forceFocus();
}
@Override
public void setInput( IEditorInput editorInput ) {
checkEditorInput( editorInput );
setInputWithNotify( editorInput );
}
@Override
public void doSave( IProgressMonitor monitor ) {
throw new UnsupportedOperationException();
}
@Override
public void doSaveAs() {
IPath filePath = querySaveAsFilePath();
if( filePath != null ) {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile( filePath );
try {
new ImageDataStorage( imageCanvas.getImageDatas() ).save( file, getProgressMonitor() );
setInput( new FileEditorInput( file ) );
} catch( CoreException exception ) {
StatusManager.getManager().handle( exception, ImageViewerPlugin.ID );
StatusManager.getManager().handle( exception.getStatus(), StatusManager.SHOW );
}
}
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return imageCanvas != null && imageCanvas.getImageDatas() != null;
}
private IPath querySaveAsFilePath() {
SaveAsDialog dialog = new SaveAsDialog( getSite().getShell() );
IEditorInput editorInput = getEditorInput();
IFile originalFile = ResourceUtil.getFile( editorInput );
if( originalFile != null ) {
dialog.setOriginalFile( originalFile );
} else {
dialog.setOriginalName( editorInput.getName() );
}
int dialogResult = dialog.open();
return dialogResult == Window.OK ? dialog.getResult() : null;
}
private IProgressMonitor getProgressMonitor() {
IProgressMonitor monitor = null;
IStatusLineManager manager = getEditorSite().getActionBars().getStatusLineManager();
if( manager != null ) {
monitor = manager.getProgressMonitor();
}
return monitor != null ? monitor : new NullProgressMonitor();
}
private void handlePropertyChangedEvent( int propertyId ) {
if( propertyId == IWorkbenchPartConstants.PROP_INPUT ) {
updateContent();
}
}
private void updateContent() {
setPartName( getEditorInput().getName() );
try( InputStream inputStream = openEditorInput() ) {
ImageData[] imageDatas = new ImageLoader().load( inputStream );
imageCanvas.setImageDatas( imageDatas );
} catch( IOException ignoreCloseProblem ) {
}
}
private InputStream openEditorInput() {
InputStream result = new ByteArrayInputStream( new byte[ 0 ] );
if( getEditorInput() instanceof IStorageEditorInput ) {
IStorageEditorInput storageEditorInput = ( IStorageEditorInput )getEditorInput();
try {
result = storageEditorInput.getStorage().getContents();
} catch( CoreException ignore ) {
}
} else if( getEditorInput() instanceof IPathEditorInput ) {
IPathEditorInput pathEditorInput = ( IPathEditorInput )getEditorInput();
try {
result = new FileInputStream( pathEditorInput.getPath().toFile() );
} catch( FileNotFoundException ignore ) {
}
} else if( getEditorInput() instanceof IURIEditorInput ) {
IURIEditorInput uriEditorInput = ( IURIEditorInput )getEditorInput();
try {
result = uriEditorInput.getURI().toURL().openStream();
} catch( IOException ignore ) {
}
}
return result;
}
private static void checkEditorInput( IEditorInput input ) {
if( !( input instanceof IStorageEditorInput )
&& !( input instanceof IPathEditorInput )
&& !( input instanceof IURIEditorInput ) )
{
throw new IllegalArgumentException( "Invalid input: " + input );
}
}
}