diff options
| author | Markus Tiede | 2013-11-08 15:51:13 +0000 |
|---|---|---|
| committer | Markus Tiede | 2013-11-08 15:51:18 +0000 |
| commit | fd896ac6d169e9fd5d4ec3cf2f88c36d9cb721c2 (patch) | |
| tree | 6288ca19614a6f2ec6c41ddd2ce2f74d873d86f8 | |
| parent | f69bc751c6fcaf455230fd47b360c575a2539de2 (diff) | |
| download | org.eclipse.jubula.core-fd896ac6d169e9fd5d4ec3cf2f88c36d9cb721c2.tar.gz org.eclipse.jubula.core-fd896ac6d169e9fd5d4ec3cf2f88c36d9cb721c2.tar.xz org.eclipse.jubula.core-fd896ac6d169e9fd5d4ec3cf2f88c36d9cb721c2.zip | |
Sprint task - patch for enhancement http://bugs.eclipse.org/418883 reviewed, adjusted and applied.
10 files changed, 228 insertions, 157 deletions
diff --git a/org.eclipse.jubula.client.ui.rcp/plugin.xml b/org.eclipse.jubula.client.ui.rcp/plugin.xml index 74c373da4..c40a54358 100644 --- a/org.eclipse.jubula.client.ui.rcp/plugin.xml +++ b/org.eclipse.jubula.client.ui.rcp/plugin.xml @@ -144,13 +144,6 @@ properties="isPasteAllowed" type="java.util.Collection"> </propertyTester> - <propertyTester - class="org.eclipse.jubula.client.ui.rcp.propertytester.ImageViewPropertyTester" - id="org.eclipse.jubula.client.ui.rcp.propertytester.ImageViewPropertyTester" - namespace="org.eclipse.jubula.client.ui.rcp.ImageView" - properties="hasImage" - type="org.eclipse.jubula.client.core.model.TestResultNode"> - </propertyTester> </extension> <extension id="jbMarker" @@ -1979,21 +1972,11 @@ class="org.eclipse.jubula.client.ui.rcp.handlers.SaveImageAsHandler" commandId="org.eclipse.jubula.client.ui.commands.SaveImageAs"> <enabledWhen> - <and> - <count - value="1"> - </count> - <iterate - ifEmpty="false" - operator="or"> - <and> - <instanceof - value="org.eclipse.jubula.client.core.model.TestResultNode"> - </instanceof> - <test property="org.eclipse.jubula.client.ui.rcp.ImageView.hasImage"/> - </and> - </iterate> - </and> + <with variable="activeContexts"> + <iterate ifEmpty="false" operator="or"> + <equals value="org.eclipse.jubula.client.ui.contexts.ImageViewDisplaysImage"/> + </iterate> + </with> </enabledWhen> </handler> <handler diff --git a/org.eclipse.jubula.client.ui.rcp/src/org/eclipse/jubula/client/ui/rcp/handlers/SaveImageAsHandler.java b/org.eclipse.jubula.client.ui.rcp/src/org/eclipse/jubula/client/ui/rcp/handlers/SaveImageAsHandler.java index 6f0ca8f64..f910f493d 100644 --- a/org.eclipse.jubula.client.ui.rcp/src/org/eclipse/jubula/client/ui/rcp/handlers/SaveImageAsHandler.java +++ b/org.eclipse.jubula.client.ui.rcp/src/org/eclipse/jubula/client/ui/rcp/handlers/SaveImageAsHandler.java @@ -12,23 +12,17 @@ package org.eclipse.jubula.client.ui.rcp.handlers; import org.apache.commons.lang.StringUtils; import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jubula.client.core.model.TestResultNode; +import org.eclipse.jubula.client.ui.constants.Constants; import org.eclipse.jubula.client.ui.handlers.AbstractSelectionBasedHandler; -import org.eclipse.jubula.client.ui.utils.ErrorHandlingUtil; -import org.eclipse.jubula.tools.messagehandling.MessageIDs; +import org.eclipse.jubula.client.ui.views.imageview.ImageView; +import org.eclipse.jubula.client.ui.views.imageview.ImageViewData; import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.ImageLoader; import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.ui.IViewPart; import org.eclipse.ui.handlers.HandlerUtil; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.text.DateFormat; -import java.text.SimpleDateFormat; - /** * @author BREDEX GmbH * @created 11.09.2013 @@ -36,62 +30,40 @@ import java.text.SimpleDateFormat; public class SaveImageAsHandler extends AbstractSelectionBasedHandler { /** - * suggest only 255 character long file names - */ - private static final int MAX_FILE_NAME_LENGTH = 255; - - /** * {@inheritDoc} */ protected Object executeImpl(ExecutionEvent event) { - IStructuredSelection structuredSelection = getSelection(); - Object selectedObject = structuredSelection.getFirstElement(); - if (selectedObject instanceof TestResultNode) { - TestResultNode result = (TestResultNode) selectedObject; - - // necessary to get test suite name - TestResultNode parent = result; - while (parent.getParent() != null) { - parent = parent.getParent(); - } - - // get the date of test from time stamp - DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); //$NON-NLS-1$ - String date = format.format(result.getTimeStamp()); - - FileDialog saveDialog = new FileDialog(HandlerUtil - .getActiveWorkbenchWindow(event).getShell(), SWT.SAVE); - String fileName = "ErrorInTest_" + parent.getName() + "_" //$NON-NLS-1$ //$NON-NLS-2$ - + result.getNode().getName(); - // eliminate whitespaces and characters which are illegal in a file name - fileName = fileName.replaceAll("[\\s\\?\\\\/:|<>\\*\"]", ""); //$NON-NLS-1$ //$NON-NLS-2$ - - String fileEnding = "_" + date + ".png"; //$NON-NLS-1$ //$NON-NLS-2$ - fileName = StringUtils.substring(fileName, 0, - MAX_FILE_NAME_LENGTH + IViewPart view = HandlerUtil.getActiveSite(event). + getPage().findView(Constants.IMAGEVIEW_ID); + + if (view != null && view instanceof ImageView) { + ImageView imageView = (ImageView)view; + int maxFileNameLength = 255; + + ImageViewData imageViewData = imageView.getImageViewData(); + String imageName = imageViewData.getImageName(); + String imageDate = imageViewData.getImageDate(); + + FileDialog saveDialog = new FileDialog(getActiveShell(), SWT.SAVE); + String fileEnding = "_" + imageDate + ".png"; //$NON-NLS-1$ //$NON-NLS-2$ + String fileName = StringUtils.substring(imageName, 0, + maxFileNameLength - fileEnding.length() - saveDialog.getFilterPath().length()); fileName = fileName + fileEnding; + saveDialog.setFileName(fileName); saveDialog.setFilterExtensions(new String[] { "*.png" }); //$NON-NLS-1$ saveDialog.setOverwrite(true); String path = saveDialog.open(); + ImageData imageData = imageViewData.getImage().getImageData(); + if (path != null) { - if (result.getScreenshot() != null) { - try { - File file = new File(path); - OutputStream out = new FileOutputStream(file); - out.write(result.getScreenshot()); - out.flush(); - out.close(); - } catch (FileNotFoundException e) { - ErrorHandlingUtil.createMessageDialog(MessageIDs. - E_FILE_NO_PERMISSION); - } catch (IOException e) { - ErrorHandlingUtil.createMessageDialog(MessageIDs. - E_IO_EXCEPTION); - } + if (imageData != null) { + ImageLoader loader = new ImageLoader(); + loader.data = new ImageData[] { imageData }; + loader.save(path, SWT.IMAGE_PNG); } } } diff --git a/org.eclipse.jubula.client.ui.rcp/src/org/eclipse/jubula/client/ui/rcp/propertytester/ImageViewPropertyTester.java b/org.eclipse.jubula.client.ui.rcp/src/org/eclipse/jubula/client/ui/rcp/propertytester/ImageViewPropertyTester.java deleted file mode 100644 index e4d7928b1..000000000 --- a/org.eclipse.jubula.client.ui.rcp/src/org/eclipse/jubula/client/ui/rcp/propertytester/ImageViewPropertyTester.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 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.rcp.propertytester; - -import org.eclipse.jubula.client.core.model.TestResultNode; -import org.eclipse.jubula.client.core.propertytester.AbstractBooleanPropertyTester; - -/** - * PropertyTester for TestResultSummary. - * - * @author BREDEX GmbH - * @created Sep 13, 2013 - */ -public class ImageViewPropertyTester - extends AbstractBooleanPropertyTester { - /** the id of the "hasMonitoringData" property */ - private static final String HAS_IMAGE = "hasImage"; //$NON-NLS-1$ - - /** - * <code>PROPERTIES</code> - */ - private static final String[] PROPERTIES = new String[] { - HAS_IMAGE }; - - /** {@inheritDoc} */ - public boolean testImpl(Object receiver, String property, Object[] args) { - if (property.equals(HAS_IMAGE)) { - TestResultNode node = (TestResultNode) receiver; - if (node.getScreenshot() != null) { - return true; - } - } - return false; - } - - /** {@inheritDoc} */ - public Class<? extends Object> getType() { - return TestResultNode.class; - } - - /** {@inheritDoc} */ - public String[] getProperties() { - return PROPERTIES; - } -} diff --git a/org.eclipse.jubula.client.ui/META-INF/MANIFEST.MF b/org.eclipse.jubula.client.ui/META-INF/MANIFEST.MF index b0126821b..f78195a27 100644 --- a/org.eclipse.jubula.client.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.jubula.client.ui/META-INF/MANIFEST.MF @@ -46,5 +46,6 @@ Export-Package: org.eclipse.jubula.client.ui.adapter, org.eclipse.jubula.client.ui.utils, org.eclipse.jubula.client.ui.validator.cell, org.eclipse.jubula.client.ui.views, + org.eclipse.jubula.client.ui.views.imageview, org.eclipse.jubula.client.ui.widgets Bundle-Activator: org.eclipse.jubula.client.ui.Plugin diff --git a/org.eclipse.jubula.client.ui/plugin.xml b/org.eclipse.jubula.client.ui/plugin.xml index 478e5ce43..d557c7df5 100644 --- a/org.eclipse.jubula.client.ui/plugin.xml +++ b/org.eclipse.jubula.client.ui/plugin.xml @@ -351,4 +351,12 @@ <adapter type="org.eclipse.ui.views.properties.IPropertySource" /> </factory> </extension> + <extension + point="org.eclipse.ui.contexts"> + <context + id="org.eclipse.jubula.client.ui.contexts.ImageViewDisplaysImage" + name="org.eclipse.jubula.client.ui.contexts.ImageViewDisplaysImage" + parentId="org.eclipse.ui.contexts.dialogAndWindow"> + </context> + </extension> </plugin> diff --git a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/constants/Constants.java b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/constants/Constants.java index 1ac7556e8..766f2f447 100644 --- a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/constants/Constants.java +++ b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/constants/Constants.java @@ -129,6 +129,13 @@ public interface Constants { "org.eclipse.jubula.client.ui.rcp.views.RunningAuts"; //$NON-NLS-1$ // ------------------------------------------------------------- + // Keys for Contexts + // ------------------------------------------------------------- + /** if there is an image displayed in the image view */ + public static final String IMAGEVIEW_DISPLAYS_IMAGE = + "org.eclipse.jubula.client.ui.contexts.ImageViewDisplaysImage"; //$NON-NLS-1$ + + // ------------------------------------------------------------- // decorator ids // ------------------------------------------------------------- /** ID of the completeness check decorator */ diff --git a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageProvider.java b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageProvider.java index e9a0f6c6b..43cb13015 100644 --- a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageProvider.java +++ b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageProvider.java @@ -11,7 +11,6 @@ package org.eclipse.jubula.client.ui.views.imageview; import org.eclipse.swt.graphics.Device; -import org.eclipse.swt.graphics.Image; /** * @author BREDEX GmbH @@ -19,14 +18,14 @@ import org.eclipse.swt.graphics.Image; */ public interface ImageProvider { /** - * This method returns an {@link Image}. The implementor must return an - * image that can be disposed() by the caller. The implementor is not given - * any notification that the dispose is occurring. + * This method returns an {@link ImageViewData}. The implementor must return + * an ImageViewData with an image that can be disposed() by the caller. The + * implementor is not given any notification that the dispose is occurring. * * @param target * The device the image will be displayed on. * - * @return {@link Image} + * @return {@link ImageViewData} */ - Image getImage(Device target); + ImageViewData getImageViewData(Device target); } diff --git a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageView.java b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageView.java index c06b2f62d..8849880f5 100644 --- a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageView.java +++ b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageView.java @@ -17,10 +17,12 @@ 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.IJBPart; @@ -34,16 +36,19 @@ 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.ISelectionListener; import org.eclipse.ui.ISelectionService; import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.contexts.IContextActivation; +import org.eclipse.ui.contexts.IContextService; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.views.properties.IPropertySheetPage; -import org.eclipse.jface.action.MenuManager; /** @@ -59,8 +64,8 @@ public class ImageView extends ViewPart implements IJBPart, ISelectionProvider { /** * the image */ - private Image m_img; - + private ImageViewData m_imgData; + /** * <code>m_oldSelection</code> */ @@ -77,6 +82,11 @@ public class ImageView extends ViewPart implements IJBPart, ISelectionProvider { private Composite m_child; /** + * context activation + */ + private IContextActivation m_contextActivation; + + /** * The selectionListener listens for changes in the workbench's selection * service. */ @@ -210,22 +220,45 @@ public class ImageView extends ViewPart implements IJBPart, ISelectionProvider { * @param provider the provider */ protected void setImage(final ImageProvider provider) { - m_scrollComposite.getDisplay().syncExec(new Runnable() { - + final Display display = m_scrollComposite.getDisplay(); + display.syncExec(new Runnable() { public void run() { clearImage(); - m_img = provider.getImage(m_scrollComposite.getDisplay()); - m_imgWidget.setImage(m_img); - if (m_img != null) { - m_imgWidget.setSize( - m_img.getBounds().width, - m_img.getBounds().height); + 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); + setStatusOfImageContext(true); + } + m_scrollComposite.setMinSize(m_child.computeSize( + SWT.DEFAULT, SWT.DEFAULT)); } - m_scrollComposite.setMinSize(m_child.computeSize(SWT.DEFAULT, - SWT.DEFAULT)); } }); } + + /** + * set the status of the image context - does nothing if context service is + * not available + * + * @param active + * the status to set + */ + private void setStatusOfImageContext(boolean active) { + IContextService cs = (IContextService) getSite().getWorkbenchWindow() + .getService(IContextService.class); + if (cs != null) { + if (active) { + m_contextActivation = cs.activateContext( + Constants.IMAGEVIEW_DISPLAYS_IMAGE); + } else { + cs.deactivateContext(m_contextActivation); + } + } + } /** * make image invisible and dispose it @@ -236,6 +269,8 @@ public class ImageView extends ViewPart implements IJBPart, ISelectionProvider { if (oldImage != null) { oldImage.dispose(); } + + setStatusOfImageContext(false); } /** @@ -243,8 +278,8 @@ public class ImageView extends ViewPart implements IJBPart, ISelectionProvider { */ public void dispose() { getSelectionService().removeSelectionListener(m_selectionListener); - if (m_img != null) { - m_img.dispose(); + if (m_imgData != null) { + m_imgData.dispose(); } super.dispose(); } @@ -300,4 +335,12 @@ public class ImageView extends ViewPart implements IJBPart, ISelectionProvider { } return super.getAdapter(key); } + + /** + * returns the data of the displayed image + * @return the image data + */ + public ImageViewData getImageViewData() { + return m_imgData; + } } diff --git a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageViewData.java b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageViewData.java new file mode 100644 index 000000000..3e5dcd47f --- /dev/null +++ b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/ImageViewData.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2013 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.eclipse.swt.graphics.Image; + +/** + * Class representing an image from the image view and its data + * @author BREDEX GmbH + * @created Nov 08, 2013 + */ +public class ImageViewData { + /** + * the image + */ + private Image m_img; + + /** + * the name of the image + */ + private String m_imgName; + + /** + * the date of the image + */ + private String m_imgDate; + + /** + * constructor + * @param img the image + * @param name the name of the image + * @param date the date of the image + */ + public ImageViewData(Image img, String name, String date) { + m_img = img; + m_imgName = name; + m_imgDate = date; + } + + /** + * returns the image + * @return the image + */ + public Image getImage() { + return m_img; + } + + /** + * returns the name of the image + * @return the name of the image + */ + public String getImageName() { + return m_imgName; + } + + /** + * returns the date of the image + * @return the date of the image + */ + public String getImageDate() { + return m_imgDate; + } + + /** + * Disposes the image. + */ + public void dispose() { + m_img.dispose(); + } +} diff --git a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/TestResultNodeImageProvider.java b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/TestResultNodeImageProvider.java index b5a84ceae..7850af73e 100644 --- a/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/TestResultNodeImageProvider.java +++ b/org.eclipse.jubula.client.ui/src/org/eclipse/jubula/client/ui/views/imageview/TestResultNodeImageProvider.java @@ -10,6 +10,9 @@ *******************************************************************************/ package org.eclipse.jubula.client.ui.views.imageview; +import java.text.DateFormat; +import java.text.SimpleDateFormat; + import org.eclipse.jubula.client.core.model.TestResultNode; import org.eclipse.jubula.client.ui.utils.ImageUtils; import org.eclipse.swt.graphics.Device; @@ -33,15 +36,45 @@ public class TestResultNodeImageProvider implements ImageProvider { public TestResultNodeImageProvider(TestResultNode testresultnode) { m_testResultNode = testresultnode; } - + /** * {@inheritDoc} */ - public Image getImage(Device target) { - if (m_testResultNode.getScreenshot() != null) { - return new Image(target, ImageUtils.getImageData(m_testResultNode - .getScreenshot())); + public ImageViewData getImageViewData(Device target) { + byte[] screenshot = m_testResultNode.getScreenshot(); + if (screenshot != null) { + Image img = new Image(target, ImageUtils.getImageData(screenshot)); + return new ImageViewData(img, generateImageName(), + generateImageDate()); } return null; } + + /** + * generates the name of the image + * @return the name of the image + */ + private String generateImageName() { + TestResultNode parent = m_testResultNode; + while (parent.getParent() != null) { + parent = parent.getParent(); + } + + String imgName = "ErrorInTest_" + parent.getName() + "_" //$NON-NLS-1$ //$NON-NLS-2$ + + m_testResultNode.getNode().getName(); + // eliminate whitespaces and characters which are illegal in a file name + imgName = imgName.replaceAll("[\\s\\?\\\\/:|<>\\*\"]", ""); //$NON-NLS-1$ //$NON-NLS-2$ + return imgName; + } + + /** + * generates the date of the image + * @return the date of the image + */ + private String generateImageDate() { + // get the date of test from time stamp + DateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSS"); //$NON-NLS-1$ + String date = format.format(m_testResultNode.getTimeStamp()); + return date; + } } |
