| /******************************************************************************* |
| * Copyright (c) 2000, 2005 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ui.internal.forms.widgets; |
| |
| import java.util.Hashtable; |
| |
| import org.eclipse.swt.graphics.*; |
| |
| /** |
| * @version 1.0 |
| * @author |
| */ |
| public class ImageSegment extends ObjectSegment { |
| public static final String SEL_IMAGE_PREFIX = "isel."; //$NON-NLS-1$ |
| |
| public Image getImage(Hashtable objectTable) { |
| return getImage(getObjectId(), objectTable); |
| } |
| |
| private Image getImage(String key, Hashtable objectTable) { |
| if (key == null) |
| return null; |
| Object obj = objectTable.get(key); |
| if (obj == null) |
| return null; |
| if (obj instanceof Image) |
| return (Image) obj; |
| return null; |
| } |
| |
| private Image getSelectedImage(Hashtable objectTable, SelectionData selData) { |
| String key = SEL_IMAGE_PREFIX + getObjectId(); |
| Image image = getImage(key, objectTable); |
| if (image==null) { |
| image = FormUtil.createAlphaMashImage(selData.display, getImage(objectTable)); |
| if (image!=null) |
| objectTable.put(key, image); |
| } |
| return image; |
| } |
| /* |
| private String getSelectedImageId() { |
| if (getObjectId() == null) |
| return null; |
| return SEL_IMAGE_PREFIX + getObjectId(); |
| } |
| */ |
| |
| public void paint(GC gc, boolean hover, Hashtable resourceTable, boolean selected, SelectionData selData, Rectangle repaintRegion) { |
| Image image = getImage(resourceTable); |
| int iwidth = 0; |
| int iheight = 0; |
| if (image != null) { |
| Rectangle rect = image.getBounds(); |
| iwidth = rect.width + (isSelectable()?2:0); |
| iheight = rect.height + (isSelectable()?2:0); |
| } else |
| return; |
| Rectangle bounds = getBounds(); |
| int ix = bounds.x+(isSelectable()?1:0); |
| int iy = bounds.y+(isSelectable()?1:0); |
| |
| if (selData != null) { |
| int leftOffset = selData.getLeftOffset(bounds.height); |
| int rightOffset = selData.getRightOffset(bounds.height); |
| boolean firstRow = selData.isFirstSelectionRow(bounds.y, |
| bounds.height); |
| boolean lastRow = selData.isLastSelectionRow(bounds.y, |
| bounds.height); |
| boolean selectedRow = selData |
| .isSelectedRow(bounds.y, bounds.height); |
| if (selectedRow) { |
| if ((firstRow && leftOffset > ix) || |
| (lastRow && rightOffset < ix + iwidth/2)) { |
| drawClipImage(gc, image, ix, iy, repaintRegion); |
| } |
| else { |
| Color savedBg = gc.getBackground(); |
| gc.setBackground(selData.bg); |
| int sx = ix; |
| int sy = iy; |
| if (repaintRegion!=null) { |
| sx -= repaintRegion.x; |
| sy -= repaintRegion.y; |
| } |
| gc.fillRectangle(sx, sy, iwidth, iheight); |
| Image selImage = getSelectedImage(resourceTable, selData); |
| gc.drawImage(selImage, sx, sy); |
| gc.setBackground(savedBg); |
| } |
| } |
| else |
| drawClipImage(gc, image, ix, iy, repaintRegion); |
| } else |
| drawClipImage(gc, image, ix, iy, repaintRegion); |
| if (selected) { |
| int fx = bounds.x; |
| int fy = bounds.y; |
| if (repaintRegion!=null) { |
| fx -= repaintRegion.x; |
| fy -= repaintRegion.y; |
| } |
| Color fg = gc.getForeground(); |
| gc.setForeground(gc.getBackground()); |
| // Clean up to avoid canceling out XOR if it is already |
| // selected. |
| gc.drawRectangle(bounds.x, bounds.y, bounds.width - 1, |
| bounds.height - 1); |
| gc.setForeground(fg); |
| gc.drawFocus(fx, fy, bounds.width, bounds.height); |
| } |
| } |
| private void drawClipImage(GC gc, Image image, int ix, int iy, Rectangle repaintRegion) { |
| if (repaintRegion!=null) { |
| ix -= repaintRegion.x; |
| iy -= repaintRegion.y; |
| } |
| gc.drawImage(image, ix, iy); |
| } |
| |
| protected Point getObjectSize(Hashtable resourceTable, int wHint) { |
| Image image = getImage(resourceTable); |
| if (image==null) |
| return new Point(0, 0); |
| Rectangle ibounds = image.getBounds(); |
| return new Point(ibounds.width, ibounds.height); |
| } |
| } |