package at.medevit.elexis.impfplan.ui;
//Send questions, comments, bug reports, etc. to the authors:
//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
public class GraphicsUtil {
public static void drawVerticalText(String string, Display display, int x, int y, GC gc,
int style) {
if (display == null) SWT.error(SWT.ERROR_THREAD_INVALID_ACCESS);
// Determine string's dimensions
Point pt = gc.textExtent(string);
// Create an image the same size as the string
Image stringImage = new Image(display, pt.x, pt.y);
// Create a GC so we can draw the image
GC stringGc = new GC(stringImage);
// Set attributes from the original GC to the new GC
stringGc.setForeground(gc.getForeground());
stringGc.setBackground(gc.getBackground());
stringGc.setFont(gc.getFont());
// Draw the text onto the image
stringGc.drawText(string, 0, 0);
// Draw the image vertically onto the original GC
drawVerticalImage(stringImage, display, x, y, gc, style);
// Dispose the new GC
stringGc.dispose();
// Dispose the image
stringImage.dispose();
}
/**
* Draws an image vertically (rotates plus or minus 90 degrees)
* <dl>
* <dt><b>Styles: </b></dt>
* <dd>UP, DOWN</dd>
* </dl>
*
* @param image the image to draw
* @param x the x coordinate of the top left corner of the drawing rectangle
* @param y the y coordinate of the top left corner of the drawing rectangle
* @param gc the GC on which to draw the image
* @param style the style (SWT.UP or SWT.DOWN) and (SWT.TOP or SWT.BOTTOM)
* <p>
* Note: Only one of the style UP or DOWN may be specified. The TOP or BOTTOM
* denoty wether y is defined as the source or the target to bound to
* </p>
* @param containerHeight
*/
public static void drawVerticalImage(Image image, Display display, int x, int y, GC gc, int style) {
// Get the current display
if (display == null) SWT.error(SWT.ERROR_THREAD_INVALID_ACCESS);
// Use the image's data to create a rotated image's data
ImageData sd = image.getImageData();
ImageData dd = new ImageData(sd.height, sd.width, sd.depth, sd.palette);
// Determine which way to rotate, depending on up or down
boolean up = (style & SWT.UP) == SWT.UP;
// Run through the horizontal pixels
for (int sx = 0; sx < sd.width; sx++) {
// Run through the vertical pixels
for (int sy = 0; sy < sd.height; sy++) {
// Determine where to move pixel to in destination image data
int dx = up ? sy : sd.height - sy - 1;
int dy = up ? sd.width - sx - 1 : sx;
// Swap the x, y source data to y, x in the destination
dd.setPixel(dx, dy, sd.getPixel(sx, sy));
}
}
// Create the vertical image
Image vertical = new Image(display, dd);
boolean bottom = (style & SWT.BOTTOM) == SWT.BOTTOM;
if(bottom) {
gc.drawImage(vertical, x, y - vertical.getImageData().height);
} else {
// Draw the vertical image onto the original GC
gc.drawImage(vertical, x, y);
}
// Dispose the vertical image
vertical.dispose();
}
}