package com.horstmann.violet.framework.swingextension; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; /** * Multiline label Class grabbed from java2s.com ( * http://www.java2s.com/Code/Java/Swing-Components/MultiLineLabel.htm) and * modified * * * @author Alexandre de Pellegrin * */ public class MultiLineLabel extends Canvas { // public static final int LEFT = 0; // Alignment constants // // public static final int CENTER = 1; // // public static final int RIGHT = 2; // // protected MultiLineString label; // // protected int margin_width; // Left and right margins // // protected int margin_height; // Top and bottom margins // // protected int line_height; // Total height of the font // // protected int line_ascent; // Font height above baseline // // protected int[] line_widths; // How wide each line is // // protected int max_width; // The width of the widest line // // protected int alignment = LEFT; // The alignment of the text. // // // This method breaks a specified label up into an array of lines. // // It uses the StringTokenizer utility class. // protected void newLabel(MultiLineString label) { // this.label = label; // line_widths = new int[this.label.count()]; // } // // // This method figures out how the font is, and how wide each // // line of the label is, and how wide the widest line is. // protected void measure() { // FontMetrics fm = getFontMetrics(getFont()); // // If we don't have font metrics yet, just return. // if (fm == null) // return; // // line_height = fm.getHeight(); // line_ascent = fm.getAscent(); // max_width = 0; // for (int i = 0; i < this.label.count(); i++) { // //todo zrobic funkcje zwracajaca wyswietlany tekst //// line_widths[i] = fm.stringWidth(this.label.getLine(i).toEditor()); // if (line_widths[i] > max_width) // max_width = line_widths[i]; // } // } // // // Here are four versions of the cosntrutor. // // Break the label up into separate lines, and save the other info. // public MultiLineLabel(MultiLineString label, int margin_width, int margin_height, int alignment) { // newLabel(label); // this.margin_width = margin_width; // this.margin_height = margin_height; // this.alignment = alignment; // } // // public MultiLineLabel(MultiLineString label, int margin_width, int margin_height) { // this(label, margin_width, margin_height, LEFT); // } // // public MultiLineLabel(MultiLineString label, int alignment) { // this(label, 10, 10, alignment); // } // // public MultiLineLabel(MultiLineString label) { // this(label, 10, 10, LEFT); // } // // // Methods to set the various attributes of the component // public void setLabel(MultiLineString label) { // newLabel(label); // measure(); // repaint(); // } // // public void setFont(Font f) { // super.setFont(f); // measure(); // repaint(); // } // // public void setForeground(Color c) { // super.setForeground(c); // repaint(); // } // // public void setAlignment(int a) { // alignment = a; // repaint(); // } // // public void setMarginWidth(int mw) { // margin_width = mw; // repaint(); // } // // public void setMarginHeight(int mh) { // margin_height = mh; // repaint(); // } // // public int getAlignment() { // return alignment; // } // // public int getMarginWidth() { // return margin_width; // } // // public int getMarginHeight() { // return margin_height; // } // // // This method is invoked after our Canvas is first created // // but before it can actually be displayed. After we've // // invoked our superclass's addNotify() method, we have font // // metrics and can successfully call measure() to figure out // // how big the label is. // public void addNotify() { // super.addNotify(); // measure(); // } // // // This method is called by a layout manager when it wants to // // know how big we'd like to be. // public Dimension getPreferredSize() { // return new Dimension(max_width + 2 * margin_width, this.label.count() * line_height + 2 * margin_height); // } // // // This method is called when the layout manager wants to know // // the bare minimum amount of space we need to get by. // public Dimension getMinimumSize() { // return new Dimension(max_width, this.label.count() * line_height); // } // // // This method draws the label (applets use the same method). // // Note that it handles the margins and the alignment, but that // // it doesn't have to worry about the color or font--the superclass // // takes care of setting those in the Graphics object we're passed. // public void paint(Graphics g) { // int x, y; // Dimension d = getSize(); // y = line_ascent + (d.height - this.label.count() * line_height) / 2; // for (int i = 0; i < this.label.count(); i++, y += line_height) { // switch (alignment) { // case LEFT: // x = margin_width; // break; // case CENTER: // default: // x = (d.width - line_widths[i]) / 2; // break; // case RIGHT: // x = d.width - margin_width - line_widths[i]; // break; // } // Font oldFont = g.getFont(); // g.setFont(getFont()); //// g.drawString(label.getLine(i).toHTML(), x, y); // g.setFont(oldFont); // } // } }