/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.ui.views.imageview; import org.apache.commons.lang.ObjectUtils; 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.MenuManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jubula.client.ui.constants.Constants; import org.eclipse.jubula.client.ui.i18n.Messages; import org.eclipse.jubula.client.ui.utils.JobUtils; import org.eclipse.jubula.client.ui.views.ContextBasedView; import org.eclipse.jubula.client.ui.views.IJBPart; import org.eclipse.jubula.client.ui.views.NonSortedPropertySheetPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DragSourceListener; import org.eclipse.swt.dnd.ImageTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.views.properties.IPropertySheetPage; /** * @author BREDEX GmbH * @created Apr 14, 2010 */ public class ImageView extends ContextBasedView implements IJBPart, ISelectionProvider { /** * <code>image</code> */ private Label m_imgWidget; /** * the image */ private ImageViewData m_imgData; /** * <code>m_oldSelection</code> */ private ISelection m_currSelection = null; /** * the scrolled composite */ private ScrolledComposite m_scrollComposite; /** * the child */ private Composite m_child; /** * constructor which sets the contextID */ public ImageView() { super(Constants.IMAGEVIEW_DISPLAYS_IMAGE); } /** * @param selection * the selection */ protected void handleSelection(ISelection selection) { ImageProvider provider = null; if (selection != null && selection instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection)selection; if (ss.size() > 0) { Object object = ss.getFirstElement(); if (m_currSelection != null && ObjectUtils.equals(object, ((IStructuredSelection)m_currSelection) .getFirstElement())) { return; } m_currSelection = ss; // First, if the object is adaptable, ask it to get an adapter. if (object instanceof IAdaptable) { provider = ((IAdaptable)object).getAdapter( ImageProvider.class); } // If we haven't found an adapter yet, try asking the // AdapterManager. if (provider == null) { provider = Platform.getAdapterManager().getAdapter( object, ImageProvider.class); } } } if (provider != null) { clearImage(); handleSelection(provider); } } /** * @param provider * the provider */ private void handleSelection(final ImageProvider provider) { final String jobName = Messages.UIJobLoadingImage; Job job = new Job(jobName) { public IStatus run(IProgressMonitor monitor) { monitor.beginTask(jobName, IProgressMonitor.UNKNOWN); setImage(provider); monitor.done(); return Status.OK_STATUS; } }; JobUtils.executeJob(job, null); } /** * {@inheritDoc} */ public void createPartControl(Composite parent) { parent.setLayout(new FillLayout()); m_scrollComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL); m_child = new Composite(m_scrollComposite, SWT.NONE); m_child.setLayout(new FillLayout()); m_imgWidget = new Label(m_child, SWT.NONE); // Allow data to be copied or moved from the drag source int operations = DND.DROP_COPY; DragSource source = new DragSource(m_imgWidget, operations); // Create menu manager MenuManager contextManager = new MenuManager(); contextManager.setRemoveAllWhenShown(true); // Create context menu Menu contextMenu = contextManager.createContextMenu(m_imgWidget); m_imgWidget.setMenu(contextMenu); // Register context menu getSite().registerContextMenu(contextManager, this); // Provide data in Text format Transfer[] types = new Transfer[] { ImageTransfer.getInstance() }; source.setTransfer(types); source.addDragListener(new DragSourceListener() { public void dragStart(DragSourceEvent event) { // Only start the drag if there is actually text in the // label - this text will be what is dropped on the target. if (m_imgWidget.getImage() == null) { event.doit = false; } } public void dragSetData(DragSourceEvent event) { // Provide the data of the requested type. if (ImageTransfer.getInstance(). isSupportedType(event.dataType)) { event.data = m_imgWidget.getImage().getImageData(); } } public void dragFinished(DragSourceEvent event) { // nothing needed here } }); m_scrollComposite.setExpandHorizontal(true); m_scrollComposite.setExpandVertical(true); m_scrollComposite.setMinSize(m_child.computeSize( SWT.DEFAULT, SWT.DEFAULT)); m_scrollComposite.setContent(m_child); super.createPartControl(parent); handleSelection(getSelectionService().getSelection()); getSite().setSelectionProvider(this); } /** * @param provider the provider */ protected void setImage(final ImageProvider provider) { final Display display = m_scrollComposite.getDisplay(); display.syncExec(new Runnable() { public void run() { clearImage(); m_imgData = provider.getImageViewData(display); if (m_imgData != null) { Image img = m_imgData.getImage(); m_imgWidget.setImage(img); if (img != null) { Rectangle bounds = img.getBounds(); m_imgWidget.setSize(bounds.width, bounds.height); setStatusOfContext(true); } m_scrollComposite.setMinSize(m_child.computeSize( SWT.DEFAULT, SWT.DEFAULT)); } } }); } /** * make image invisible and dispose it */ protected void clearImage() { Image oldImage = m_imgWidget.getImage(); m_imgWidget.setImage(null); if (oldImage != null) { oldImage.dispose(); } setStatusOfContext(false); } /** * {@inheritDoc} */ public void dispose() { if (m_imgData != null) { m_imgData.dispose(); } super.dispose(); } /** * {@inheritDoc} */ public void setFocus() { m_imgWidget.setFocus(); } /** * {@inheritDoc} */ public void addSelectionChangedListener( ISelectionChangedListener listener) { // empty } /** * {@inheritDoc} */ public ISelection getSelection() { return m_currSelection; } /** * {@inheritDoc} */ public void removeSelectionChangedListener( ISelectionChangedListener listener) { // empty } /** * {@inheritDoc} */ public void setSelection(ISelection selection) { // empty } /** {@inheritDoc} */ public Object getAdapter(Class key) { if (key.equals(IPropertySheetPage.class)) { return new NonSortedPropertySheetPage(); } return super.getAdapter(key); } /** * returns the data of the displayed image * @return the image data */ public ImageViewData getImageViewData() { return m_imgData; } }