projects
/
org.ibex.core.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
move JS's Hashtable to JS.O
[org.ibex.core.git]
/
src
/
org
/
ibex
/
core
/
Box.java
diff --git
a/src/org/ibex/core/Box.java
b/src/org/ibex/core/Box.java
index
8cf6271
..
bb8a27b
100644
(file)
--- a/
src/org/ibex/core/Box.java
+++ b/
src/org/ibex/core/Box.java
@@
-65,8
+65,8
@@
public final class Box extends JSScope implements Task {
static final int MOUSEINSIDE = 0x00000001;
static final int VISIBLE = 0x00000002;
static final int PACKED = 0x00000004;
static final int MOUSEINSIDE = 0x00000001;
static final int VISIBLE = 0x00000002;
static final int PACKED = 0x00000004;
- static final int HSHRINK = 0x00000008;
- static final int VSHRINK = 0x00000010;
+ public static final int HSHRINK = 0x00000008;
+ public static final int VSHRINK = 0x00000010;
static final int BLACK = 0x00000020; // for red-black code
static final int FIXED = 0x00000040;
static final int BLACK = 0x00000020; // for red-black code
static final int FIXED = 0x00000040;
@@
-123,18
+123,16
@@
public final class Box extends JSScope implements Task {
public int ay = 0; // FEATURE: roll these into x/y; requires lots of changes; perhaps y()?
public int width = 0;
public int height = 0;
public int ay = 0; // FEATURE: roll these into x/y; requires lots of changes; perhaps y()?
public int width = 0;
public int height = 0;
- private int contentwidth = 0; // == max(minwidth, textwidth, sum(child.contentwidth))
- private int contentheight = 0;
+ public int contentwidth = 0; // == max(minwidth, textwidth, sum(child.contentwidth))
+ public int contentheight = 0;
+ private Path path = null;
/*
/*
- private VectorGraphics.VectorPath path = null;
private Affine transform = null;
private VectorGraphics.RasterPath rpath = null;
private Affine rtransform = null;
*/
private Affine transform = null;
private VectorGraphics.RasterPath rpath = null;
private Affine rtransform = null;
*/
- //#define DIRTY dirty()
-
// Instance Methods /////////////////////////////////////////////////////////////////////
public final int fontSize() { return font == null ? DEFAULT_FONT.pointsize : font.pointsize; }
// Instance Methods /////////////////////////////////////////////////////////////////////
public final int fontSize() { return font == null ? DEFAULT_FONT.pointsize : font.pointsize; }
@@
-143,9
+141,9
@@
public final class Box extends JSScope implements Task {
public void perform() throws JSExn {
if (texture == null) { Log.warn(Box.class, "perform() called with null texture"); return; }
if (texture.isLoaded) {
public void perform() throws JSExn {
if (texture == null) { Log.warn(Box.class, "perform() called with null texture"); return; }
if (texture.isLoaded) {
- setWidth(max(texture.width, maxwidth), maxwidth);
- setHeight(max(texture.height, maxheight), maxheight);
- DIRTY; }
+ setWidth(max(texture.width, minwidth), maxwidth);
+ setHeight(max(texture.height, minheight), maxheight);
+ dirty(); }
else { JS res = texture.stream; texture = null; throw new JSExn("image not found: "+res.unclone()); }
}
else { JS res = texture.stream; texture = null; throw new JSExn("image not found: "+res.unclone()); }
}
@@
-172,8
+170,14
@@
public final class Box extends JSScope implements Task {
// Reflow ////////////////////////////////////////////////////////////////////////////////////////
/** should only be invoked on the root box */
// Reflow ////////////////////////////////////////////////////////////////////////////////////////
/** should only be invoked on the root box */
- public void reflow() { pack(); resize(x, y, maxwidth, maxheight); place(); }
-
+ public void reflow() {
+ pack();
+ resize(x, y,
+ test(HSHRINK) ? contentwidth : maxwidth,
+ test(VSHRINK) ? contentheight : maxheight);
+ place();
+ }
+
private static Box[] frontier = new Box[65535];
/** pack the boxes into rows and columns, compute contentwidth */
public void pack() {
private static Box[] frontier = new Box[65535];
/** pack the boxes into rows and columns, compute contentwidth */
public void pack() {
@@
-228,7
+232,7
@@
public final class Box extends JSScope implements Task {
void resize(int x, int y, int width, int height) {
if (x == this.x && y == this.y && width == this.width && height == this.height) return;
void resize(int x, int y, int width, int height) {
if (x == this.x && y == this.y && width == this.width && height == this.height) return;
- boolean sizechange = (this.width != width || this.height != height) && getTrap("SizeChange") != null;
+ boolean sizechange = (this.width != width || this.height != height) && hasTrap("SizeChange");
int thisx = parent == null ? 0 : this.x;
int thisy = parent == null ? 0 : this.y;
Box who = (parent == null ? this : parent);
int thisx = parent == null ? 0 : this.x;
int thisy = parent == null ? 0 : this.y;
Box who = (parent == null ? this : parent);
@@
-242,7
+246,7
@@
public final class Box extends JSScope implements Task {
} else {
who.dirty(thisx, thisy, this.width, this.height);
this.width = width; this.height = height; this.x = x; this.y = y;
} else {
who.dirty(thisx, thisy, this.width, this.height);
this.width = width; this.height = height; this.x = x; this.y = y;
- DIRTY;
+ dirty();
}
if (sizechange) putAndTriggerTrapsAndCatchExceptions("SizeChange", T);
}
}
if (sizechange) putAndTriggerTrapsAndCatchExceptions("SizeChange", T);
}
@@
-420,6
+424,8
@@
public final class Box extends JSScope implements Task {
font.rasterizeGlyphs(text, buf, strokecolor, text_x, text_y, cx1, cy1, cx2, cy2);
}
font.rasterizeGlyphs(text, buf, strokecolor, text_x, text_y, cx1, cy1, cx2, cy2);
}
+ if (path != null) path.realize(Affine.translate(globalx, globaly)).stroke(buf, 1, strokecolor);
+
for(Box b = getChild(0); b != null; b = b.nextSibling())
b.render(globalx, globaly, cx1, cy1, cx2, cy2, buf, null);
}
for(Box b = getChild(0); b != null; b = b.nextSibling())
b.render(globalx, globaly, cx1, cy1, cx2, cy2, buf, null);
}
@@
-442,7
+448,7
@@
public final class Box extends JSScope implements Task {
case "distanceto":
Box b = (Box)a0;
case "distanceto":
Box b = (Box)a0;
- JS ret = new JS();
+ JS ret = new JS.O();
ret.put("x", N(b.localToGlobalX(0) - localToGlobalX(0)));
ret.put("y", N(b.localToGlobalY(0) - localToGlobalY(0)));
return ret;
ret.put("x", N(b.localToGlobalX(0) - localToGlobalX(0)));
ret.put("y", N(b.localToGlobalY(0) - localToGlobalY(0)));
return ret;
@@
-462,7
+468,13
@@
public final class Box extends JSScope implements Task {
case "indexof": return METHOD;
case "distanceto": return METHOD;
case "text": return text;
case "indexof": return METHOD;
case "distanceto": return METHOD;
case "text": return text;
- case "path": throw new JSExn("cannot read from the path property");
+ case "path":
+ if (path != null) return path.toString();
+ if (text == null) return null;
+ if (font == null) return null;
+ String ret = "";
+ for(int i=0; i<text.length(); i++) ret += font.glyphs[text.charAt(i)].path;
+ return ret;
case "fill": return Color.colorToString(fillcolor);
case "strokecolor": return Color.colorToString(strokecolor);
case "textcolor": return Color.colorToString(strokecolor);
case "fill": return Color.colorToString(fillcolor);
case "strokecolor": return Color.colorToString(strokecolor);
case "textcolor": return Color.colorToString(strokecolor);
@@
-506,7
+518,7
@@
public final class Box extends JSScope implements Task {
throw new Error("unreachable"); // unreachable
}
throw new Error("unreachable"); // unreachable
}
- private class Mouse extends JS.Cloneable {
+ private class Mouse extends JS implements JS.Cloneable {
public Object get(Object key) {
//#switch(key)
case "x": return N(globalToLocalX(getSurface()._mousex));
public Object get(Object key) {
//#switch(key)
case "x": return N(globalToLocalX(getSurface()._mousex));
@@
-538,13
+550,14
@@
public final class Box extends JSScope implements Task {
if (name instanceof Number) { put(toInt(name), value); return; }
//#switch(name)
case "thisbox": if (value == null) removeSelf();
if (name instanceof Number) { put(toInt(name), value); return; }
//#switch(name)
case "thisbox": if (value == null) removeSelf();
- case "text": if (value == null) value = ""; CHECKSET_STRING(text); RECONSTRAIN(); 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 "text": if (value == null) value = ""; CHECKSET_STRING(text); RECONSTRAIN(); 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();
case "vshrink": CHECKSET_FLAG(VSHRINK); RECONSTRAIN();
case "shrink": CHECKSET_FLAG(HSHRINK | VSHRINK); RECONSTRAIN();
case "hshrink": CHECKSET_FLAG(HSHRINK); RECONSTRAIN();
case "vshrink": CHECKSET_FLAG(VSHRINK); RECONSTRAIN();
+ case "path": path = Path.parse(toString(value)); RECONSTRAIN(); dirty();
case "width": setWidth(toInt(value), toInt(value));
case "height": setHeight(toInt(value), toInt(value));
case "maxwidth": setWidth(minwidth, toInt(value));
case "width": setWidth(toInt(value), toInt(value));
case "height": setHeight(toInt(value), toInt(value));
case "maxwidth": setWidth(minwidth, toInt(value));
@@
-553,12
+566,12
@@
public final class Box extends JSScope implements Task {
case "minheight": setHeight(toInt(value), maxheight);
case "colspan": if (toInt(value) > 0) { CHECKSET_SHORT(colspan); if (parent != null) parent.REPACK(); }
case "rowspan": if (toInt(value) > 0) { CHECKSET_SHORT(rowspan); if (parent != null) parent.REPACK(); }
case "minheight": setHeight(toInt(value), maxheight);
case "colspan": if (toInt(value) > 0) { CHECKSET_SHORT(colspan); if (parent != null) parent.REPACK(); }
case "rowspan": if (toInt(value) > 0) { CHECKSET_SHORT(rowspan); if (parent != null) parent.REPACK(); }
- case "visible": CHECKSET_FLAG(VISIBLE); RECONSTRAIN(); DIRTY;
+ case "visible": CHECKSET_FLAG(VISIBLE); RECONSTRAIN(); dirty();
case "packed": CHECKSET_FLAG(PACKED); if (parent != null) { parent.REPACK(); } else { REPACK(); }
case "align": clear(ALIGNS); setAlign(value == null ? "center" : value); REPLACE();
case "cursor": setCursor(value);
case "fill": setFill(value);
case "packed": CHECKSET_FLAG(PACKED); if (parent != null) { parent.REPACK(); } else { REPACK(); }
case "align": clear(ALIGNS); setAlign(value == null ? "center" : value); REPLACE();
case "cursor": setCursor(value);
case "fill": setFill(value);
- case "clip": CHECKSET_FLAG(CLIP); if (parent == null) DIRTY; else parent.DIRTY;
+ case "clip": CHECKSET_FLAG(CLIP); if (parent == null) dirty(); else parent.dirty();
case "rows": CHECKSET_SHORT(rows); if (rows==0){set(FIXED, COLS);if(cols==0)cols=1;} else set(FIXED, ROWS); REPACK();
case "cols": CHECKSET_SHORT(cols); if (cols==0){set(FIXED, ROWS);if(rows==0)rows=1;} else set(FIXED, COLS); REPACK();
case "rows": CHECKSET_SHORT(rows); if (rows==0){set(FIXED, COLS);if(cols==0)cols=1;} else set(FIXED, ROWS); REPACK();
case "cols": CHECKSET_SHORT(cols); if (cols==0){set(FIXED, ROWS);if(rows==0)rows=1;} else set(FIXED, COLS); REPACK();
@@
-576,13
+589,13
@@
public final class Box extends JSScope implements Task {
for(Box cur = (Box)value; cur != null || cur == redirect; cur = cur.parent)
if (cur == redirect) { redirect = (Box)value; return; }
JS.error("redirect can only be set to a descendant of its current value");
for(Box cur = (Box)value; cur != null || cur == redirect; cur = cur.parent)
if (cur == redirect) { redirect = (Box)value; return; }
JS.error("redirect can only be set to a descendant of its current value");
- case "fontsize": font = Font.getFont(font == null ? null : font.stream, toInt(value)); RECONSTRAIN(); DIRTY;
+ case "fontsize": font = Font.getFont(font == null ? null : font.stream, toInt(value)); RECONSTRAIN(); dirty();
case "font":
if(!(value instanceof Stream)) throw new JSExn("You can only put streams to the font property");
if (font == value) return; // FIXME: unclone()
font = value == null ? null : Font.getFont((Stream)value, font == null ? 10 : font.pointsize);
RECONSTRAIN();
case "font":
if(!(value instanceof Stream)) throw new JSExn("You can only put streams to the font property");
if (font == value) return; // FIXME: unclone()
font = value == null ? null : Font.getFont((Stream)value, font == null ? 10 : font.pointsize);
RECONSTRAIN();
- DIRTY;
+ dirty();
case "x": if (parent==null && Surface.fromBox(this)!=null) {
CHECKSET_INT(x);
} else {
case "x": if (parent==null && Surface.fromBox(this)!=null) {
CHECKSET_INT(x);
} else {
@@
-708,7
+721,7
@@
public final class Box extends JSScope implements Task {
} else {
throw new JSExn("fill must be null, a String, or a stream, not a " + value.getClass());
}
} else {
throw new JSExn("fill must be null, a String, or a stream, not a " + value.getClass());
}
- DIRTY;
+ dirty();
}
/**
}
/**
@@
-818,7
+831,7
@@
public final class Box extends JSScope implements Task {
void set(int mask) { flags |= mask; }
void set(int mask, boolean setclear) { if (setclear) set(mask); else clear(mask); }
void clear(int mask) { flags &= ~mask; }
void set(int mask) { flags |= mask; }
void set(int mask, boolean setclear) { if (setclear) set(mask); else clear(mask); }
void clear(int mask) { flags &= ~mask; }
- boolean test(int mask) { return ((flags & mask) == mask); }
+ public boolean test(int mask) { return ((flags & mask) == mask); }
// Tree Handling //////////////////////////////////////////////////////////////////////
// Tree Handling //////////////////////////////////////////////////////////////////////
@@
-844,7
+857,7
@@
public final class Box extends JSScope implements Task {
public void removeChild(int i) {
Box b = getChild(i);
b.RECONSTRAIN();
public void removeChild(int i) {
Box b = getChild(i);
b.RECONSTRAIN();
- b.DIRTY;
+ b.dirty();
b.clear(MOUSEINSIDE);
deleteNode(i);
b.parent = null;
b.clear(MOUSEINSIDE);
deleteNode(i);
b.parent = null;
@@
-904,7
+917,7
@@
public final class Box extends JSScope implements Task {
b.REPACK();
REPACK();
b.REPACK();
REPACK();
- b.DIRTY;
+ b.dirty();
putAndTriggerTrapsAndCatchExceptions("ChildChange", b);
}
}
putAndTriggerTrapsAndCatchExceptions("ChildChange", b);
}
}