blob: a8e86131bf58460d9ab367f4abd8ecdb15bab938 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}