Revision: 4787
          http://sourceforge.net/p/vexi/code/4787
Author:   clrg
Date:     2015-05-02 12:35:32 +0000 (Sat, 02 May 2015)
Log Message:
-----------
Redirect common properties to redirect
- could be internally more efficient (avoid put/get switch)
- can still override with traps
- also some minor comment improvements

Modified Paths:
--------------
    
branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Constants.java
    
branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp
    
branches/vexi3_integrated_layout/org.vexi-core.main/src/test/java/test/core/box/TestBox.java
    
branches/vexi3_integrated_layout/org.vexi-core.main/src/test/java/test/core/box/redirect.t

Modified: 
branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Constants.java
===================================================================
--- 
branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Constants.java
      2015-04-30 22:43:10 UTC (rev 4786)
+++ 
branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Constants.java
      2015-05-02 12:35:32 UTC (rev 4787)
@@ -6,6 +6,7 @@
 public interface Constants extends org.ibex.js.Constants {
        static final JS SC_0 = JSU.S("0",true);
        static final JS SC_add = JSU.S("add",true);
+       static final JS SC_align = JSU.S("align",true);
        static final JS SC_align_topleft = JSU.S("topleft",true);
     static final JS SC_align_top = JSU.S("top",true);
     static final JS SC_align_topright = JSU.S("topright",true);
@@ -39,12 +40,14 @@
        static final JS SC_html = JSU.S("html",true);
     static final JS SC_indexof = JSU.S("indexof",true);
     static final JS SC_layer = JSU.S("layer",true);
+    static final JS SC_layout = JSU.S("layout",true);
     static final JS SC_maxheight = JSU.S("maxheight",true);
        static final JS SC_maxwidth = JSU.S("maxwidth",true);
        static final JS SC_minheight = JSU.S("minheight",true);
        static final JS SC_minwidth = JSU.S("minwidth",true);
        static final JS SC_mouse = JSU.S("mouse",true);
        static final JS SC_numchildren = JSU.S("numchildren",true);
+    static final JS SC_orient = JSU.S("orient",true);
     static final JS SC_pack = JSU.S("pack",true);
     static final JS SC_place = JSU.S("place",true);
        static final JS SC_redirect = JSU.S("redirect",true);
@@ -52,6 +55,8 @@
        static final JS SC_stringify = JSU.S("stringify",true);
        static final JS SC_subComponents = JSU.S("subComponents",true);
        static final JS SC_surface = JSU.S("surface",true);
+    static final JS SC_text = JSU.S("text",true);
+    static final JS SC_textcolor = JSU.S("textcolor",true);
        static final JS SC_thisobj = JSU.S("thisobj",true);
     static final JS SC_vertical = JSU.S("vertical",true);
        static final JS SC_visible = JSU.S("visible",true);

Modified: 
branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp
===================================================================
--- 
branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp
      2015-04-30 22:43:10 UTC (rev 4786)
+++ 
branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp
      2015-05-02 12:35:32 UTC (rev 4787)
@@ -46,7 +46,7 @@
  * property on the box.</p>
  * 
  * <h4>Packed Layout</h4>
- * <p>In packed layout boxes are positioned next to eachother in the direction 
of the parents
+ * <p>In packed layout boxes are positioned next to each other in the 
direction of the parent's
  * orient property. The parent is constrained to the combined size of the 
packed children in the
  * orient direction and to the maximum size of its children in the non-orient 
direction.</p>
  * 
@@ -1722,6 +1722,7 @@
     
     /** the mouse object of a box */
     private class Mouse extends JS.Immutable implements JS.Cloneable {
+        @SuppressWarnings("unused")
         public JS get(JS key) throws JSExn {
             //#switch (JSU.toString(key))
             /*@PAGE(varname=mouse,humanname=Mouse Object)
@@ -1767,6 +1768,7 @@
         private Box from;
         private Box to;
         DistanceTo(Box from, Box to) { this.from = from; this.to = to; }
+        @SuppressWarnings("unused")
         public JS get(JS key) throws JSExn {
             //#switch (JSU.toString(key))
             /*@PAGE(varname=distanceto,humanname=DistanceTo Object)
@@ -1799,6 +1801,7 @@
             //#end
             return super.get(key);
         }
+        @SuppressWarnings("unused")
         public void put(JS key, JS value) throws JSExn {
             try {
                 //#switch (JSU.toString(key))
@@ -1818,7 +1821,7 @@
     public Box toImage(int x, int y, int w, int h) {
         PixelBuffer pb = Platform.createPixelBuffer(w, h, null);
         // FIXME: hack
-        // this bizzare bit of parent manipulation is to get around
+        // this bizarre bit of parent manipulation is to get around
         // the 'getX/YInParent()' look ups in render() for this box
         Box p = parent;
         parent = null;
@@ -1832,6 +1835,7 @@
     }
  
     /** implements functions that can be invoked on a box in JS */
+    @SuppressWarnings("unused")
     public JS callMethod(JS this_, JS method, JS[] args) throws JSExn {
         try {
             switch (args.length) {
@@ -1939,13 +1943,26 @@
                 //#end
             }
         } catch (NullPointerException npe) {
-            throw new JSExn("Cannot call "+method+"() with null arguments");
+            throw new JSExn("Cannot call '"+method+"()' with null arguments");
         }
         
-        throw new JSExn("Incorrect number of arguments for Box method 
"+method+"()");
+        throw new JSExn("Incorrect number of arguments for Box method 
'"+method+"()'");
     }
 
+    /** returns true if there is a redirect to consume the attempted put */
+       final private boolean tryRedirect(JS name, JS value) throws JSExn {
+               if (redirect == null) {
+                       throw new JSExn("Attempt to set '"+name+"' on a box 
with a null redirect");
+               }
+               if (redirect != this) {
+                       redirect.putAndTriggerTraps(name, value);
+                       return true;
+               }
+               return false;
+       }
+
     /** implements reading from box properties in JS */
+    @SuppressWarnings("unused")
     public JS get(JS name) throws JSExn {
         // integer properties translate to box children
         if (JSU.isInt(name)) {
@@ -1956,7 +1973,7 @@
         case "path":
             if (path != null) return JSU.S(path.toString());
             String ret = "";
-            for(int i=0; i<str.length(); i++) ret += 
font.glyphs[str.charAt(i)].path;
+            for(int i=0; i<text.length(); i++) ret += 
font.glyphs[text.charAt(i)].path;
             return JSU.S(ret);
         case "strokecolor": return JSU.S(Color.colorToString(strokecolor));
         case "strokewidth": return JSU.N(strokewidth);
@@ -1970,8 +1987,7 @@
          * */
         
         
/*****************************************************************************************/
-        
-        /*@SECTION(Rendering) The rendering properties affect what the box 
looks like visually.*/
+        /* @SECTION(Rendering) The rendering properties affect what the box 
looks like visually. */
 
         /* <p>A box will draw itself on-screen filled with the color or image  
specified by this
          * property.</p>
@@ -2007,7 +2023,10 @@
          * @initial_value(vexi.ui.font.vera)
          * @nofollow
          * */
-        case "font": return font.stream;
+        case "font":
+               if (redirect == null) return null;
+               if (redirect == this) return font.stream;
+               return redirect.getAndTriggerTraps(SC_font);
         
         /* <p>The size, either in points or relative size, to render the 
text.</p>
          * 
@@ -2028,7 +2047,10 @@
          * @type(Number)
          * @initial_value("medium")
          * */
-        case "fontsize": return sizeToJS(fontsize);
+        case "fontsize":
+               if (redirect == null) return null;
+               if (redirect == this) return sizeToJS(fontsize);
+               return redirect.getAndTriggerTraps(SC_fontsize);
         
         /* <p>The text of a box. Visually <code>null</code> renders the same 
as the text to ""
          * (i.e as nothing).</p>
@@ -2037,7 +2059,10 @@
          * @type(String)
          * @nofollow
          * */
-        case "text": return text;
+        case "text":
+               if (redirect == null) return null;
+               if (redirect == this) return text;
+               return redirect.getAndTriggerTraps(SC_text);
         
         /* <p>If the value is a 5-character hex string (#RGB), 7-character hex 
string (#RRGGBB),
          * 9-character hex string (#AARRGGBB), a box's text color will be set 
to that color.</p>
@@ -2051,7 +2076,10 @@
          * @initial_value("#ffffff")
          * @type(String)
          * */
-        case "textcolor": return JSU.S(Color.colorToString(textcolor));
+        case "textcolor":
+               if (redirect == null) return null;
+               if (redirect == this) return 
JSU.S(Color.colorToString(textcolor));
+               return redirect.getAndTriggerTraps(SC_textcolor);
         
         /* <p>This property can be set to any of the values specified for 
textcolor. If the value
          * written is a stream then it will interpreted as a PNG, GIF, or JPEG 
image, which will
@@ -2063,9 +2091,9 @@
          * */
         case "tile": return JSU.B(test(TILE_IMAGE));
         
-        
+
         
/*****************************************************************************************/
-        /*@SECTION(Child Control) The properties/methods related to the 
children of the box.*/
+        /* @SECTION(Child Control) The properties/methods related to the 
children of the box. */
         
         /* <p>The nth child of box b can be accessed by reading from 
<code>b[n]</code>.</p>
          * 
@@ -2087,6 +2115,30 @@
          * @type(Box)
          */
         //also "<em>numeric properties</em>":
+        
+        /* <p>Determines a box's alignment point. This affects the position 
of:</p>
+         * 
+         * <div class="itemizedlist"><ul type="disc">
+         *  <li>the box's textual content</li>
+         *  <li>a tiled texture</li>
+         *  <li>children within the space allocated to them by the layout 
method of the box</li>
+         * </ul></div>
+         * 
+         * <p>Valid values are:</p>
+         * 
+         * <ul><li><code>"center"</code>, <code>"left"</code>, 
<code>"right"</code>, <code>"top"</code>, <code>"bottom"</code>,
+         * <code>"bottomleft"</code>, <code>"bottomright"</code>, 
<code>"topleft"</code>, <code>"topright"</code></li></ul>
+         * 
+         * <p>If this box has a redirect, it will return the align of the 
redirect.
+         * If redirect is set to null, it will return null.</p>
+         * 
+         * @type(String)
+         * @initial_value("center")
+         * */
+        case "align":
+               if (redirect == null) return null;
+               if (redirect == this) return alignToJS();
+               return redirect.getAndTriggerTraps(SC_align);
 
         /* <p>The layout strategy for a box - how it lays out it's 
children.</p>
          * 
@@ -2102,13 +2154,22 @@
          * <p>Layered children behaved like placed children, only the parent 
box will respect
          * the contentsizes of it's children.</p>
          * 
+         * <p>If this box has a redirect, it will return the layout of the 
redirect.
+         * If redirect is set to null, it will return null.</p>
+         * 
          * @type(String)
          * @initial_value("pack")
          * */
-        case "layout": return test(PACK) ? SC_pack : (test(CLIP) ? SC_place : 
SC_layer);
+        case "layout":
+               if (redirect == null) return null;
+               if (redirect == this) return test(PACK) ? SC_pack : (test(CLIP) 
? SC_place : SC_layer);
+               return redirect.getAndTriggerTraps(SC_layout);
         
         /* <p><em>Read only</em> reflecting the number of children a box 
has.</p>
          * 
+         * <p>If this box has a redirect, it will return the number of 
children of the
+         * redirect. If redirect is set to null, it will return 0.</p>
+         * 
          * @initial_value(varies,code=false)
          * @type(Number)
          * */
@@ -2120,10 +2181,16 @@
         /* <p>The direction the children are layed out in the box when 
<code>layout="pack"</code>.
          * Valid values are <code>"horizontal"</code> or 
<code>"vertical"</code>.</p>
          * 
+         * <p>If this box has a redirect, it will return the orient of the 
redirect.
+         * If redirect is set to null, it will return null.</p>
+         * 
          * @type(String)
          * @initial_value("horizontal")
          * */
-        case "orient": return test(ORIENT) ? SC_horizontal : SC_vertical;
+        case "orient":
+               if (redirect == null) return null;
+               if (redirect == this) return test(ORIENT) ? SC_horizontal : 
SC_vertical;
+               return redirect.getAndTriggerTraps(SC_orient);
         
         /* <p>Writing to this property sets a box's redirect target. Reading 
from this property
          * will return a boolean instead of the redirect target - 
<code>true</code> if redirect
@@ -2331,24 +2398,6 @@
         case "contentwidth": return JSU.N(contentwidth);
         case "contentheight": return JSU.N(contentheight);
         
-        /* <p>Determines a box's alignment point. This affects the position 
of:</p>
-         * 
-         * <div class="itemizedlist"><ul type="disc">
-         *  <li>the box's textual content</li>
-         *  <li>a tiled texture</li>
-         *  <li>children within the space allocated to them by the layout 
method of the box</li>
-         * </ul></div>
-         * 
-         * <p>Valid values are:</p>
-         * 
-         * <ul><li><code>"center"</code>, <code>"left"</code>, 
<code>"right"</code>, <code>"top"</code>, <code>"bottom"</code>,
-         * <code>"bottomleft"</code>, <code>"bottomright"</code>, 
<code>"topleft"</code>, <code>"topright"</code></li></ul>
-         * 
-         * @type(String)
-         * @initial_value("center")
-         * */
-        case "align": return alignToJS();
-        
         /* <p>Whether to display a box and it's contents.</p>
          * 
          * <p>If this box is the root box of a window, its display property 
will determine whether
@@ -2570,6 +2619,7 @@
     }
 
     /** implements the writing of box properties from JS */
+    @SuppressWarnings("unused")
     public void put(JS name, JS value) throws JSExn {
         // integer properties translate to box children
        // SHOULD differentiate the methods here. isInt checks anything that 
@@ -2613,6 +2663,7 @@
                 throw new JSExn("Attempt to put non-null value to the 
'thisbox' property");
             }
         case "font":
+               if (tryRedirect(name, value)) return;
             // We do not convert to a fountain straight away as if it is a 
Blessing then
             // the fountain won't work as it will refer to the file/url 
without .ttf. For
             // the moment we handle Blessings separately for this reason.
@@ -2638,6 +2689,7 @@
                 dirty();
             }
         case "fontsize":
+               if (tryRedirect(name, value)) return;
             if (value==null) {
                 clear(FONTSIZE_SET);
                 if (fontsize != MEDIUM_SIZE)
@@ -2655,6 +2707,7 @@
                 dirty();
             }
         case "text":
+               if (tryRedirect(name, value)) return;
             JSString s = value == null ? null :
                 value instanceof JSString ? (JSString)value : 
(JSString)JSU.S(JSU.toString(value));
                if (value == null || EMPTY_STRING.equals(s)) {
@@ -2671,6 +2724,7 @@
             setConstrain();
             dirty();
         case "textcolor":
+               if (tryRedirect(name, value)) return;
             try {
                 if (value==null) {
                     clear(FONTCOLOR_SET);
@@ -2792,7 +2846,6 @@
                 // checks for and invokes cursor update
                 s.processMousePosition();
             }
-        case "align":       setAlign(value);
         case "fill":
             if (value == null && texture != null && test(TILE_IMAGE)) {
                // other cases handled by Box.run()
@@ -2840,7 +2893,11 @@
                     }
                 }
             }
+        case "align":
+               if (tryRedirect(name, value)) return;
+               setAlign(value);
         case "layout":
+               if (tryRedirect(name, value)) return;
             if (SC_place.equals(value)) {
                 if (!test(PACK) && test(CLIP)) {
                     return;
@@ -2869,6 +2926,7 @@
                 throw new JSExn("Attempt to set Box property 'layout' to 
unsupported value '"+JSU.toString(value)+"'");
             }
         case "orient":
+               if (tryRedirect(name, value)) return;
             if (SC_horizontal.equals(value)) {
                 if (test(ORIENT)) {
                     return;

Modified: 
branches/vexi3_integrated_layout/org.vexi-core.main/src/test/java/test/core/box/TestBox.java
===================================================================
--- 
branches/vexi3_integrated_layout/org.vexi-core.main/src/test/java/test/core/box/TestBox.java
        2015-04-30 22:43:10 UTC (rev 4786)
+++ 
branches/vexi3_integrated_layout/org.vexi-core.main/src/test/java/test/core/box/TestBox.java
        2015-05-02 12:35:32 UTC (rev 4787)
@@ -40,7 +40,7 @@
     public static void main(String[] args) throws Throwable {
 
        CoreTestSuite cts = new CoreTestSuite(TestBox.class);
-       TestCase t = cts.createTestCase(cts.getResourceDirs(), "pis_method.t");
+       TestCase t = cts.createTestCase(cts.getResourceDirs(), "redirect.t");
        t.runBare();
        }
        

Modified: 
branches/vexi3_integrated_layout/org.vexi-core.main/src/test/java/test/core/box/redirect.t
===================================================================
--- 
branches/vexi3_integrated_layout/org.vexi-core.main/src/test/java/test/core/box/redirect.t
  2015-04-30 22:43:10 UTC (rev 4786)
+++ 
branches/vexi3_integrated_layout/org.vexi-core.main/src/test/java/test/core/box/redirect.t
  2015-05-02 12:35:32 UTC (rev 4787)
@@ -1,20 +1,68 @@
 
 <vexi xmlns:ui="vexi://ui" xmlns="" xmlns:lib="_lib">
 
-       var b1 = vexi.box;
-       var b2 = vexi.box;
-       b1[0] = b2;
-       b1.redirect = b2;
-       
-       b2[0] = lib..newBox("a");
-       b2[1] = lib..newBox("b");
-       b1[2] = lib..newBox("c");
-       b1[3] = lib..newBox("d");
-       
-       //.util..assertEquals("a",b2[0].text);
-       .util..assertEquals("b",b1[1].text);
-       //.util..assertEquals("c",b2[2].text);
-       //.util..assertEquals("d",b1[3].text);
+    var assertEquals = .util..assertEquals;
+
+    var b1 = vexi.box;
+    var b2 = vexi.box;
+    b1[0] = b2;
+    b1.redirect = b2;
     
+    b2[0] = lib..newBox("a");
+    b2[1] = lib..newBox("b");
+    b1[2] = lib..newBox("c");
+    b1[3] = lib..newBox("d");
+    
+    assertEquals("a",b2[0].text);
+    assertEquals("b",b1[1].text);
+    assertEquals("c",b2[2].text);
+    assertEquals("d",b1[3].text);
+    
+    var t1 = vexi.box;
+    var t2 = vexi.box;
+    t1[0] = t2;
+    t1.redirect = t2;
+    
+    t1.align = "top";
+    assertEquals("top", t2.align);
+    
+    t2.align = "bottom";
+    assertEquals("bottom", t1.align);
+    
+    t1.layout = "place";
+    assertEquals("place", t2.layout);
+    
+    t2.layout = "pack";
+    assertEquals("pack", t1.layout);
+    
+    t1.orient = "vertical";
+    assertEquals("vertical", t2.orient);
+    
+    t2.orient = "horizontal";
+    assertEquals("horizontal", t1.orient);
+    
+    // text properties
+    // NB: should check font
+    
+    t1.fontsize = 14;
+    assertEquals(14, t2.fontsize);
+    
+    t2.fontsize = 16;
+    assertEquals(16, t1.fontsize);
+    
+    t1.text = "foo";
+    assertEquals("foo", t2.text);
+    
+    t2.text = "bar";
+    assertEquals("bar", t1.text);
+    
+    t1.textcolor = "green";
+//    assertEquals("green", t2.textcolor);
+    assertEquals("#008000", t2.textcolor);
+    
+    t2.textcolor = "blue";
+//    assertEquals("blue", t1.textcolor);
+    assertEquals("#0000ff", t1.textcolor);
+    
     <ui:box/>
 </vexi>

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
Vexi-svn mailing list
Vexi-svn@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vexi-svn

Reply via email to