|
TextRoi |
|
package ij.gui; import java.awt.*; import ij.*; import ij.process.*; import ij.util.Java2; /** This class is a rectangular ROI containing text. */ public class TextRoi extends Roi { static final int MAX_LINES = 50; private String[] theText = new String[MAX_LINES]; private static String name = "SansSerif"; private static int style = Font.PLAIN; private static int size = 18; private static Font font; private static boolean antialiasedText = true; private double previousMag; private boolean firstChar = true; private boolean firstMouseUp = true; private int cline = 0; public TextRoi(int x, int y, ImagePlus imp) { super(x, y, imp); ImageCanvas ic = imp.getCanvas(); double mag = (ic!=null)?ic.getMagnification():1.0; if (mag>1.0) mag = 1.0; if (size<(12/mag)) size = (int)(12/mag); theText[0] = "Type, then"; theText[1] = "Ctl+D"; if (previousRoi!=null && (previousRoi instanceof TextRoi)) { firstMouseUp = false; //IJ.write(""+previousRoi.getBounds()); previousRoi = null; } } /** Adds the specified character to the end of the text string. */ public void addChar(char c) { if (!(c>=' ' || c=='\b' || c=='\n')) return; if (firstChar) { cline = 0; theText[cline] = new String(""); for (int i=1; i<MAX_LINES; i++) theText[i] = null; } if ((int)c=='\b') { // backspace if (theText[cline].length()>0) theText[cline] = theText[cline].substring(0, theText[cline].length()-1); else if (cline>0) { theText[cline] = null; cline--; } imp.draw(clipX, clipY, clipWidth, clipHeight); firstChar = false; return; } else if ((int)c=='\n') { // newline if (cline<(MAX_LINES-1)) cline++; theText[cline] = ""; adjustSize(); } else { char[] chr = {c}; theText[cline] += new String(chr); adjustSize(); updateClipRect(); imp.draw(clipX, clipY, clipWidth, clipHeight); firstChar = false; return; } } Font getCurrentFont() { double mag = ic.getMagnification(); if (font==null || mag!=previousMag) { font = new Font(name, style, (int)(size*mag)); previousMag = mag; } return font; } /** Renders the text on the image. */ public void drawPixels(ImageProcessor ip) { Font font = new Font(name, style, size); ip.setFont(font); ip.setAntialiasedText(antialiasedText); FontMetrics metrics = ip.getFontMetrics(); int fontHeight = metrics.getHeight(); int descent = metrics.getDescent(); int i = 0; int yy = 0; while (i<MAX_LINES && theText[i]!=null) { ip.drawString(theText[i], x, y+yy+fontHeight); i++; yy += fontHeight; } } /** Draws the text on the screen, clipped to the ROI. */ public void draw(Graphics g) { super.draw(g); // draw the rectangle g.setColor(instanceColor!=null?instanceColor:ROIColor); double mag = ic.getMagnification(); int sx = ic.screenX(x); int sy = ic.screenY(y); int swidth = (int)(width*mag); int sheight = (int)(height*mag); if (IJ.isJava2()) Java2.setAntialiasedText(g, antialiasedText); if (font==null) adjustSize(); Font font = getCurrentFont(); FontMetrics metrics = g.getFontMetrics(font); int fontHeight = metrics.getHeight(); int descent = metrics.getDescent(); g.setFont(font); Rectangle r = g.getClipBounds(); g.setClip(sx, sy, swidth, sheight); int i = 0; while (i<MAX_LINES && theText[i]!=null) { g.drawString(theText[i], sx, sy+fontHeight-descent); i++; sy += fontHeight; } if (r!=null) g.setClip(r.x, r.y, r.width, r.height); } /* void handleMouseUp(int screenX, int screenY) { if (width<size || height<size) grow(x+Math.max(size*5,width), y+Math.max((int)(size*1.5),height)); super.handleMouseUp(screenX, screenY); } */ /** Returns the name of the current font. */ public static String getFont() { return name; } /** Returns the current font size. */ public static int getSize() { return size; } /** Returns the current font style. */ public static int getStyle() { return style; } public static boolean isAntialiased() { return antialiasedText; } /** Sets the font face, size and style. */ public static void setFont(String fontName, int fontSize, int fontStyle) { setFont(fontName, fontSize, fontStyle, true); } /** Sets the font face, size, style and antialiasing mode. */ public static void setFont(String fontName, int fontSize, int fontStyle, boolean antialiased) { name = fontName; size = fontSize; style = fontStyle; antialiasedText = antialiased; font = null; ImagePlus imp = WindowManager.getCurrentImage(); if (imp!=null) { Roi roi = imp.getRoi(); if (roi instanceof TextRoi) imp.draw(); } } //v1.24g protected void handleMouseUp(int screenX, int screenY) { super.handleMouseUp(screenX, screenY); if (firstMouseUp) { adjustSize(); firstMouseUp = false; } else { if (width<5 || height<5) imp.killRoi(); } } /** Increases the size of the rectangle so it's large enough to hold the text. */ //v1.24g void adjustSize() { if (ic==null) return; double mag = ic.getMagnification(); Font font = getCurrentFont(); Graphics g = ic.getGraphics(); if (IJ.isJava2()) Java2.setAntialiasedText(g, true); FontMetrics metrics = g.getFontMetrics(font); int fontHeight = (int)(metrics.getHeight()/mag); int descent = metrics.getDescent(); int i=0, nLines=0; oldX = x; oldY = y; oldWidth = width; oldHeight = height; width = 10; while (i<MAX_LINES && theText[i]!=null) { nLines++; int w = (int)(stringWidth(theText[i],metrics,g)/mag); if (w>width) width = w; i++; } g.dispose(); width += 2; if (x+width>xMax) x = xMax-width; height = nLines*fontHeight+2; if (height>yMax) height = yMax; if (y+height>yMax) y = yMax-height; updateClipRect(); imp.draw(clipX, clipY, clipWidth, clipHeight); } int stringWidth(String s, FontMetrics metrics, Graphics g) { if (IJ.isJava2()) return Java2.getStringWidth(s, metrics, g); else return metrics.stringWidth(s); } }
|
TextRoi |
|