/**
* Copyright 2010 The University of North Carolina at Chapel Hill
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package unc.lib.cdr.workbench.views;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
public class ViewPartPreviewFile extends ViewPart {
public class PreviewToggleAction extends Action {
public PreviewToggleAction() {
super("Disable Preview");
}
@Override
public void run() {
enabled = !enabled;
if (enabled) {
this.setText("Disable Preview");
} else {
this.setText("Enable Preview");
}
}
}
ImageProvider provider = null;
ImageViewer viewer = null;
Image image;
boolean enabled = true;
public ViewPartPreviewFile() {
}
ISelectionListener selectionListener = new ISelectionListener() {
@Override
public void selectionChanged(IWorkbenchPart part,
final ISelection selection) {
Job load = new Job("Loading image preview") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
handleSelection(selection);
} catch (NullPointerException ignored) {
}
return Status.OK_STATUS;
}
};
load.setPriority(Job.DECORATE);
load.schedule();
}
};
private void handleSelection(ISelection selection) {
if (!enabled) {
viewer.setImage(null);
return;
}
if (selection instanceof IStructuredSelection) {
IStructuredSelection sel = (IStructuredSelection) selection;
Object o = sel.getFirstElement();
Image first = LabelImageFactory.getImageForObject(o);
if (first == null) {
LabelImageFactory.getImage(LabelImageFactory.Icon.Loading);
}
if (viewer != null) {
viewer.setImage(first);
}
setImageProvider(getImageProvider(o));
}
}
private ImageProvider getImageProvider(Object object) {
// First, if the object is an ImageProvider, use it.
if (ImageProvider.class.isInstance(object))
return (ImageProvider) object;
// Second, if the object is adaptable, ask it to get an adapter.
ImageProvider provider = null;
if (object instanceof IAdaptable)
provider = (ImageProvider) ((IAdaptable) object)
.getAdapter(ImageProvider.class);
// If we haven't found an adapter yet, try asking the AdapterManager.
try {
if (provider == null)
provider = (ImageProvider) Platform.getAdapterManager()
.loadAdapter(object, ImageProvider.class.getName());
} catch (NullPointerException ignored) {
}
return provider;
}
@Override
public void createPartControl(Composite parent) {
getSelectionService().addPostSelectionListener(selectionListener);
handleSelection(getSelectionService().getSelection());
viewer = new ImageViewer(parent, SWT.NONE);
Action action = new PreviewToggleAction();
IActionBars actionBars = getViewSite().getActionBars();
IMenuManager dropDownMenu = actionBars.getMenuManager();
// IToolBarManager toolBar = actionBars.getToolBarManager();
dropDownMenu.add(action);
// toolBar.add(action);
}
protected void setImageProvider(final ImageProvider newprovider) {
if (newprovider == null || viewer == null)
return;
Image newimage = newprovider.getImage(viewer.getDisplay());
if (newimage != null) {
viewer.setImage(newimage);
} else {
viewer.setImage(LabelImageFactory
.getImage(LabelImageFactory.Icon.NoPreview));
}
disposeImage();
provider = newprovider;
image = newimage;
}
public void dispose() {
super.dispose();
getSelectionService().removeSelectionListener(selectionListener);
disposeImage();
}
private void disposeImage() {
if (provider == null)
return;
if (image == null)
return;
provider.disposeImage(image);
provider = null;
image = null;
}
private ISelectionService getSelectionService() {
return getSite().getWorkbenchWindow().getSelectionService();
}
public void setFocus() {
viewer.setFocus();
}
}