### Eclipse Workspace Patch 1.0 #P org.eclipse.gmf.runtime.diagram.ui Index: src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/DiagramPopupBarEditPolicy.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/DiagramPopupBarEditPolicy.java,v retrieving revision 1.1 diff -u -r1.1 DiagramPopupBarEditPolicy.java --- src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/DiagramPopupBarEditPolicy.java 2 Nov 2005 23:30:15 -0000 1.1 +++ src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/DiagramPopupBarEditPolicy.java 14 Jun 2006 17:39:07 -0000 @@ -14,6 +14,7 @@ import java.util.Iterator; import java.util.List; +import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.Tool; import org.eclipse.gef.palette.PaletteContainer; import org.eclipse.gef.palette.PaletteDrawer; @@ -27,6 +28,11 @@ import org.eclipse.gmf.runtime.diagram.ui.tools.CreationTool; import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.gmf.runtime.gef.ui.internal.palette.PaletteStack; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.RGB; /** * This is the default popup bar editpolicy installed on diagrams. The popup bar @@ -162,8 +168,14 @@ IElementType theToolType = theXtoolsTool .getElementType(); if ((theToolType != null)) { - addPopupBarDescriptor(theToolType, IconService - .getInstance().getIcon(theToolType)); + + Image image = IconService.getInstance().getIcon(theToolType); + + // Workaround for mirroring and SWT.ICON issue + if (image.type == SWT.ICON && isMirrored()) { + image = convert(image); + } + addPopupBarDescriptor(theToolType, image); } } } else if (theEntry instanceof PaletteStack) { @@ -175,6 +187,39 @@ } } } + + private boolean isMirrored() { + return ((getHost().getViewer().getControl().getStyle() & SWT.MIRRORED) != 0); + } + + private Image convert( Image srcImage) { + int height = srcImage.getBounds().height; + int width = srcImage.getBounds().width; + + ImageData srcImageData = srcImage.getImageData(); + + RGB backgroundRGB = ((GraphicalEditPart) getHost()).getFigure().getBackgroundColor().getRGB(); + int backgroundColor = srcImageData.palette.getPixel(backgroundRGB); + + // Set the transparent pixels to the background color + int count = 0; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + if (((srcImageData.maskData[count>>3] >> (7-(count % 8))) & 1) == 0) { + srcImageData.setPixel(x, y, backgroundColor); + } + count++; + } + } + srcImageData.maskData = null; + + Image convertedImage = ImageDescriptor.createFromImageData(srcImageData).createImage(srcImage.getDevice()); + + imagesToBeDisposed.add(convertedImage); + + return convertedImage; + } + /** * Adds popup bar descriptors for all the shape tools in the palette drawer @@ -183,17 +228,19 @@ private void fillBasedOnOpenPaletteDrawer() { PaletteViewer paletteViewer = getHost().getViewer().getEditDomain() .getPaletteViewer(); - for (Iterator iter = paletteViewer.getPaletteRoot().getChildren() - .iterator(); iter.hasNext();) { - Object child = iter.next(); - if (child instanceof PaletteDrawer) { - PaletteDrawer drawer = (PaletteDrawer) child; - if (drawer.isInitiallyOpen()) { - fillWithPaletteToolsInContainer(drawer); - break; - } - } - } + if (paletteViewer != null) { + for (Iterator iter = paletteViewer.getPaletteRoot().getChildren() + .iterator(); iter.hasNext();) { + Object child = iter.next(); + if (child instanceof PaletteDrawer) { + PaletteDrawer drawer = (PaletteDrawer) child; + if (drawer.isInitiallyOpen()) { + fillWithPaletteToolsInContainer(drawer); + break; + } + } + } + } } /**