| /******************************************************************************* |
| * Copyright (c) 2007, 2012 Intel Corporation. |
| * 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: |
| * Oleg Danilov, Intel - Initial API and Implementation |
| * |
| *******************************************************************************/ |
| |
| package org.eclipse.bpel.ui.actions; |
| |
| import java.io.File; |
| |
| import org.eclipse.bpel.ui.BPELEditor; |
| import org.eclipse.bpel.ui.BPELMultipageEditorPart; |
| import org.eclipse.bpel.ui.Messages; |
| import org.eclipse.bpel.ui.dialogs.SaveImageDialog; |
| import org.eclipse.draw2d.Graphics; |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.SWTGraphics; |
| import org.eclipse.draw2d.geometry.Dimension; |
| import org.eclipse.gef.GraphicalViewer; |
| import org.eclipse.gef.LayerConstants; |
| import org.eclipse.gef.editparts.LayerManager; |
| import org.eclipse.gef.editparts.ScalableRootEditPart; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.GC; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.ImageData; |
| import org.eclipse.swt.graphics.ImageLoader; |
| import org.eclipse.swt.graphics.RGB; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.IEditorActionDelegate; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.PlatformUI; |
| |
| public class SaveImageAction extends Action implements IEditorActionDelegate { |
| |
| private BPELMultipageEditorPart fEditor; |
| |
| public void run(IAction action) { |
| SaveImageDialog sid = new SaveImageDialog(Display.getDefault() |
| .getActiveShell(), fEditor.getEditorInput().getName()); |
| sid.setHelpAvailable(false); |
| if (sid.open() == Window.CANCEL) |
| return; |
| String fileName = sid.getFileName(); |
| File file = new File(fileName); |
| if (file.exists() && file.isFile()) { |
| if (!MessageDialog.openQuestion(PlatformUI.getWorkbench() |
| .getActiveWorkbenchWindow().getShell(), |
| Messages.SaveImageAction_1, NLS.bind( |
| Messages.SaveImageAction_2, |
| (new Object[] { fileName })))) { |
| return; |
| } |
| } |
| |
| try { |
| saveBPELAsImage(fEditor, fileName, sid.isTransparent()); |
| } catch (Exception ex) { |
| MessageDialog.openError(fEditor.getEditorSite().getShell(), |
| Messages.SaveImageAction_3, NLS.bind( |
| Messages.SaveImageAction_4, |
| (new Object[] { fileName }))); |
| } |
| } |
| |
| private void saveBPELAsImage(IEditorPart editorPart, String fileName, |
| boolean isTransparent) { |
| GraphicalViewer viewer = (GraphicalViewer) fEditor |
| .getAdapter(GraphicalViewer.class); |
| ScalableRootEditPart rootEditPart = (ScalableRootEditPart) viewer |
| .getEditPartRegistry().get(LayerManager.ID); |
| IFigure figure = ((LayerManager) rootEditPart) |
| .getLayer(LayerConstants.PRINTABLE_LAYERS); |
| |
| Dimension size = figure.getSize(); |
| Dimension prefSize = figure.getPreferredSize(); |
| Image image = new Image(null, size.width, size.height); |
| GC gc = new GC(image); |
| Graphics graphics = new SWTGraphics(gc); |
| figure.paint(graphics); |
| |
| // We need to crop this image to remove extra white space around Process |
| // figure |
| Image croppedImage = new Image(null, prefSize.width, |
| prefSize.height + 20); |
| GC croppedImageGC = new GC(croppedImage); |
| Graphics croppedImageGraphics = new SWTGraphics(croppedImageGC); |
| |
| croppedImageGraphics.drawImage(image, |
| (size.width - prefSize.width) / 2, 0, prefSize.width, |
| prefSize.height, 0, 0, prefSize.width, prefSize.height); |
| |
| ImageLoader imgLoader = new ImageLoader(); |
| imgLoader.data = new ImageData[1]; |
| imgLoader.data[0] = croppedImage.getImageData(); |
| |
| if (isTransparent) |
| imgLoader.data[0].transparentPixel = imgLoader.data[0].palette |
| .getPixel(new RGB(255, 255, 255)); |
| |
| int format = SWT.IMAGE_JPEG; |
| if (fileName.endsWith(".bmp")) //$NON-NLS-1$ |
| format = SWT.IMAGE_BMP; |
| else if (fileName.endsWith(".png")) //$NON-NLS-1$ |
| format = SWT.IMAGE_PNG; |
| |
| imgLoader.save(fileName, format); |
| |
| // dispose all |
| gc.dispose(); |
| image.dispose(); |
| |
| } |
| |
| public void selectionChanged(IAction action, ISelection selection) { |
| if (fEditor == null) { |
| action.setEnabled(false); |
| } else { |
| action.setEnabled(fEditor.getActiveEditor() instanceof BPELEditor); |
| } |
| } |
| |
| public void setActiveEditor(IAction action, IEditorPart targetEditor) { |
| if (targetEditor instanceof BPELMultipageEditorPart) { |
| fEditor = (BPELMultipageEditorPart) targetEditor; |
| } else { |
| fEditor = null; |
| } |
| } |
| } |