reorganized file layout (part 2: edits)
[org.ibex.core.git] / src / org / ibex / core / Box.java
index c898d8e..f333abb 100644 (file)
@@ -1,6 +1,6 @@
 // FIXME
 // Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL]
-package org.ibex;
+package org.ibex.core;
 
 // FIXME: are traps on x/y meaningful?
 // FIXME: if we trap on cols, then set rows to 0 (forcing cols to 1), does the cols trap get triggered?
@@ -17,7 +17,7 @@ package org.ibex;
 import java.util.*;
 import org.ibex.js.*;
 import org.ibex.util.*;
-import org.ibex.translators.*;
+import org.ibex.graphics.*;
 
 /**
  *  <p>
@@ -38,7 +38,7 @@ import org.ibex.translators.*;
  *  trigger a Surface.abort; if rendering were done in the same pass,
  *  rendering work done prior to the Surface.abort would be wasted.
  */
-public final class Box extends JSScope implements Scheduler.Task {
+public final class Box extends JSScope implements Task {
 
     // Macros //////////////////////////////////////////////////////////////////////
 
@@ -52,7 +52,7 @@ public final class Box extends JSScope implements Scheduler.Task {
     //#define CHECKSET_BOOLEAN(prop) boolean nu = toBoolean(value); if (nu == prop) break; prop = nu;
     //#define CHECKSET_STRING(prop) if ((value==null&&prop==null)||(value!=null&&JS.toString(value).equals(prop))) break; prop=JS.toString(value);
 
-    protected Box() { super(null); }
+    public Box() { super(null); }
 
     // FIXME memory leak
     static Hash boxToCursor = new Hash(500, 3);
@@ -128,9 +128,9 @@ public final class Box extends JSScope implements Scheduler.Task {
 
     /*
     private VectorGraphics.VectorPath path = null;
-    private VectorGraphics.Affine transform = null;
+    private Affine transform = null;
     private VectorGraphics.RasterPath rpath = null;
-    private VectorGraphics.Affine rtransform = null;
+    private Affine rtransform = null;
     */
 
     //#define DIRTY dirty()
@@ -172,11 +172,11 @@ public final class Box extends JSScope implements Scheduler.Task {
     // Reflow ////////////////////////////////////////////////////////////////////////////////////////
 
     /** should only be invoked on the root box */
-    void reflow() { pack(); resize(x, y, maxwidth, maxheight); place(); }
+    public void reflow() { pack(); resize(x, y, maxwidth, maxheight); place(); }
 
     private static Box[] frontier = new Box[65535];
     /** pack the boxes into rows and columns, compute contentwidth */
-    void pack() {
+    public void pack() {
         if (!test(REPACK)) { constrain(); return; }
         boolean haskid = false;
         for(Box child = getChild(0); child != null; child = child.nextSibling()) { haskid = true; child.pack(); }
@@ -390,7 +390,7 @@ public final class Box extends JSScope implements Scheduler.Task {
     // Rendering Pipeline /////////////////////////////////////////////////////////////////////
 
     /** Renders self and children within the specified region. All rendering operations are clipped to xIn,yIn,wIn,hIn */
-    void render(int parentx, int parenty, int cx1, int cy1, int cx2, int cy2, PixelBuffer buf, VectorGraphics.Affine a) {
+    public void render(int parentx, int parenty, int cx1, int cy1, int cx2, int cy2, PixelBuffer buf, Affine a) {
         if (!test(VISIBLE)) return;
         int globalx = parentx + (parent == null ? 0 : x);
         int globaly = parenty + (parent == null ? 0 : y);
@@ -463,9 +463,9 @@ public final class Box extends JSScope implements Scheduler.Task {
         case "distanceto": return METHOD;
         case "text": return text;
         case "path": throw new JSExn("cannot read from the path property");
-        case "fill": return colorToString(fillcolor);
-        case "strokecolor": return colorToString(strokecolor);
-        case "textcolor": return colorToString(strokecolor);
+        case "fill": return Color.colorToString(fillcolor);
+        case "strokecolor": return Color.colorToString(strokecolor);
+        case "textcolor": return Color.colorToString(strokecolor);
         case "font": return font == null ? null : font.stream;
         case "fontsize": return font == null ? N(10) : N(font.pointsize);
         case "strokewidth": return N(strokewidth);
@@ -539,8 +539,8 @@ public final class Box extends JSScope implements Scheduler.Task {
         //#switch(name)
         case "thisbox":     if (value == null) removeSelf();
         case "text":        if (value == null) value = ""; CHECKSET_STRING(text); RECONSTRAIN(); DIRTY;
-        case "strokecolor": value = N(stringToColor((String)value)); CHECKSET_INT(strokecolor); DIRTY;
-        case "textcolor":   value = N(stringToColor((String)value)); CHECKSET_INT(strokecolor); DIRTY;
+        case "strokecolor": value = N(Color.stringToColor((String)value)); CHECKSET_INT(strokecolor); DIRTY;
+        case "textcolor":   value = N(Color.stringToColor((String)value)); CHECKSET_INT(strokecolor); DIRTY;
         case "strokewidth": CHECKSET_SHORT(strokewidth); DIRTY;
         case "shrink":      CHECKSET_FLAG(HSHRINK | VSHRINK); RECONSTRAIN();
         case "hshrink":     CHECKSET_FLAG(HSHRINK); RECONSTRAIN();
@@ -695,7 +695,7 @@ public final class Box extends JSScope implements Scheduler.Task {
             texture = null;
             fillcolor = 0;
         } else if (value instanceof String) {
-            int newfillcolor = stringToColor((String)value);
+            int newfillcolor = Color.stringToColor((String)value);
             if (newfillcolor == fillcolor) return;
             fillcolor = newfillcolor;
             texture = null;
@@ -761,34 +761,6 @@ public final class Box extends JSScope implements Scheduler.Task {
                     putAndTriggerTrapsAndCatchExceptions(name.substring(1), value);
     }
 
-    private static int stringToColor(String s) {
-        // FIXME support three-char strings by doubling digits
-        if (s == null) return 0x00000000;
-        else if (SVG.colors.get(s) != null) return 0xFF000000 | toInt(SVG.colors.get(s));
-        else if (s.length() == 7 && s.charAt(0) == '#') try {
-            // FEATURE  alpha
-            return 0xFF000000 |
-                (Integer.parseInt(s.substring(1, 3), 16) << 16) |
-                (Integer.parseInt(s.substring(3, 5), 16) << 8) |
-                Integer.parseInt(s.substring(5, 7), 16);
-        } catch (NumberFormatException e) {
-            Log.info(Box.class, "invalid color " + s);
-            return 0;
-        }
-        else return 0; // FEATURE: error?
-    }
-
-    private static String colorToString(int argb) {
-        if ((argb & 0xFF000000) == 0) return null;
-        String red = Integer.toHexString((argb & 0x00FF0000) >> 16);
-        String green = Integer.toHexString((argb & 0x0000FF00) >> 8);
-        String blue = Integer.toHexString(argb & 0x000000FF);
-        if (red.length() < 2) red = "0" + red;
-        if (blue.length() < 2) blue = "0" + blue;
-        if (green.length() < 2) green = "0" + green;
-        return "#" + red + green + blue;
-    }
-
     /** figures out what box in this subtree of the Box owns the pixel at x,y relitave to the Surface */
     public static Box whoIs(Box cur, int x, int y) {
 
@@ -862,7 +834,7 @@ public final class Box extends JSScope implements Scheduler.Task {
 
     // Tree Manipulation /////////////////////////////////////////////////////////////////////
 
-    void removeSelf() {
+    public void removeSelf() {
         if (parent != null) { parent.removeChild(parent.indexNode(this)); return; }
         Surface surface = Surface.fromBox(this); 
         if (surface != null) surface.dispose(true);
@@ -936,8 +908,8 @@ public final class Box extends JSScope implements Scheduler.Task {
             putAndTriggerTrapsAndCatchExceptions("ChildChange", b);
         }
     }
-
-    void putAndTriggerTrapsAndCatchExceptions(Object name, Object val) {
+    
+    public void putAndTriggerTrapsAndCatchExceptions(Object name, Object val) {
         try {
             putAndTriggerTraps(name, val);
         } catch (JSExn e) {