package org.archstudio.swtutils;
import org.eclipse.jface.resource.FontRegistry;
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.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.TextLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
public class Banner extends Canvas implements PaintListener {
protected Composite parent;
protected String mainText;
protected String secondaryText;
protected Button button;
protected Image icon;
protected Point iconSize = new Point(0, 0);
protected int iconGap = 0;
protected Color textColor;
protected Color fg;
protected Color bg;
protected Font mainTextFont;
protected Font secondaryTextFont;
protected Rectangle mainTextBounds;
protected Rectangle secondaryTextBounds;
public Banner(Composite parent, Image icon, String mainText, String secondaryText, Color fg, Color bg) {
super(parent, SWT.NONE);
this.parent = parent;
this.icon = icon;
if (icon != null) {
iconSize = new Point(icon.getBounds().width, icon.getBounds().height);
iconGap = 5;
}
this.mainText = mainText;
this.secondaryText = secondaryText;
this.textColor = parent.getDisplay().getSystemColor(SWT.COLOR_WHITE);
this.fg = fg;
this.bg = bg;
FontRegistry fr = JFaceResources.getFontRegistry();
mainTextFont = fr.getBold(JFaceResources.HEADER_FONT);
secondaryTextFont = fr.getItalic(JFaceResources.DEFAULT_FONT);
TextLayout mainTextLayout = new TextLayout(parent.getDisplay());
mainTextLayout.setFont(mainTextFont);
mainTextLayout.setText(mainText);
mainTextBounds = mainTextLayout.getBounds();
TextLayout secondaryTextLayout = new TextLayout(parent.getDisplay());
secondaryTextLayout.setFont(secondaryTextFont);
secondaryTextLayout.setText(secondaryText);
secondaryTextBounds = secondaryTextLayout.getBounds();
this.addPaintListener(this);
}
@Override
public void dispose() {
this.removePaintListener(this);
super.dispose();
}
public Point _computeSize(int wHint, int hHint) {
int width = 50;
if (wHint != SWT.DEFAULT) {
width = wHint;
}
else {
width = iconSize.x + iconGap + mainTextBounds.width + secondaryTextBounds.width + 40;
}
int height = Math.max(iconSize.y, Math.max(mainTextBounds.height, secondaryTextBounds.height)) + 10;
return new Point(width, height);
}
@Override
public Point computeSize(int wHint, int hHint) {
return _computeSize(wHint, hHint);
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
return _computeSize(wHint, hHint);
}
@Override
public void paintControl(PaintEvent e) {
GC gc = e.gc;
Canvas c = (Canvas) e.widget;
gc.setForeground(fg);
gc.setBackground(bg);
Point size = c.getSize();
gc.fillGradientRectangle(0, 0, size.x, size.y, false);
gc.setLineWidth(1);
gc.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_GRAY));
gc.drawLine(0, 0, 0, size.y - 1);
gc.drawLine(0, 0, size.x - 1, 0);
gc.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
gc.drawLine(0, size.y - 1, size.x - 1, size.y - 1);
gc.drawLine(size.x - 1, size.y - 1, size.x - 1, size.y - 1);
if (icon != null) {
gc.drawImage(icon, 5, (size.y - iconSize.y) / 2);
}
int mainY = (size.y - mainTextBounds.height) / 2;
int secondaryY = (size.y - secondaryTextBounds.height) / 2;
gc.setForeground(textColor);
gc.setFont(mainTextFont);
gc.drawString(mainText, 5 + iconSize.x + iconGap, mainY, true);
boolean shouldDrawSecondary = mainTextBounds.width + secondaryTextBounds.width + 15 <= size.x;
if (shouldDrawSecondary) {
gc.setFont(secondaryTextFont);
gc.drawString(secondaryText, size.x - secondaryTextBounds.width - 5, secondaryY, true);
}
}
}