add another java client
[spider.git] / spider-web / MultiLineLabel.java
diff --git a/spider-web/MultiLineLabel.java b/spider-web/MultiLineLabel.java
new file mode 100755 (executable)
index 0000000..770a5d9
--- /dev/null
@@ -0,0 +1,111 @@
+import java.awt.*;
+import java.util.*;
+
+public class MultiLineLabel extends Canvas {
+       public static final int LEFT = 0;
+       public static final int CENTER = 1;
+       public static final int RIGHT = 2;
+       protected String[] lines;
+       protected int num_lines;
+       protected int margin_width;
+       protected int margin_height;
+       protected int line_height;
+       protected int line_ascent;
+       protected int[] line_widths;
+       protected int max_width;
+       protected int alignment = LEFT;
+       
+       protected void newLabel(String label) {
+               StringTokenizer t = new StringTokenizer(label,"\n");
+               num_lines = t.countTokens();
+               lines = new String[num_lines];
+               line_widths = new int[num_lines];
+               for(int i = 0; i < num_lines; i++) lines[i] = t.nextToken();
+       }
+       
+       protected void measure() {
+               FontMetrics fm = this.getFontMetrics(this.getFont());
+               if (fm == null) return;
+               
+               line_height = fm.getHeight();
+               line_ascent = fm.getAscent();
+               max_width = 0;
+               for(int i = 0; i < num_lines; i++) {
+                       line_widths[i] = fm.stringWidth(lines[i]);
+                       if (line_widths[i] > max_width) max_width = line_widths[i];     
+               }
+       }
+       
+       public MultiLineLabel(String 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(String label, int margin_width, int margin_height) {
+               this(label, margin_width, margin_height, LEFT);
+       }
+       
+       public MultiLineLabel(String label, int aligment) {
+               this(label, 10, 10, aligment);
+       }
+       
+       public MultiLineLabel(String label) {
+               this(label, 10, 10, LEFT);
+       }
+       
+       public void setLabel(String label) {
+               newLabel(label);
+               measure();
+               repaint();
+       }
+       
+       public void setFont(Font f) {
+               super.setFont(f);
+               measure();
+               repaint();
+       }
+       
+       public void setForegroundColor(Color c) {
+               super.setForeground(c);
+               repaint();
+       }
+       
+       public void setAligment(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; }
+       
+       public void addNotify() { super.addNotify(); measure(); }
+       
+       public Dimension preferedSize() {
+               return new Dimension(max_width + 2 * margin_width,
+                                    num_lines * line_height + 2 * margin_height);
+       }
+       
+       public Dimension miniumSize() {
+               return new Dimension(max_width, num_lines * line_height);
+       }
+       
+       public void paint(Graphics g) {
+               int x,y;
+               Dimension d = this.size();
+               y = line_ascent + (d.height - num_lines * line_height) / 2;
+               for(int i = 0; i < num_lines; 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;
+                       }
+                       g.drawString(lines[i], x, y);
+               }
+       }
+}