blob: c1cced781da0274628a7d5c9043d99964a992dfc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.examples.presentation.sidewinder;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.presentations.IPresentablePart;
public class PartItem extends Canvas implements PaintListener {
private String text;
private Image image;
private boolean selected;
private boolean focus = false;
private IPresentablePart part;
private static final int VERT_SPACING = 5;
private static final int HORIZ_SPACING = 3;
int[] SIMPLE_TOP_LEFT_CORNER = new int[] {0,4, 4,0};
int[] SIMPLE_TOP_RIGHT_CORNER = new int[] {0,0, 0,0};
//static final int[] SIMPLE_TOP_LEFT_CORNER = new int[] {0,2, 1,1, 2,0};
//static final int[] SIMPLE_TOP_RIGHT_CORNER = new int[] {-2,0, -1,1, 0,2};
static final int[] SIMPLE_BOTTOM_LEFT_CORNER = new int[] {0,-2, 1,-1, 2,0};
static final int[] SIMPLE_BOTTOM_RIGHT_CORNER = new int[] {-2,0, -1,-1, 0,-2};
private boolean showImage;
private boolean showText;
public PartItem(Composite parent, IPresentablePart part) {
super(parent, SWT.NONE);
addPaintListener(this);
this.part = part;
}
public void paintControl(PaintEvent e) {
Rectangle titleRect = getClientArea();
int x = titleRect.x + VERT_SPACING;
int y = titleRect.y + HORIZ_SPACING;
GC gc = e.gc;
setBackground(getParent().getBackground());
fill(gc, titleRect.x, titleRect.y, titleRect.width - 1, titleRect.height);
Image image = getImage();
if (image != null && showImage) {
Rectangle imageBounds = image.getBounds();
int imageX = x;
int imageHeight = imageBounds.height;
int imageY = (titleRect.height - imageHeight) / 2;
int imageWidth = imageBounds.width * imageHeight / imageBounds.height;
gc.drawImage(image,
imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height,
imageX, imageY, imageWidth, imageHeight);
x += imageWidth + VERT_SPACING;
}
int textWidth = titleRect.width - 1;
if (textWidth > 0 && text != null && showText) {
Font gcFont = gc.getFont();
gc.setFont(getFont());
Point extent = gc.textExtent(text, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);
int textY = titleRect.y + (titleRect.height - extent.y) / 2;
if(selected)
gc.setForeground(e.display.getSystemColor(SWT.COLOR_WHITE));
else
gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLACK));
gc.setFont(JFaceResources.getDefaultFont());
gc.drawText(text, x, textY, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);
}
}
public Point computeSize(int wHint, int hHint) {
int width = VERT_SPACING; int height = HORIZ_SPACING;
GC gc = new GC(this);
if(image != null && showImage) {
Rectangle imageBounds = image.getBounds();
height = imageBounds.height + HORIZ_SPACING;
width += imageBounds.width + VERT_SPACING;
}
if(text != null && showText) {
Point extent = gc.textExtent(text, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);
width += extent.x + VERT_SPACING;
height = Math.max(height, extent.y) + HORIZ_SPACING;
}
if (wHint != SWT.DEFAULT) width = wHint;
if (hHint != SWT.DEFAULT) height = hHint;
gc.dispose();
return new Point(width, height);
}
private void fill(GC gc, int x, int y, int width, int height) {
int[] left = SIMPLE_TOP_LEFT_CORNER;
int[] right = SIMPLE_TOP_RIGHT_CORNER;
int[] shape = new int[left.length + right.length + 4];
int index = 0;
shape[index++] = x;
shape[index++] = y + height + 1;
for (int i = 0; i < left.length / 2; i++) {
shape[index++] = x + left[2 * i];
shape[index++] = y + left[2 * i + 1];
}
for (int i = 0; i < right.length / 2; i++) {
shape[index++] = x + width + right[2 * i];
shape[index++] = y + right[2 * i + 1];
}
shape[index++] = x + width;
shape[index++] = y + height + 1;
// Fill in background
Region clipping = new Region();
gc.getClipping(clipping);
Region region = new Region();
region.add(shape);
region.intersect(clipping);
gc.setClipping(region);
gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GRAY));
Color fg = null;
if(part.isDirty())
fg = getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);
else if(!selected)
fg = getDisplay().getSystemColor(SWT.COLOR_WHITE);
//else if(focus)
//fg = getDisplay().getSystemColor(SWT.COLOR_BLUE);
else
fg = getDisplay().getSystemColor(SWT.COLOR_BLUE);
gc.setForeground(fg);
gc.fillGradientRectangle(x, y, x + width, y + height, true);
//gc.fillRectangle(x, y, x + width, y + height);
region.dispose();
clipping.dispose();
gc.setClipping((Rectangle)null);
gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
gc.drawPolyline(shape);
// Fill in parent background for non-rectangular shape
Region r = new Region();
r.add(new Rectangle(x, y, width + 1, height + 1));
r.subtract(shape);
gc.setBackground(getParent().getBackground());
//fillRegion(gc, r);
r.dispose();
}
static void fillRegion(GC gc, Region region) {
// NOTE: region passed in to this function will be modified
Region clipping = new Region();
gc.getClipping(clipping);
region.intersect(clipping);
gc.setClipping(region);
gc.fillRectangle(region.getBounds());
gc.setClipping(clipping);
clipping.dispose();
}
public Point computeSize(int wHint, int hHint, boolean changed) {
return computeSize(wHint, hHint);
}
public void setText(String text) {
this.text = text;
redraw();
}
public String getText() {
return this.text;
}
public void setImage(Image image) {
this.image = image;
}
public Image getImage() {
return this.image;
}
public void setSelected(boolean selected) {
this.selected = selected;
redraw();
}
public boolean getSelected() {
return this.selected;
}
public boolean isFocus() {
return focus;
}
public void setFocus(boolean focus) {
this.focus = focus;
}
public void setShowImage(boolean showImage) {
this.showImage = showImage;
}
public void setShowText(boolean showText) {
this.showText = showText;
}
}