diff agent/src/share/classes/sun/jvm/hotspot/ui/Annotation.java @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children c18cbe5936b8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/agent/src/share/classes/sun/jvm/hotspot/ui/Annotation.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2000-2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package sun.jvm.hotspot.ui;
+
+import java.awt.*;
+import java.awt.font.*;
+import java.awt.geom.*;
+import java.util.*;
+
+import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.utilities.*;
+
+/** This can be extended, along with AnnotatedMemoryPanel, to be an
+    arbitrarily complex mechanism, supporting user interaction,
+    etc. */
+
+public class Annotation {
+  private Interval interval;
+  // List<String>
+  private java.util.List strings;
+  // List<Integer>
+  private java.util.List heights;
+  private Color baseColor;
+  private int width;
+  private int height;
+  private int x;
+  private int y;
+
+  /** The Annotation can handle the sense of lowAddress and
+      highAddress being swapped. */
+  public Annotation(Address lowAddress,
+                    Address highAddress,
+                    String s) {
+    strings = new ArrayList();
+    heights = new ArrayList();
+    for (StringTokenizer tok = new StringTokenizer(s, "\n"); tok.hasMoreTokens(); ) {
+      strings.add(tok.nextToken());
+    }
+    if (AddressOps.lessThan(highAddress, lowAddress)) {
+      Address temp = lowAddress;
+      lowAddress = highAddress;
+      highAddress = temp;
+    }
+    interval = new Interval(lowAddress, highAddress);
+  }
+
+  public Interval getInterval() {
+    return interval;
+  }
+
+  public Address getLowAddress() {
+    return (Address) getInterval().getLowEndpoint();
+  }
+
+  public Address getHighAddress() {
+    return (Address) getInterval().getHighEndpoint();
+  }
+
+  /** Draw the annotation at its current (x, y) position with its
+      current color */
+  public void draw(Graphics g) {
+    g.setColor(baseColor);
+    int tmpY = y;
+    for (int i = 0; i < strings.size(); i++) {
+      String s = (String) strings.get(i);
+      Integer h = (Integer) heights.get(i);
+      g.drawString(s, x, tmpY);
+      tmpY += h.intValue();
+    }
+  }
+
+  /** Sets the base color of this annotation. The annotation may
+      render sub-portions in a different color if desired. */
+  public void setColor(Color c) {
+    this.baseColor = c;
+  }
+
+  /** Returns the base color of this annotation. */
+  public Color getColor() {
+    return baseColor;
+  }
+
+  /** Computes width and height for this Annotation. Retrieve the
+      computed information using getWidth() and getHeight(). Separated
+      because the width and height only need to be recomputed if the
+      font changes. */
+  public void computeWidthAndHeight(Graphics g) {
+    width = 0;
+    height = 0;
+    heights.clear();
+    for (Iterator iter = strings.iterator(); iter.hasNext(); ) {
+      String s = (String) iter.next();
+      Rectangle2D bounds = GraphicsUtilities.getStringBounds(s, g);
+      width  =  Math.max(width, (int) bounds.getWidth());
+      height += (int) bounds.getHeight();
+      heights.add(new Integer((int) bounds.getHeight()));
+    }
+  }
+
+  public int getWidth() {
+    return width;
+  }
+
+  public int getHeight() {
+    return height;
+  }
+
+  /** Set the x and y position of this annotation */
+  public void setXAndY(int x, int y) {
+    this.x = x; this.y = y;
+  }
+
+  public void setX(int x) {
+    this.x = x;
+  }
+
+  public int getX() {
+    return x;
+  }
+
+  public void setY(int y) {
+    this.y = y;
+  }
+
+  public int getY() {
+    return y;
+  }
+
+  public Rectangle getBounds() {
+    return new Rectangle(x, y, width, height);
+  }
+  public String toString() {
+    String result = "Annotation: lowAddr: " + getLowAddress() + " highAddr: " + getHighAddress() + " strings: "  + strings.size();
+    for (int i = 0; i < strings.size(); i++) {
+      result += "\n" + (String) strings.get(i);
+    }
+    return result;
+  }
+}