blob: c804e087568d4484d9c13191223152f3ea0d702c [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.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
public class BulletParagraph extends Paragraph {
public static final int CIRCLE = 1;
public static final int TEXT = 2;
public static final int IMAGE = 3;
private int style = CIRCLE;
private String text;
private int CIRCLE_DIAM = 5;
private int SPACING = 10;
private int indent = -1;
private int bindent = -1;
private Rectangle bbounds;
/**
* Constructor for BulletParagraph.
*
* @param addVerticalSpace
*/
public BulletParagraph(boolean addVerticalSpace) {
super(addVerticalSpace);
}
public int getIndent() {
int ivalue = indent;
if (ivalue != -1)
return ivalue;
switch (style) {
case CIRCLE:
ivalue = CIRCLE_DIAM + SPACING;
break;
default:
ivalue = 20;
break;
}
return getBulletIndent() + ivalue;
}
public int getBulletIndent() {
if (bindent != -1)
return bindent;
return 0;
}
/*
* @see IBulletParagraph#getBulletStyle()
*/
public int getBulletStyle() {
return style;
}
public void setBulletStyle(int style) {
this.style = style;
}
public void setBulletText(String text) {
this.text = text;
}
public void setIndent(int indent) {
this.indent = indent;
}
public void setBulletIndent(int bindent) {
this.bindent = bindent;
}
/*
* @see IBulletParagraph#getBulletText()
*/
public String getBulletText() {
return text;
}
public void layout(GC gc, int width, Locator loc, int lineHeight,
Hashtable resourceTable, IHyperlinkSegment selectedLink) {
computeRowHeights(gc, width, loc, lineHeight, resourceTable);
layoutBullet(gc, loc, lineHeight, resourceTable);
super.layout(gc, width, loc, lineHeight, resourceTable, selectedLink);
}
public void paint(GC gc, Rectangle repaintRegion,
Hashtable resourceTable, IHyperlinkSegment selectedLink,
SelectionData selData) {
paintBullet(gc, repaintRegion, resourceTable);
super.paint(gc, repaintRegion, resourceTable, selectedLink, selData);
}
private void layoutBullet(GC gc, Locator loc, int lineHeight,
Hashtable resourceTable) {
int x = loc.x - getIndent() + getBulletIndent();
int rowHeight = ((int[]) loc.heights.get(0))[0];
if (style == CIRCLE) {
int y = loc.y + rowHeight / 2 - CIRCLE_DIAM / 2;
bbounds = new Rectangle(x, y, CIRCLE_DIAM, CIRCLE_DIAM);
} else if (style == TEXT && text != null) {
//int height = gc.getFontMetrics().getHeight();
Point textSize = gc.textExtent(text);
bbounds = new Rectangle(x, loc.y, textSize.x, textSize.y);
} else if (style == IMAGE && text != null) {
Image image = (Image) resourceTable.get(text);
if (image != null) {
Rectangle ibounds = image.getBounds();
int y = loc.y + rowHeight / 2 - ibounds.height / 2;
bbounds = new Rectangle(x, y, ibounds.width, ibounds.height);
}
}
}
public void paintBullet(GC gc, Rectangle repaintRegion,
Hashtable resourceTable) {
if (bbounds == null)
return;
int x = bbounds.x;
int y = bbounds.y;
if (repaintRegion != null) {
x -= repaintRegion.x;
y -= repaintRegion.y;
}
if (style == CIRCLE) {
Color bg = gc.getBackground();
Color fg = gc.getForeground();
gc.setBackground(fg);
gc.fillRectangle(x, y + 1, 5, 3);
gc.fillRectangle(x + 1, y, 3, 5);
gc.setBackground(bg);
} else if (style == TEXT && text != null) {
gc.drawText(text, x, y);
} else if (style == IMAGE && text != null) {
Image image = (Image) resourceTable.get(text);
if (image != null)
gc.drawImage(image, x, y);
}
}
}