| /******************************************************************************* |
| * 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); |
| } |
| } |
| } |