You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(8) |
Aug
(88) |
Sep
(2) |
Oct
(4) |
Nov
(10) |
Dec
(37) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(3) |
Feb
(6) |
Mar
(9) |
Apr
(7) |
May
(1) |
Jun
(10) |
Jul
(6) |
Aug
(2) |
Sep
(1) |
Oct
|
Nov
(7) |
Dec
(3) |
2008 |
Jan
(3) |
Feb
|
Mar
(3) |
Apr
(5) |
May
(2) |
Jun
(1) |
Jul
(4) |
Aug
(23) |
Sep
(3) |
Oct
(6) |
Nov
(33) |
Dec
(49) |
2009 |
Jan
(9) |
Feb
(13) |
Mar
(33) |
Apr
(1) |
May
(7) |
Jun
(3) |
Jul
(11) |
Aug
(18) |
Sep
(16) |
Oct
|
Nov
|
Dec
|
2010 |
Jan
(10) |
Feb
(4) |
Mar
(8) |
Apr
|
May
(1) |
Jun
(4) |
Jul
(5) |
Aug
|
Sep
(2) |
Oct
|
Nov
|
Dec
(2) |
2011 |
Jan
(21) |
Feb
(1) |
Mar
(2) |
Apr
|
May
(3) |
Jun
|
Jul
(10) |
Aug
(5) |
Sep
(1) |
Oct
|
Nov
(1) |
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(2) |
2013 |
Jan
|
Feb
|
Mar
(4) |
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
(8) |
Dec
(1) |
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
(5) |
May
(2) |
Jun
|
Jul
(2) |
Aug
|
Sep
(3) |
Oct
(1) |
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2018 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2019 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2020 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Charles G. <cha...@gm...> - 2020-01-30 10:28:07
|
Mulling over ways to get away from preprocessing in Box.jpp Masks: use BitSet instead of macros https://docs.oracle.com/javase/6/docs/api/java/util/BitSet.html Repeats: no solution yet other than copy/paste/refactor Switches: string switches are supported in Java 8+ - C |
From: Charles G. <ch...@qu...> - 2019-06-10 14:04:52
|
Pretty sure this functionality already exists in the codebase (can't comment initially on whether it works or not though). Admittedly it could all do with cleaning up as it perhaps shouldn't be Box specific but Frame/Window specific. Perhaps Box.frame or Box.window should return a screen object or similar. That's a copy/pasta from the 3.0 branch. /* <p>The value true is put to this property on the root box when the surface is maximized, * and false when the surface is un-maximized. Reading from this value will return true if * the surface is maximized and false if it is not. Putting true to this property will * maximize the window, and putting false to this property will unmaximize the window. Note * that not all platforms support maximization.</p> * * @type(true) * */ // FIXME: the call to setMaximized() will trigger another call of this // code in the course of triggering write traps case "Maximized": if (parent == null && getSurface() != null) { getSurface().setMaximized(JSU.toBoolean(value)); } /* <p>The value true is put to this property on the root box when the surface is minimized, * and false when the surface is unminimized. Reading from this value will return true if * the surface is minimized and false if it is not. Putting true to this property will * minimize the window, and putting false will unminimize it.</p> * * @type(true) * */ // FIXME: the call to setMinimized() will trigger another call of this // code in the course of triggering write traps case "Minimized": if (parent == null && getSurface() != null) { getSurface().setMinimized(JSU.toBoolean(value)); } - Charles Goodwin QuickShift Software Ltd www.quick-shift.co.uk m: +44 777 301 3221 On Mon, Jun 10, 2019 at 2:23 PM <svn...@we...> wrote: > -------------------- SVN Commit Notification -------------------- > Repository: *vexi* > Revision: *5197* > Author: *remie* > Date: Mon Jun 10 15:23:18 CEST 2019 > > ----------------------------------------------------------------- > Log Message: > -----------------------------------------------------------------*Add vexi.ui.screen. maximise(box, optional bool), minimise(box, optional bool), isMaximised(box), isMinimised(box)* > > ----------------------------------------------------------------- > Changes: > ----------------------------------------------------------------- > U branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/core/Vexi.java > > ----------------------------------------------------------------- > Diff: (only first 500 lines shown) > ----------------------------------------------------------------- > Modified: branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/core/Vexi.java > =================================================================== > --- branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/core/Vexi.java 2019-06-10 09:52:47 UTC (rev 5196) > +++ branches/vexi3/org.vexi-core.main/src/main/java/org/vexi/core/Vexi.java 2019-06-10 13:23:18 UTC (rev 5197) > @@ -647,6 +647,38 @@ > * @type(Number) */ > case "ui.screen.height": return JSU.N(Platform.getScreenBounds().height); > > + /* > + * Set the maximised state of the screen of the surface of the provided box > + * to the bool provided, if omitted it maximises > + * @method > + * @param(box) > + * @param(Boolean) > + */ > + case "ui.screen.maximise": return METHOD; > + /* > + * Set the minimised state of the screen of the surface of the provided box > + * to the bool provided, if omitted it minimises > + * @method > + * @param(box) > + * @param(Boolean) > + */ > + case "ui.screen.minimise": return METHOD; > + > + /* > + * Returns whether the screen of the surface of the provided box is maximised > + * @method > + * @param(Box) > + * @return(Boolean) > + */ > + case "ui.screen.isMaximised": return METHOD; > + /* > + * Returns whether the screen of the surface of the provided box is minimised > + * @method > + * @param(Box) > + * @return(Boolean) > + */ > + case "ui.screen.isMinimised": return METHOD; > + > /* <p>Returns the original object that the clonee is a clone of</p> > * > * @method > @@ -776,7 +808,45 @@ > case "file.save": return accessFile(args,true); > case "file.temp": return Resources.createTempFile(args); > case "js.eval": return Methods.eval(args); > + case "ui.screen.maximise": { > + if (args[0] == null) { > + throw new JSExn("can't maximise a null frame"); > + } > + Box b = null; > + try { > + b = (Box)args[0]; > + } catch (ClassCastException cce) { > + throw new JSExn("can't maximise screen for non-box '"+args[0]+"'"); > + } > + Surface s = null; > + try { > + s = b.getSurface(); > + } catch (ClassCastException cce) { > + throw new JSExn("can't maximise screen for box not attached to a surface"); > + } > + s._setMaximized(args.length>1 ? JSU.toBoolean(args[1]) : true); > + return null; > } > + case "ui.screen.minimise": { > + if (args[0] == null) { > + throw new JSExn("can't minimise a null frame"); > + } > + Box b = null; > + try { > + b = (Box)args[0]; > + } catch (ClassCastException cce) { > + throw new JSExn("can't minimise screen for non-box '"+args[0]+"'"); > + } > + Surface s = null; > + try { > + s = b.getSurface(); > + } catch (ClassCastException cce) { > + throw new JSExn("can't minimise screen for box not attached to a surface"); > + } > + s.setMinimized(args.length>1 ? JSU.toBoolean(args[1]) : true); > + return null; > + } > + } > > switch (args.length) { > case 0: > @@ -826,7 +896,7 @@ > case "thread.sleep": Main.SCHEDULER.sleep(JSU.toInt(args[0])); return null; > case "ui.browser": Platform.newBrowserWindow(JSU.toString(args[0])); return null; > case "ui.font.install": Resources.installFont(args[0]); return null; > - case "ui.insets": > + case "ui.insets": { > if (args[0] == null) { > throw new JSExn("can't discern insets for a null frame"); > } > @@ -848,9 +918,46 @@ > ret.put(JSU.S("bottom"), JSU.N(s.bottomInset)); > ret.put(JSU.S("right"), JSU.N(s.rightInset)); > return ret; > + } > case "ui.loadImage": > LoadableImage.load(args); > return null; > + case "ui.screen.isMaximised": { > + if (args[0] == null) { > + throw new JSExn("can't determine maximised screen state for a null frame"); > + } > + Box b = null; > + try { > + b = (Box)args[0]; > + } catch (ClassCastException cce) { > + throw new JSExn("can't determine maximised screen state for non-box '"+args[0]+"'"); > + } > + Surface s = null; > + try { > + s = b.getSurface(); > + } catch (ClassCastException cce) { > + throw new JSExn("can't determine maximised screen state for box not attached to a surface"); > + } > + return JSU.B(s.maximized); > + } > + case "ui.screen.isMinimised": { > + if (args[0] == null) { > + throw new JSExn("can't determine minimised screen state for a null frame"); > + } > + Box b = null; > + try { > + b = (Box)args[0]; > + } catch (ClassCastException cce) { > + throw new JSExn("can't determine minimised screen state for non-box '"+args[0]+"'"); > + } > + Surface s = null; > + try { > + s = b.getSurface(); > + } catch (ClassCastException cce) { > + throw new JSExn("can't determine minimised screen state for box not attached to a surface"); > + } > + return JSU.B(s.minimized); > + } > case "ui.colorAsHex": > return JSU.S(Color.colorToString(Color.stringToColor(JSU.toString(args[0])))); > case "unclone": return args[0].unclone(); > > |
From: Charles G. <cha...@gm...> - 2018-08-23 09:22:47
|
I have restored the website: http://vexi.sourceforge.net/ For reference, if it is not working, then this link needs visiting and the page refreshed: http://vexi.sourceforge.net/?action=purge It seems to be a bug related to Sourceforge and Wikimedia. - C |
From: Charles G. <ch...@we...> - 2016-08-16 09:55:22
|
On further inspection, I was badly wrong. JFreeSVG only generates SVG output from Java2D graphics instructions i.e. used to create SVG from Java code. Hence its tiny size. Batik is big but contains a lot of functionality that is of no interest to us. From a glance it would appear to be about 1mb or so in size for just the jars needed for this. Regards, Charles Goodwin Web Enable IT Ltd Mobile: +44 777 3013221 Phone: +44 845 3880685 Web: www.webenableit.com On 28 July 2016 at 18:02, Charles Goodwin <ch...@we...> wrote: > It's only 44k... and fast (much faster than Batik). > > http://www.jfree.org/jfreesvg/ > > Regards, > > Charles Goodwin > Web Enable IT Ltd > > Mobile: +44 777 3013221 > Phone: +44 845 3880685 > Web: www.webenableit.com > |
From: Charles G. <ch...@we...> - 2016-07-28 17:03:23
|
It's only 44k... and fast (much faster than Batik). http://www.jfree.org/jfreesvg/ Regards, Charles Goodwin Web Enable IT Ltd Mobile: +44 777 3013221 Phone: +44 845 3880685 Web: www.webenableit.com |
From: Charles G. <ch...@we...> - 2016-07-16 02:54:02
|
Just responding for agreement purposes. Also I don't like too much the ads sourceforge is adding to these emails. Regards, Charles Goodwin Web Enable IT Ltd Mobile: +44 777 3013221 Phone: +44 845 3880685 Web: www.webenableit.com On 16 July 2016 at 00:41, Mike Goodwin <mik...@ca...> wrote: > I'm having to make a change to the core in order to support international > keyboards (such as icelandic). > > Basically you cannot just use key pressed, because in order to type > certain characters you need to press combinations of keys. The system > keyboard driver only sends the key typed event when certain combinations > have been completed, but the key pressed event is sent immediately. > > However we still need key pressed for control keys (e.g. arrow keys, alt, > ctrl ... etc.) and possibly also for normal keys, even when typing. > > I am adding a KeyTyped event to vexi to directly handle the typed keys and > mirroring Java's key handling model. That means I need to modify the text > widgets. On KeyPress they will ignore single chars (which will come later > in a KeyTyped event) instead of handling as currently. > > I don't think adding the extra event can be avoided without compromising > Vexi's functionality/key handling ability. Plus I think it is just going to > be saner to mimic the (ugly but workable) java model rather than trying to > come up with our own (e.g. merging KeyPressed and KeyTyped). > > - mike > > > > > > > > > ------------------------------------------------------------------------------ > What NetFlow Analyzer can do for you? Monitors network bandwidth and > traffic > patterns at an interface-level. Reveals which users, apps, and protocols > are > consuming the most bandwidth. Provides multi-vendor support for NetFlow, > J-Flow, sFlow and other flows. Make informed decisions using capacity > planning > reports.http://sdm.link/zohodev2dev > _______________________________________________ > Vexi-core mailing list > Vex...@li... > https://lists.sourceforge.net/lists/listinfo/vexi-core > > |
From: Mike G. <mik...@ca...> - 2016-07-15 23:41:17
|
I'm having to make a change to the core in order to support international keyboards (such as icelandic). Basically you cannot just use key pressed, because in order to type certain characters you need to press combinations of keys. The system keyboard driver only sends the key typed event when certain combinations have been completed, but the key pressed event is sent immediately. However we still need key pressed for control keys (e.g. arrow keys, alt, ctrl ... etc.) and possibly also for normal keys, even when typing. I am adding a KeyTyped event to vexi to directly handle the typed keys and mirroring Java's key handling model. That means I need to modify the text widgets. On KeyPress they will ignore single chars (which will come later in a KeyTyped event) instead of handling as currently. I don't think adding the extra event can be avoided without compromising Vexi's functionality/key handling ability. Plus I think it is just going to be saner to mimic the (ugly but workable) java model rather than trying to come up with our own (e.g. merging KeyPressed and KeyTyped). - mike |
From: Mike G. <mik...@ca...> - 2016-07-15 23:27:58
|
Yeah, I think org.ibex.JSMath can be deleted. I think some consideration was given to keeping a 'standard javascript' compatible object, but I think thats completely pointless where we are now. I'll delete it. - mike On Mon, Jun 20, 2016 at 5:46 PM, Charles Goodwin <ch...@we...> wrote: > Don't get why we have 2 seemingly identical implementations. > > Both are JPPs: > -> org.ibex.js.JSMath > -> org.vexi.js.VexiJS (embeds pretty much JSMath) > > Shouldn't VexiJS just defer to JSMath? > > Regards, > > Charles Goodwin > Web Enable IT Ltd > > Mobile: +44 777 3013221 > Phone: +44 845 3880685 > Web: www.webenableit.com > > > ------------------------------------------------------------------------------ > What NetFlow Analyzer can do for you? Monitors network bandwidth and > traffic > patterns at an interface-level. Reveals which users, apps, and protocols > are > consuming the most bandwidth. Provides multi-vendor support for NetFlow, > J-Flow, sFlow and other flows. Make informed decisions using capacity > planning > reports. http://sdm.link/zohomanageengine > _______________________________________________ > Vexi-core mailing list > Vex...@li... > https://lists.sourceforge.net/lists/listinfo/vexi-core > > |
From: Charles G. <ch...@we...> - 2016-06-20 16:46:53
|
Don't get why we have 2 seemingly identical implementations. Both are JPPs: -> org.ibex.js.JSMath -> org.vexi.js.VexiJS (embeds pretty much JSMath) Shouldn't VexiJS just defer to JSMath? Regards, Charles Goodwin Web Enable IT Ltd Mobile: +44 777 3013221 [tel:%2B44%20777%203013221] Phone: +44 845 3880685 [tel:%2B44%20845%203880685] Web: www.webenableit.com [http://www.webenableit.com/] |
From: Charlie <cha...@gm...> - 2016-05-28 18:51:02
|
So the MediaWiki installation has been fubar'd again by Sourceforge. I think it is time to abandon MediaWiki. We are not a giant multi-user site. It's features are not complimentary to our needs, and one of those needs has to be resisting the changes that Sourceforge make to their platform every few years. A simple static website generator surely is what we want, right? JBake: www.jbake.org OpooPress: www.opoopress.com/en/ Thoughts? - Charlie <http://www.webenableit.com> |
From: Jeff B. <bu...@af...> - 2015-10-14 18:02:16
|
A few things I have stumbled on while researching for a prototype I am working on. 1) Websockets and HTTP/2. http://www.javaworld.com/article/2916548/java-web-development/http-2-for-java-developers.html -Basically HTTP/2 will support a Kermit-like sliding window protocol, optimized & compressed binary communication, using frames for concurrent transfers and greatly reduced latency. A single connection with multiple asynchronous/bi-directional concurrent requests, replacing pipelining we added to the core a few years ago. This is something we might want to support in the core again reduce server latency. 2) It looks like Oracle may make a (new) push to get it's VM on mobile platforms (but no mention of dropping existing lawsuits): http://www.javaworld.com/article/2990440/mobile-java/oracle-considers-a-new-effort-to-develop-mobile-java-apps.html 3) iOS Java! Basically forms of cross-compiling to get around Apple's silly 'block the JVM': http://www.infoworld.com/article/2835160/java/robovm-enables-java-to-ios.html I still need to switch to the common launcher or merge in the Chrome changes before the current Firefox Java support dies. -Jeff |
From: Mike G. <mik...@ca...> - 2015-09-04 18:59:40
|
Not really exactly. The launcher now does have a main method, so it can be run using webstart. Actually we don't use the vanilla vexi launcher, but inherit from it to customise it (splash screens , digital signatures from relevant business... etc.). These specialisations are simple projects, however the latest vanilla launcher can be used directly. The thing to do is to place (we generate the jnlp in a servlet) at a known location, along with other resources e.g. A single servlet can be made to return the following resources http://ourdomain.com/path/to/application/launcher.jnlp - returns the jnlp below http://ourdomain.com/path/to/application/icon32.png - icon shown on desktop http://ourdomain.com/path/to/application/vexilauncher-rXXXX-signed.jar - launcher jar, http://ourdomain.com/path/to/application/launcher/args - launcher args - The launcher jar is signed with jar sign, and the revision is in the path to help webstart know when it needs to download a new file. - The launcher/args end of the path part is hardcoded in the launcher and added to the required application_url. Here we expect to find a list of vexi arguments. This is exactly the same information passed in by the applet parameters (i.e. which core, vexi files to run and other vexi parameters). - Specifying icon only useful if <desktop/> specified. Otherwise you get a standard java icon. <jnlp spec="1.0+" codebase="http://ourdomain.com/path/to/application/" href="launcher.jnlp"> <information> <title>Our Application - appears in desktop link</title> <vendor>Statii Ltd.</vendor> <icon kind="shortcut" href="icon32.png"/> <shortcut online="false" install="true"> <desktop/> </shortcut> <offline-allowed/> </information> <resources> <j2se version="1.7+" href="http://java.sun.com/products/autodl/j2se"/> <jar href="vexilauncher-rXXXX-signed.jar" main="true" /> </resources> <application-desc name="Statii" main-class="org.vexi.launcher.LauncherMain"> <argument>application_url=http://ourdomain.com/path/to/application/</argument> </application-desc> <security><all-permissions /></security> <update check="background"/> </jnlp> regards, Mike On Fri, Sep 4, 2015 at 5:58 PM, Charles Goodwin <ch...@we...> wrote: > Mike has enabled Webstart in the Vexi launcher. It should be on the public > SVN. > > Regards, > > Charles Goodwin > Web Enable IT Ltd > > Mobile: +44 777 3013221 > Phone: +44 845 3880685 > Web: www.webenableit.com > > On 4 September 2015 at 17:37, Jeff Buhrt <bu...@af...> wrote: > >> Now that we have passed 9/1/2015 and the Oracle/Google Java copyright >> battle continues, are there any ways/plans to support launching Vexi >> from Chrome? >> >> Oracle says don't use Chrome: >> >> https://blogs.oracle.com/java-platform-group/entry/launching_web_start_applications >> >> Thanks, >> >> -Jeff >> >> >> ------------------------------------------------------------------------------ >> _______________________________________________ >> Vexi-core mailing list >> Vex...@li... >> https://lists.sourceforge.net/lists/listinfo/vexi-core >> > > > > ------------------------------------------------------------------------------ > > _______________________________________________ > Vexi-core mailing list > Vex...@li... > https://lists.sourceforge.net/lists/listinfo/vexi-core > > |
From: Charles G. <ch...@we...> - 2015-09-04 16:58:56
|
Mike has enabled Webstart in the Vexi launcher. It should be on the public SVN. Regards, Charles Goodwin Web Enable IT Ltd Mobile: +44 777 3013221 Phone: +44 845 3880685 Web: www.webenableit.com On 4 September 2015 at 17:37, Jeff Buhrt <bu...@af...> wrote: > Now that we have passed 9/1/2015 and the Oracle/Google Java copyright > battle continues, are there any ways/plans to support launching Vexi > from Chrome? > > Oracle says don't use Chrome: > > https://blogs.oracle.com/java-platform-group/entry/launching_web_start_applications > > Thanks, > > -Jeff > > > ------------------------------------------------------------------------------ > _______________________________________________ > Vexi-core mailing list > Vex...@li... > https://lists.sourceforge.net/lists/listinfo/vexi-core > |
From: Jeff B. <bu...@af...> - 2015-09-04 16:50:46
|
Now that we have passed 9/1/2015 and the Oracle/Google Java copyright battle continues, are there any ways/plans to support launching Vexi from Chrome? Oracle says don't use Chrome: https://blogs.oracle.com/java-platform-group/entry/launching_web_start_applications Thanks, -Jeff |
From: Charles G. <ch...@we...> - 2015-07-27 11:03:36
|
On 27 July 2015 at 12:01, Charles Goodwin <ch...@we...> wrote: > It seems that after 10 days Sourceforge has FINALLY restored SVN access. > Here's their official statement on it: http://sourceforge.net/blog/subversion-repository-gap-notifications-by-email/ - C |
From: Charles G. <ch...@we...> - 2015-07-27 11:02:20
|
It seems that after 10 days Sourceforge has FINALLY restored SVN access. As far as I can tell, we are not missing any commits. At this point, we may consider moving to a different SVN host. - C |
From: Charles G. <ch...@we...> - 2015-05-04 20:38:55
|
Well that's the next incoming feature - albeit not part of margin but in addition to. Although the border-collapse logic would have to be in the grid implementation (which will remain JS) but since all boxes will support borders "out of the box" ('scuse the pun) it should be relatively simple. Regards, Charles Goodwin Web Enable IT Ltd Mobile: +44 777 3013221 Phone: +44 845 3880685 Web: www.webenableit.com On 4 May 2015 at 20:55, Mike Goodwin <mik...@ca...> wrote: > Will this fix another issue? How to implement 'border collapse' in grids. > i.e. is there a way to make a border part of the margin. > > On Mon, May 4, 2015 at 5:16 PM, <cl...@us...> wrote: > >> Revision: 4789 >> http://sourceforge.net/p/vexi/code/4789 >> Author: clrg >> Date: 2015-05-04 16:16:14 +0000 (Mon, 04 May 2015) >> Log Message: >> ----------- >> Core margin+padding implementation >> >> Modified Paths: >> -------------- >> >> branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp >> >> Added Paths: >> ----------- >> >> branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java >> >> branches/vexi3_integrated_layout/org.vexi-vexi.widgets/src_poke/poke/layout/core.t >> >> Added: >> branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java >> =================================================================== >> --- >> branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java >> (rev 0) >> +++ >> branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java >> 2015-05-04 16:16:14 UTC (rev 4789) >> @@ -0,0 +1,110 @@ >> +// Copyright (c) 2015 the Contributors, as shown in the revision logs. >> +// Licensed under the GNU General Public License version 2 ("the >> License"). >> +// You may not use this file except in compliance with the License. >> + >> +package org.vexi.core; >> + >> +import org.ibex.js.JS; >> +import org.ibex.js.JSExn; >> +import org.ibex.js.JSU; >> +import org.ibex.js.Constants; >> + >> +/** >> + * <p>Encapsulates margin/padding state and JS interaction</p> >> + * >> + * <p>TODO: support different metrics i.e. %/pt/em</p> >> + */ >> +class Insets { >> + // default empty/0 insets >> + final protected static Insets ZERO = new Insets(); >> + >> + final int top, right, bottom, left; >> + >> + Insets() { >> + top = 0; right = 0; bottom = 0; left = 0; >> + } >> + Insets(int i) { >> + top = i; right = i; bottom = i; left = i; >> + } >> + Insets(int t, int r, int b, int l) { >> + top = t; right = r; bottom = b; left = l; >> + } >> + >> + final JS toJS() { >> + if (this==ZERO) return Constants.NC_0; >> + if ((top==right)&&(top==bottom)&&(top==left)) >> + return JSU.N(top); >> + if (top==bottom && left==right) >> + return JSU.S(top+" "+left); >> + return JSU.S(top+" "+right+" "+bottom+" "+left); >> + } >> + final JS topToJS() { return JSU.N(top); } >> + final JS leftToJS() { return JSU.N(left); } >> + final JS rightToJS() { return JSU.N(right); } >> + final JS bottomToJS() { return JSU.N(bottom); } >> + >> + /** creates an Insets instance by parsing the given JS */ >> + final static Insets fromJS(JS inset) throws JSExn { >> + try { >> + if (inset == null) >> + return ZERO; >> + >> + if (JSU.isString(inset)) { >> + String[] put = inset.toString().split(" >> "); >> + if (put.length==1) { >> + int i = Integer.parseInt(put[0]); >> + return new Insets(i); >> + } else if (put.length==2) { >> + int v = Integer.parseInt(put[0]); >> + int h = Integer.parseInt(put[1]); >> + return new Insets(v, h, v, h); >> + } else if (put.length==4) { >> + int t = Integer.parseInt(put[0]); >> + int r = Integer.parseInt(put[1]); >> + int b = Integer.parseInt(put[2]); >> + int l = Integer.parseInt(put[3]); >> + return new Insets(t, r, b, l); >> + } else { >> + throw new Exception(); >> + } >> + } >> + >> + // Integer >> + int i = JSU.toInt(inset); >> + if (i == 0) return ZERO; >> + return new Insets(i); >> + >> + } catch(Exception e) { >> + throw new JSExn("Invalid insets value >> '"+inset+"'"); >> + } >> + } >> + >> + final private int insetFromJS(JS inset) throws JSExn { >> + try { >> + return (inset == null) ? 0 >> + : (JSU.isInt(inset) ? >> JSU.toInt(inset) : Integer.parseInt(JSU.toString(inset))); >> + } catch(Exception e) { >> + throw new JSExn("Invalid inset value >> '"+inset+"'"); >> + } >> + } >> + >> + /** creates an Insets instance by parsing the given JS for the >> top inset */ >> + final Insets fromTopJS(JS top) throws JSExn { >> + return new Insets(insetFromJS(top), right, bottom, left); >> + } >> + >> + /** creates an Insets instance by parsing the given JS for the >> left inset */ >> + final Insets fromLeftJS(JS left) throws JSExn { >> + return new Insets(top, right, bottom, insetFromJS(left)); >> + } >> + >> + /** creates an Insets instance by parsing the given JS for the >> right inset */ >> + final Insets fromRightJS(JS right) throws JSExn { >> + return new Insets(top, insetFromJS(right), bottom, left); >> + } >> + >> + /** creates an Insets instance by parsing the given JS for the >> bottom inset */ >> + final Insets fromBottomJS(JS bottom) throws JSExn { >> + return new Insets(top, right, insetFromJS(bottom), left); >> + } >> +} >> >> >> Property changes on: >> branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java >> ___________________________________________________________________ >> Added: svn:mime-type >> ## -0,0 +1 ## >> +text/plain >> \ No newline at end of property >> 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-05-02 16:30:06 UTC (rev 4788) >> +++ >> branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp >> 2015-05-04 16:16:14 UTC (rev 4789) >> @@ -78,8 +78,8 @@ >> * <p>Herein considering the horizontal dimension, the contentwidth of a >> box is the maximum of:</p> >> * <ol> >> * <li>The value of the box's minwidth property</li> >> - * <li>The rendered width of the box's textual content</li> >> - * <li>The constrained width of the box's children</li> >> + * <li>The rendered width of the box's textual content plus any >> padding</li> >> + * <li>The constrained width of the box's children any padding</li> >> * </ol> >> * >> * <p>The constrained width of a box's children depends on the layout >> policy of the box:</p> >> @@ -174,7 +174,7 @@ >> // postPutTriggerTrapsAndCatchExceptions(_t_, NAME, _e_);\ >> // } else {\ >> // CODE;\ >> - // } >> + // }\ >> >> >> // Trivial Helper Methods (should be inlined) >> ///////////////////////////////////////// >> @@ -217,7 +217,7 @@ >> final private boolean test(int mask) { return ((flags & mask) == >> mask); } >> >> >> - // Required by Surface/Platform >> ///////////////////////////////////////// >> + // Required by Surface/Platform >> ///////////////////////////////////////// >> >> public final int getIntFillcolor() { return fillcolor; } >> public final Surface getSurface() { return >> Surface.fromBox(getRoot()); } >> @@ -269,8 +269,8 @@ >> >> private static final int PACK = 0x00001000; >> private static final int CLIP = 0x00002000; >> - private static final int HAS_WIDTH_SLACK = 0x00004000; >> - private static final int HAS_HEIGHT_SLACK = 0x00008000; >> +// private static final int HAS_WIDTH_SLACK = 0x00004000; >> +// private static final int HAS_HEIGHT_SLACK = 0x00008000; >> >> private static final int ALIGN_TOP = 0x00010000; >> private static final int ALIGN_BOTTOM = 0x00020000; >> @@ -423,7 +423,14 @@ >> private int contentwidth = 0; // == min(maxwidth, max(minwidth, >> textwidth, sum(child.contentwidth))) >> private int contentheight = 0; >> >> + private Insets margin = Insets.ZERO; >> + private Insets padding = Insets.ZERO; >> + >> + // this is a calculated total of the gaps between packed children >> + // TODO: put into a place() loop or another alternative mechanism >> + private int box_spacing = 0; >> >> + >> // Instance Methods >> ///////////////////////////////////////////////////////////////////// >> // FIX not right. Really we want the constructor to be showing, and >> it does by default >> // if it exists, but need to consider the case if a template is not >> present (or indeed >> @@ -486,8 +493,8 @@ >> dirty(); >> // Tiled images affect contentsize >> if (test(TILE_IMAGE)) { >> - setMinWidth(texture.getWidth(), true); >> - setMinHeight(texture.getHeight(), true); >> + setMinWidth(texture.getWidth(), true); >> + setMinHeight(texture.getHeight(), true); >> setConstrain(); >> } >> } else if (texture.getLoadFailed()!=null) { >> @@ -624,7 +631,17 @@ >> } >> } >> >> + private final int nominalWidth() { return min(maxwidth, >> max(contentwidth, minwidth)); } >> + private final int nominalHeight() { return min(maxheight, >> max(contentheight, minheight)); } >> + >> + private final int constrainToWidth(int testwidth, Box c) { >> + return max(testwidth, c.nominalWidth() + max(padding.left, >> c.margin.left) + max(padding.right, c.margin.right)); >> + } >> + private final int constrainToHeight(int testheight, Box c) { >> + return max(testheight, c.nominalHeight() + max(padding.top, >> c.margin.top) + max(padding.bottom, c.margin.bottom)); >> + } >> >> + >> // Reflow/rendering Pipeline ////////////////////////////////////// >> >> /** used to invoke reflow on a box and it's children */ >> @@ -633,8 +650,8 @@ >> return; >> } >> constrain(); >> - int w = test(HSHRINK) ? contentwidth : min(maxwidth, >> max(contentwidth, width)); >> - int h = test(VSHRINK) ? contentheight : min(maxheight, >> max(contentheight, height)); >> + int w = test(HSHRINK) ? nominalWidth() : min(maxwidth, >> max(contentwidth, width)); >> + int h = test(VSHRINK) ? nominalHeight() : min(maxheight, >> max(contentheight, height)); >> tryResize(w, h, true); >> place(test(PLACE_CLEAN)); >> } >> @@ -661,8 +678,8 @@ >> private void constrain() { >> int i; >> if (test(CONSTRAIN_DESCENDENT)) { >> - // clear first, because it is possible >> - // that reflow may lead to more reflow >> + // clear first, because it is possible >> + // that reflow may lead to more reflow >> clear(CONSTRAIN_DESCENDENT); >> // reconstrain any children >> for (Box c = getChild(i=0); c != null; c = getChild(++i)) { >> @@ -676,10 +693,10 @@ >> // REMARK: must happen after children's sizes known >> // otherwise any update is immediately invalidated >> if (trap_test(RESIZE_TRAP)) { >> - justTriggerTrapsAndCatchExceptions(SC_Resize, JSU.T); >> + justTriggerTrapsAndCatchExceptions(SC_Resize, JSU.T); >> } >> >> - // no reconstrain necessary >> + // no re-constrain necessary >> if (!test(CONSTRAIN)) { >> return; >> } >> @@ -687,22 +704,28 @@ >> // establish new content size >> int new_contentwidth = 0, new_contentheight = 0; >> if (test(PACK)) { >> - //#repeat width/height HORIZONTAL/VERTICAL >> + //#repeat width/height HORIZONTAL/VERTICAL Width/Height >> left/top right/bottom >> if (test(ORIENT) == HORIZONTAL) { >> // accumulate child contentwidth >> + int prior_margin = padding.left; >> + box_spacing = 0; >> for (Box c = getChild(i=0); c != null; c = >> getChild(++i)) { >> if (!c.test(DISPLAY)) { >> continue; >> } >> - new_contentwidth += c.contentwidth; >> + int spacing = max(prior_margin, c.margin.left); >> + box_spacing += spacing; >> + new_contentwidth += c.nominalWidth() + spacing; >> + prior_margin = c.margin.right; >> } >> + new_contentwidth += max(prior_margin, padding.right); >> } else { >> // maximum child contentwidth >> for (Box c = getChild(i=0); c != null; c = >> getChild(++i)) { >> if (!c.test(DISPLAY)) { >> continue; >> } >> - new_contentwidth = max(new_contentwidth, >> c.contentwidth); >> + new_contentwidth = >> constrainToWidth(new_contentwidth, c); >> } >> } >> //#end >> @@ -712,12 +735,15 @@ >> if (!c.test(DISPLAY)) { >> continue; >> } >> - new_contentwidth = max(new_contentwidth, c.contentwidth); >> - new_contentheight = max(new_contentheight, >> c.contentheight); >> + new_contentwidth = constrainToWidth(new_contentwidth, c); >> + new_contentheight = constrainToHeight(new_contentheight, >> c); >> } >> } >> >> //#repeat width/height WIDTH/HEIGHT >> + if (test(CLIP)) >> + new_contentwidth = max(new_contentwidth, textwidth) + >> padding.left + padding.right; >> +/* >> if (test(CLIP)) { >> if (new_contentwidth < maxwidth && new_contentwidth < >> minwidth) { >> set(HAS_WIDTH_SLACK); >> @@ -726,7 +752,7 @@ >> } >> } else { >> if (new_contentwidth < maxwidth && (new_contentwidth < >> minwidth || new_contentwidth < textwidth || >> - (texture!=null && new_contentwidth < >> texture.getWidth()))) { >> + (texture!=null && new_contentwidth < >> texture.getWidth()))) { >> set(HAS_WIDTH_SLACK); >> } else { >> clear(HAS_WIDTH_SLACK); >> @@ -735,6 +761,7 @@ >> } >> >> new_contentwidth = min(maxwidth, max(minwidth, >> new_contentwidth)); >> +*/ >> >> // assign contentwidth and mark for place in parent and placing >> of children >> if (new_contentwidth != contentwidth) { >> @@ -746,7 +773,7 @@ >> } else { >> // constrain contentwidth to frame width >> if (getSurface()!=null && !test(SHRINK)) { >> - new_contentwidth = min(getSurface().pendingWidth, >> new_contentwidth); >> + new_contentwidth = min(getSurface().pendingWidth, >> new_contentwidth); >> } >> if (new_contentwidth != contentwidth) { >> setPlaceInTree(); >> @@ -778,26 +805,45 @@ >> set(PLACE_CLEAN); >> } >> >> + //#repeat HSHRINK/VSHRINK Width/Height getTargetX/getTargetY x/y >> tx/ty width/height left/top right/bottom >> + private final int getTargetWidth(final int availableWidth) { >> + return test(HSHRINK) ? nominalWidth() >> + : max(contentwidth, min(maxwidth, availableWidth - x >> + - max(margin.left, parent.padding.left) - >> max(margin.right, parent.padding.right))); >> + } >> + private final int getTargetX(final int availableWidth, final int >> targetWidth, final boolean left, final boolean right) { >> + if (left) return margin.left; >> + if (right) return availableWidth - targetWidth - margin.right; >> + >> + int tx = (availableWidth - targetWidth) / 2; >> + // honour margins >> + if (tx < margin.left) return margin.left; >> + if (availableWidth - tx - targetWidth < margin.right) >> + return availableWidth - margin.bottom; >> + return tx; >> + } >> + //#end >> + >> private final void placeChildren(boolean clean) { >> if (test(PLACE)) { >> clear(PLACE); >> - // needed for later resize() >> - int child_width, child_height, i; >> >> - // place children individually in box space >> if (!test(PACK)) { >> + // place children individually in box space >> + int i; >> for (Box child = getChild(i=treeSize()-1); child != >> null; child = getChild(--i)) { >> if (!child.test(DISPLAY)) { >> continue; >> } >> - child_width = child.test(HSHRINK) ? >> child.contentwidth : max(child.contentwidth, min(child.maxwidth, width - >> child.x)); >> - child_height = child.test(VSHRINK) ? >> child.contentheight : max(child.contentheight, min(child.maxheight, height >> - child.y)); >> - child.tryResize(child_width, child_height, clean); >> + child.tryResize(child.getTargetWidth(width), >> + child.getTargetHeight(height), >> + clean); >> } >> >> - // pack children into available space >> } else { >> + // pack children into available space >> int child_x = 0, child_y = 0; >> + int child_width, child_height; >> boolean top = test(ALIGN_TOP); >> boolean left = test(ALIGN_LEFT); >> boolean right = test(ALIGN_RIGHT); >> @@ -805,18 +851,23 @@ >> >> if (test(ORIENT) == HORIZONTAL) { >> // horizontal stacking >> - if (!test(HAS_WIDTH_SLACK) && 0 >= >> width-contentwidth) { >> - // simple case - no slack, place children next >> to eachother >> + if (contentwidth >= width) { >> + // simple case - no slack, place children next >> to each other >> + int i = 0; >> + int prior_margin = padding.left; >> for (Box child = getChild(i=0); child != null; >> child = getChild(++i)) { >> if (!child.test(DISPLAY)) { >> continue; >> } >> // height, y >> - child_height = child.test(VSHRINK) ? >> child.contentheight : min(child.maxheight, height); >> - child_y = top ? 0 : (bottom ? >> height-child_height : (height-child_height)/2); >> + child_height = child.getTargetHeight(height); >> + child_y = getTargetY(height, child_height, >> top, bottom); >> // width, x >> - child.tryMoveAndResize(child_x, child_y, >> child.contentwidth, child_height, clean); >> - child_x += child.contentwidth; >> + child_width = child.nominalWidth(); >> + child_x += max(prior_margin, >> child.margin.left); >> + child.tryMoveAndResize(child_x, child_y, >> child_width, child_height, clean); >> + child_x += child_width; >> + prior_margin = child.margin.right; >> } >> >> } else { >> @@ -824,76 +875,76 @@ >> // our layout lies somewhere between the min and >> max size, >> // loop over the children attempting to set >> their width to >> // targetsize and adjust until it meets the >> parent width >> - float targetsize = >> (float)width/(float)treeSize(); >> + int packingspace = width - box_spacing; >> + float targetsize = (float)(packingspace) / >> (float)treeSize(); >> float totalsize = 0; >> - int numactive = 0; >> for (int j=0; j<100; j++) { >> + totalsize = 0; >> int min_minsize = MAX_DIMENSION; >> int max_maxsize = 0; >> - int numflexible = 0; >> + int num_active = 0; >> int num_minsize = 0; >> int num_maxsize = 0; >> + int num_nolimit = 0; >> int num_passive = 0; >> + int i = 0; >> for (Box child = getChild(i=0); child != >> null; child = getChild(++i)) { >> if (!child.test(DISPLAY)) { >> continue; >> } >> - numactive++; >> - if (child.test(HSHRINK) || >> child.maxwidth==child.contentwidth) { >> + final int child_nomwidth = >> child.nominalWidth(); >> + num_active++; >> + if (child.test(HSHRINK) || >> child.maxwidth==child_nomwidth) { >> num_passive++; >> - totalsize += child.contentwidth; >> - } else if >> (child.contentwidth>targetsize) { >> - min_minsize = min(min_minsize, >> child.contentwidth); >> + totalsize += child_nomwidth; >> + } else if (child_nomwidth>targetsize) { >> + min_minsize = min(min_minsize, >> child_nomwidth); >> num_minsize++; >> - totalsize += >> (float)child.contentwidth; >> + totalsize += (float)child_nomwidth; >> } else if (child.maxwidth<targetsize) { >> max_maxsize = max(max_maxsize, >> child.maxwidth); >> num_maxsize++; >> totalsize += (float)child.maxwidth; >> } else { >> - numflexible++; >> + num_nolimit++; >> totalsize += targetsize; >> } >> } >> >> - if (numactive==0) { >> + if (num_active==0) { >> // no active children - nothing to do >> return; >> } >> >> // test to see if targetsize produces a >> solution that rounds >> - // to match the width, adjusting >> appropriatly if it does not >> + // to match the width, adjusting >> appropriately if it does not >> int totalsize_int = (int)(totalsize+0.5); >> - if (totalsize_int > width) { >> - if (numflexible>0) { >> - targetsize -= >> (totalsize-(float)width)/(float)numflexible; >> + if (totalsize_int > packingspace) { >> + if (num_nolimit>0) { >> + targetsize -= >> (totalsize-(float)packingspace)/(float)num_nolimit; >> } else { >> - if >> (num_minsize+num_passive==numactive) { >> - // no solution required - >> avaiable min-sizes over-consume width >> + if >> (num_minsize+num_passive==num_active) { >> + // no solution required - >> available min-sizes over-consume width >> targetsize = width; >> break; >> } >> - targetsize = (float)max_maxsize - >> (totalsize-(float)width)/(float)num_maxsize; >> + targetsize = (float)max_maxsize - >> (totalsize-(float)packingspace)/(float)num_maxsize; >> } >> - } else if (totalsize_int < width) { >> - if (numflexible>0) { >> - targetsize += >> ((float)width-totalsize)/(float)numflexible; >> + } else if (totalsize_int < packingspace) { >> + if (num_nolimit>0) { >> + targetsize += >> ((float)packingspace-totalsize)/(float)num_nolimit; >> } else { >> - if >> (num_maxsize+num_passive==numactive) { >> - // no solution required - >> avaiable max-sizes do not consume width >> + if >> (num_maxsize+num_passive==num_active) { >> + // no solution required - >> available max-sizes do not consume width >> targetsize = width; >> break; >> } >> - targetsize = (float)min_minsize + >> ((float)width-totalsize)/(float)num_minsize; >> + targetsize = (float)min_minsize + >> ((float)packingspace-totalsize)/(float)num_minsize; >> } >> } else { >> break; >> } >> >> - // reset outer variables and try again >> - numactive = 0; >> - totalsize = 0; >> - >> // REMARK: this is error / infinite loop >> prevention >> // giving a helpful report if no solution is >> found >> if (j>=99) { >> @@ -903,29 +954,34 @@ >> if (!child.test(DISPLAY)) { >> continue; >> } >> - Log.system.error(this, "Child "+i+": >> "+child.contentwidth+", "+child.maxwidth+", "+child.test(HSHRINK)); >> + Log.system.error(this, "Child "+i+": >> "+child.nominalWidth()+", "+child.maxwidth+", "+child.test(HSHRINK)); >> } >> } >> } >> >> // if there is 'slack' (child boxes do not >> consume parent width) then >> // align determines whether we pack boxes to >> left, centre, or right >> - int offset_x = (int)(totalsize+0.5)>=width || >> left ? 0 : (int)(((float)width-totalsize)/(float)(right?1:2)); >> + int offset_x = left ? 0 : >> (int)(((float)width-totalsize)/(float)(right?1:2)); >> >> // we use total (a float) to keep tabs on final >> layout totals >> // so we do not get stray pixel sized gaps >> caused by rounding >> totalsize = 0; >> - for (Box child = getChild(i=0); child != null; >> child = getChild(++i)) { >> + int prior_margin = padding.left; >> + int i = 0; >> + for (Box child = getChild(i); child != null; >> child = getChild(++i)) { >> if (!child.test(DISPLAY)) { >> continue; >> } >> // height, y >> - child_height = child.test(VSHRINK) ? >> child.contentheight : min(child.maxheight, height); >> - child_y = top ? 0 : (bottom ? >> height-child_height : (height-child_height)/2); >> + child_height = child.getTargetHeight(height); >> + child_y = child.getTargetY(height, >> child_height, top, bottom); >> + >> // width, x >> + totalsize += (float)max(prior_margin, >> child.margin.left); >> child_x = offset_x + (int)(totalsize+0.5); >> - if (child.test(HSHRINK) || >> child.contentwidth > targetsize) { >> - child_width = child.contentwidth; >> + final int child_nomwidth = >> child.nominalWidth(); >> + if (child.test(HSHRINK) || child_nomwidth > >> targetsize) { >> + child_width = child_nomwidth; >> totalsize += (float)child_width; >> } else if (targetsize > child.maxwidth) { >> child_width = child.maxwidth; >> @@ -936,23 +992,29 @@ >> totalsize += targetsize; >> } >> child.tryMoveAndResize(child_x, child_y, >> child_width, child_height, clean); >> + prior_margin = child.margin.right; >> } >> } >> >> } else { >> // vertical stacking - mirrors horizontal stacking >> code [see for comments] >> - if (!test(HAS_HEIGHT_SLACK) && 0 >= height - >> contentheight) { >> + if (contentheight >= height) { >> // simple case - no slack >> + int i = 0; >> + int prior_margin = padding.top; >> for (Box child = getChild(i=0); child != null; >> child = getChild(++i)) { >> if (!child.test(DISPLAY)) { >> continue; >> } >> // width, x >> - child_width = child.test(HSHRINK) ? >> child.contentwidth : min(child.maxwidth, width); >> - child_x = left ? 0 : (right ? >> width-child_width : (width-child_width)/2); >> + child_width = child.getTargetWidth(width); >> + child_x = child.getTargetX(width, >> child_width, left, right); >> // height, y >> - child.tryMoveAndResize(child_x, child_y, >> child_width, child.contentheight, clean); >> - child_y += child.contentheight; >> + child_height = child.nominalHeight(); >> + child_y += max(prior_margin, >> child.margin.top); >> + child.tryMoveAndResize(child_x, child_y, >> child_width, child_height, clean); >> + child_y += child_height; >> + prior_margin = child.margin.bottom; >> } >> >> } else { >> @@ -960,108 +1022,113 @@ >> // our layout lies somewhere between the min and >> max size, >> // loop over the children attempting to set >> their width to >> // targetsize and adjust until it meets the >> parent width >> - float targetsize = >> (float)height/(float)treeSize(); >> + int packingspace = height - box_spacing; >> + float targetsize = (float)packingspace / >> (float)treeSize(); >> float totalsize = 0; >> - int numactive = 0; >> for (int j=0; j<100; j++) { >> + totalsize = 0; >> int min_minsize = MAX_DIMENSION; >> int max_maxsize = 0; >> - int numflexible = 0; >> + int num_active = 0; >> int num_minsize = 0; >> int num_maxsize = 0; >> + int num_nolimit = 0; >> int num_passive = 0; >> + int i = 0; >> for (Box child = getChild(i=0); child != >> null; child = getChild(++i)) { >> if (!child.test(DISPLAY)) { >> continue; >> } >> - numactive++; >> - if (child.test(VSHRINK) || >> child.maxheight==child.contentheight) { >> + num_active++; >> + final int child_nomheight = >> child.nominalHeight(); >> + if (child.test(VSHRINK) || >> child.maxheight==child_nomheight) { >> num_passive++; >> - totalsize += child.contentheight; >> - } else if >> (child.contentheight>targetsize) { >> - min_minsize = min(min_minsize, >> child.contentheight); >> + totalsize += child_nomheight; >> + } else if (child_nomheight>targetsize) { >> + min_minsize = min(min_minsize, >> child_nomheight); >> num_minsize++; >> - totalsize += >> (float)child.contentheight; >> + totalsize += (float)child_nomheight; >> } else if (child.maxheight<targetsize) { >> max_maxsize = max(max_maxsize, >> child.maxheight); >> num_maxsize++; >> totalsize += (float)child.maxheight; >> } else { >> - numflexible++; >> + num_nolimit++; >> totalsize += targetsize; >> } >> } >> >> - if (numactive==0) { >> + if (num_active==0) { >> // no active children - nothing to do >> return; >> } >> >> // test to see if targetsize produces a >> solution that rounds >> - // to match the height, adjusting >> appropriatly if it does not >> + // to match the height, adjusting >> appropriately if it does not >> int totalsize_int = (int)(totalsize+0.5); >> - if (totalsize_int > height) { >> - if (numflexible>0) { >> - targetsize -= >> (totalsize-(float)height)/(float)numflexible; >> + if (totalsize_int > packingspace) { >> + if (num_nolimit>0) { >> + targetsize -= >> (totalsize-(float)packingspace)/(float)num_nolimit; >> } else { >> - if >> (num_minsize+num_passive==numactive) { >> - // no solution required - >> avaiable min-sizes over-consume height >> + if >> (num_minsize+num_passive==num_active) { >> + // no solution required - >> available min-sizes over-consume height >> targetsize = height; >> break; >> } >> - targetsize = (float)max_maxsize - >> (totalsize-(float)height)/(float)num_maxsize; >> + targetsize = (float)max_maxsize - >> (totalsize-(float)packingspace)/(float)num_maxsize; >> } >> - } else if (totalsize_int < height) { >> - if (numflexible>0) { >> - targetsize += >> ((float)height-totalsize)/(float)numflexible; >> + } else if (totalsize_int < packingspace) { >> + if (num_nolimit>0) { >> + targetsize += >> ((float)packingspace-totalsize)/(float)num_nolimit; >> } else { >> - if >> (num_maxsize+num_passive==numactive) { >> - // no solution required - >> avaiable max-sizes do not consume height >> + if >> (num_maxsize+num_passive==num_active) { >> + // no solution required - >> available max-sizes do not consume height >> targetsize = height; >> break; >> } >> - targetsize = (float)min_minsize + >> ((float)height-totalsize)/(float)num_minsize; >> + targetsize = (float)min_minsize + >> ((float)packingspace-totalsize)/(float)num_minsize; >> } >> } else { >> break; >> } >> >> - // reset outer variables and try again >> - numactive = 0; >> - totalsize = 0; >> - >> // REMARK: this is error / infinite loop >> prevention >> // giving a helpful report if no solution is >> found >> if (j>=99) { >> - Log.system.error(this, "Core layout >> failure, please report:"); >> - Log.system.error(this, "Parent height: >> "+height); >> + Log.system.error(this, "Core layout >> failure, please report:"); >> + Log.system.error(this, "Parent height: >> "+height); >> for (Box child = getChild(i=0); child != >> null; child = getChild(++i)) { >> if (!child.test(DISPLAY)) { >> continue; >> } >> - Log.system.error(this, "Child "+i+": >> "+child.contentheight+", "+child.maxheight+", "+child.test(VSHRINK)); >> + Log.system.error(this, "Child "+i+": >> "+child.nominalHeight()+", "+child.maxheight+", "+child.test(VSHRINK)); >> } >> } >> } >> >> // if there is 'slack' (child boxes do not >> consume parent width) then >> // align determines whether we pack boxes to >> left, centre, or right >> - int offset_y = (int)(totalsize+0.5)>=height || >> top ? 0 : (int)(((float)height-totalsize)/(float)(bottom?1:2)); >> + int offset_y = top ? 0 : >> (int)(((float)height-totalsize)/(float)(bottom?1:2)); >> >> // we use total (a float) to keep tabs on final >> layout totals >> // so we do not get stray pixel sized gaps >> caused by rounding >> totalsize = 0; >> - for (Box child = getChild(i=0); child != null; >> child = getChild(++i)) { >> + int prior_margin = padding.top; >> + int i = 0; >> + for (Box child = getChild(i); child != null; >> child = getChild(++i)) { >> if (!child.test(DISPLAY)) { >> continue; >> } >> // width, x >> - child_width = child.test(HSHRINK) ? >> child.contentwidth : min(child.maxwidth, width); >> - child_x = left ? 0 : (right ? >> width-child_width : (width-child_width)/2); >> + child_width = child.getTargetWidth(width); >> + child_x = child.getTargetX(width, >> child_width, left, right); >> + >> // height, y >> + totalsize += (float)max(prior_margin, >> child.margin.top); >> child_y = offset_y + (int)(totalsize+0.5); >> - if (child.test(VSHRINK) || >> child.contentheight > targetsize) { >> - child_height = child.contentheight; >> + final int child_nomheight = >> child.nominalHeight(); >> + if (child.test(VSHRINK) || child_nomheight > >> targetsize) { >> + child_height = child_nomheight; >> totalsize += (float)child_height; >> } else if (targetsize > child.maxheight) { >> child_height = child.maxheight; >> @@ -1072,6 +1139,7 @@ >> totalsize += targetsize; >> } >> child.tryMoveAndResize(child_x, child_y, >> child_width, child_height, clean); >> + prior_margin = child.margin.bottom; >> } >> } >> } >> @@ -1209,13 +1277,13 @@ >> >> /** fetches a write trap for property 'name' */ >> private Trap wtrap(JS name) { >> - Trap t = getTrap(name); >> + Trap t = getTrap(name); >> return t==null?null:t.findWrite(); >> } >> >> /** fetches a read trap for property 'name' */ >> private Trap rtrap(JS name) { >> - Trap t = getTrap(name); >> + Trap t = getTrap(name); >> return t==null?null:t.findRead(); >> } >> >> @@ -1811,7 +1879,7 @@ >> try { >> //#switch (JSU.toString(key)) >> case "from": this.from = (Box)value; return; >> - case "to": this.to = (Box)value; return; >> + case "to": this.to = (Box)value; return; >> //#end >> } catch(ClassCastException cce) { >> throw new JSExn("Cannot put non-Box to property >> '"+JSU.toString(key)+"' on DistanceTo"); >> @@ -1852,9 +1920,9 @@ >> return null; >> case "discover": >> reflow(); >> - return null; >> + return null; >> case "reflow": >> - setConstrain(); >> + setConstrain(); >> return null; >> case "render": >> reflow(); >> @@ -1955,16 +2023,16 @@ >> } >> >> /** 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; >> - } >> + 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") >> @@ -2029,9 +2097,9 @@ >> * @nofollow >> * */ >> case "font": >> - if (redirect == null) return null; >> - if (redirect == this) return font.stream; >> - return redirect.getAndTriggerTraps(SC_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> >> * >> @@ -2053,9 +2121,9 @@ >> * @initial_value("medium") >> * */ >> case "fontsize": >> - if (redirect == null) return null; >> - if (redirect == this) return sizeToJS(fontsize); >> - return redirect.getAndTriggerTraps(SC_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> >> @@ -2065,9 +2133,9 @@ >> * @nofollow >> * */ >> case "text": >> - if (redirect == null) return null; >> - if (redirect == this) return text; >> - return redirect.getAndTriggerTraps(SC_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> >> @@ -2082,9 +2150,9 @@ >> * @type(String) >> * */ >> case "textcolor": >> - if (redirect == null) return null; >> - if (redirect == this) return >> JSU.S(Color.colorToString(textcolor)); >> - return redirect.getAndTriggerTraps(SC_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 >> @@ -2141,9 +2209,9 @@ >> * @initial_value("center") >> * */ >> case "align": >> - if (redirect == null) return null; >> - if (redirect == this) return alignToJS(); >> - return redirect.getAndTriggerTraps(SC_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> >> * >> @@ -2166,9 +2234,9 @@ >> * @initial_value("pack") >> * */ >> 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); >> + 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> >> * >> @@ -2193,9 +2261,9 @@ >> * @initial_value("horizontal") >> * */ >> case "orient": >> - if (redirect == null) return null; >> - if (redirect == this) return test(ORIENT) ? SC_horizontal >> : SC_vertical; >> - return redirect.getAndTriggerTraps(SC_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 >> @@ -2403,6 +2471,17 @@ >> case "contentwidth": return JSU.N(contentwidth); >> case "contentheight": return JSU.N(contentheight); >> >> + case "margin": return margin.toJS(); >> + case "margin-top": return margin.topToJS(); >> + case "margin-left": return margin.leftToJS(); >> + case "margin-right": return margin.rightToJS(); >> + case "margin-bottom": return margin.bottomToJS(); >> + case "padding": return padding.toJS(); >> + case "padding-top": return padding.topToJS(); >> + case "padding-left": return padding.leftToJS(); >> + case "padding-right": return padding.rightToJS(); >> + case "padding-bottom": return padding.bottomToJS(); >> + >> /* <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 >> @@ -2627,9 +2706,9 @@ >> @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 >> - // could be an int (even integer strings) so probably not what we >> - // actually want. >> + // SHOULD differentiate the methods here. isInt checks anything >> that >> + // could be an int (even integer strings) so probably not what we >> + // actually want. >> if (JSU.isInt(name)) { >> put(JSU.toInt(name), value); >> return; >> @@ -2668,7 +2747,7 @@ >> throw new JSExn("Attempt to put non-null value to the >> 'thisbox' property"); >> } >> case "font": >> - if (tryRedirect(name, value)) return; >> + 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. >> @@ -2679,7 +2758,7 @@ >> if (test(FONTSTREAM_SET)) { >> clear(FONTSTREAM_SET); >> if (font.stream == DEFAULT_STREAM) >> - return; >> + return; >> setFont(DEFAULT_STREAM, fontsize); >> } >> } else { >> @@ -2694,11 +2773,11 @@ >> dirty(); >> } >> case "fontsize": >> - if (tryRedirect(name, value)) return; >> + if (tryRedirect(name, value)) return; >> if (value==null) { >> clear(FONTSIZE_SET); >> if (fontsize != MEDIUM_SIZE) >> - return; >> + return; >> setFont(font.stream, MEDIUM_SIZE); >> } else { >> int ps = jsToSize(value); >> @@ -2712,29 +2791,29 @@ >> dirty(); >> } >> case "text": >> - if (tryRedirect(name, value)) return; >> + 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)) { >> - if (text == EMPTY_STRING) >> - return; >> + if (value == null || EMPTY_STRING.equals(s)) { >> + if (text == EMPTY_STRING) >> + return; >> text = EMPTY_STRING; >> - } else { >> - if (text.equals(s)) { >> - return; >> - } >> - text = s; >> - } >> + } else { >> + if (text.equals(s)) { >> + return; >> + } >> + text = s; >> + } >> textCalculateDimensions(); >> setConstrain(); >> dirty(); >> case "textcolor": >> - if (tryRedirect(name, value)) return; >> + if (tryRedirect(name, value)) return; >> try { >> if (value==null) { >> clear(FONTCOLOR_SET); >> if (textcolor == DEFAULT_COLOR) >> - return; >> + return; >> textcolor = DEFAULT_COLOR; >> } else { >> int c = Color.stringToColor(JSU.toString(value)); >> @@ -2751,32 +2830,32 @@ >> case "shrink": >> boolean set_shrink = JSU.toBoolean(value); >> if (test(HSHRINK|VSHRINK) == set_shrink) { >> - return; >> + return; >> } >> // fire other relevant traps and set shrink flags >> if (test(HSHRINK) != set_shrink) { >> if (trap_test(HSHRINK_TRAP)) { >> JS ret = justTriggerTraps(SC_hshrink, value); >> if (ret!=Interpreter.CASCADE_PREVENTED) { >> - setclear(HSHRINK, JSU.toBoolean(ret)); >> + setclear(HSHRINK, JSU.toBoolean(ret)); >> } >> } else { >> - setclear(HSHRINK, set_shrink); >> + setclear(HSHRINK, set_shrink); >> } >> } >> if (test(VSHRINK) != set_shrink) { >> if (trap_test(VSHRINK_TRAP)) { >> JS ret = justTriggerTraps(SC_vshrink, value); >> if (ret!=Interpreter.CASCADE_PREVENTED) { >> - setclear(VSHRINK, JSU.toBoolean(ret)); >> + setclear(VSHRINK, JSU.toBoolean(ret)); >> } >> } else { >> - setclear(VSHRINK, set_shrink); >> + setclear(VSHRINK, set_shrink); >> } >> } >> setParentPlace(); >> case "hshrink": >> - boolean set_hshrink = JSU.toBoolean(value); >> + boolean set_hshrink = JSU.toBoolean(value); >> if (test(HSHRINK) != set_hshrink) { >> setParentPlace(); >> setclear(HSHRINK, set_hshrink); >> @@ -2786,7 +2865,7 @@ >> } >> } >> case "vshrink": >> - boolean set_hshrink = JSU.toBoolean(value); >> + boolean set_hshrink = JSU.toBoolean(value); >> if (test(VSHRINK) != JSU.toBoolean(value)) { >> setParentPlace(); >> setclear(VSHRINK, set_hshrink); >> @@ -2811,7 +2890,7 @@ >> // to change visible state if parent.visible == false as >> box.visible is >> // always be false) or if this box is attached to a >> surface >> WriteTrapChain trapchain = (parent!=null && >> (parent.get(SC_visible) == JSU.T)) || (parent==null && getSurface()!=null) >> - ? fireVisibleTraps(set_display) : null; >> + ? fireVisibleTraps(set_display) : null; >> if (set_display) { >> set(DISPLAY); >> requestReflow(); >> @@ -2853,15 +2932,15 @@ >> } >> case "fill": >> if (value == null && texture != null && test(TILE_IMAGE)) { >> - // other cases handled by Box.run() >> + // other cases handled by Box.run() >> setConstrain(); >> } >> if (value == null) { >> - if (text == null && !test(FILLCOLOR_SET)) >> - return; >> + if (text == null && !test(FILLCOLOR_SET)) >> + return; >> clear(FILLCOLOR_SET); >> fillcolor = DEFAULT_FILLCOLOR; >> - texture = null; >> + texture = null; >> } else if (JSU.isString(value)) { >> // use as a hex colour value >> int newfillcolor = >> Color.stringToColor(JSU.toString(value)); >> @@ -2884,25 +2963,25 @@ >> } >> dirty(); >> case "tile": >> - boolean tile = JSU.toBoolean(value); >> + boolean tile = JSU.toBoolean(value); >> if (test(TILE_IMAGE) != tile) { >> - if (tile) >> - set(TILE_IMAGE); >> - else clear(TILE_IMAGE); >> + if (tile) >> + set(TILE_IMAGE); >> + else clear(TILE_IMAGE); >> dirty(); >> if (texture != null && texture.isLoaded()) { >> if (test(TILE_IMAGE)) { >> - // this will cause the Box's minimum dimensions >> - // to be set to the image dimensions when tiled >> + // this will cause the Box's minimum dimensions >> + // to be ... [truncated message content] |
From: Mike G. <mik...@ca...> - 2015-05-04 19:55:17
|
Will this fix another issue? How to implement 'border collapse' in grids. i.e. is there a way to make a border part of the margin. On Mon, May 4, 2015 at 5:16 PM, <cl...@us...> wrote: > Revision: 4789 > http://sourceforge.net/p/vexi/code/4789 > Author: clrg > Date: 2015-05-04 16:16:14 +0000 (Mon, 04 May 2015) > Log Message: > ----------- > Core margin+padding implementation > > Modified Paths: > -------------- > > branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp > > Added Paths: > ----------- > > branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java > > branches/vexi3_integrated_layout/org.vexi-vexi.widgets/src_poke/poke/layout/core.t > > Added: > branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java > =================================================================== > --- > branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java > (rev 0) > +++ > branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java > 2015-05-04 16:16:14 UTC (rev 4789) > @@ -0,0 +1,110 @@ > +// Copyright (c) 2015 the Contributors, as shown in the revision logs. > +// Licensed under the GNU General Public License version 2 ("the > License"). > +// You may not use this file except in compliance with the License. > + > +package org.vexi.core; > + > +import org.ibex.js.JS; > +import org.ibex.js.JSExn; > +import org.ibex.js.JSU; > +import org.ibex.js.Constants; > + > +/** > + * <p>Encapsulates margin/padding state and JS interaction</p> > + * > + * <p>TODO: support different metrics i.e. %/pt/em</p> > + */ > +class Insets { > + // default empty/0 insets > + final protected static Insets ZERO = new Insets(); > + > + final int top, right, bottom, left; > + > + Insets() { > + top = 0; right = 0; bottom = 0; left = 0; > + } > + Insets(int i) { > + top = i; right = i; bottom = i; left = i; > + } > + Insets(int t, int r, int b, int l) { > + top = t; right = r; bottom = b; left = l; > + } > + > + final JS toJS() { > + if (this==ZERO) return Constants.NC_0; > + if ((top==right)&&(top==bottom)&&(top==left)) > + return JSU.N(top); > + if (top==bottom && left==right) > + return JSU.S(top+" "+left); > + return JSU.S(top+" "+right+" "+bottom+" "+left); > + } > + final JS topToJS() { return JSU.N(top); } > + final JS leftToJS() { return JSU.N(left); } > + final JS rightToJS() { return JSU.N(right); } > + final JS bottomToJS() { return JSU.N(bottom); } > + > + /** creates an Insets instance by parsing the given JS */ > + final static Insets fromJS(JS inset) throws JSExn { > + try { > + if (inset == null) > + return ZERO; > + > + if (JSU.isString(inset)) { > + String[] put = inset.toString().split(" "); > + if (put.length==1) { > + int i = Integer.parseInt(put[0]); > + return new Insets(i); > + } else if (put.length==2) { > + int v = Integer.parseInt(put[0]); > + int h = Integer.parseInt(put[1]); > + return new Insets(v, h, v, h); > + } else if (put.length==4) { > + int t = Integer.parseInt(put[0]); > + int r = Integer.parseInt(put[1]); > + int b = Integer.parseInt(put[2]); > + int l = Integer.parseInt(put[3]); > + return new Insets(t, r, b, l); > + } else { > + throw new Exception(); > + } > + } > + > + // Integer > + int i = JSU.toInt(inset); > + if (i == 0) return ZERO; > + return new Insets(i); > + > + } catch(Exception e) { > + throw new JSExn("Invalid insets value > '"+inset+"'"); > + } > + } > + > + final private int insetFromJS(JS inset) throws JSExn { > + try { > + return (inset == null) ? 0 > + : (JSU.isInt(inset) ? > JSU.toInt(inset) : Integer.parseInt(JSU.toString(inset))); > + } catch(Exception e) { > + throw new JSExn("Invalid inset value '"+inset+"'"); > + } > + } > + > + /** creates an Insets instance by parsing the given JS for the top > inset */ > + final Insets fromTopJS(JS top) throws JSExn { > + return new Insets(insetFromJS(top), right, bottom, left); > + } > + > + /** creates an Insets instance by parsing the given JS for the > left inset */ > + final Insets fromLeftJS(JS left) throws JSExn { > + return new Insets(top, right, bottom, insetFromJS(left)); > + } > + > + /** creates an Insets instance by parsing the given JS for the > right inset */ > + final Insets fromRightJS(JS right) throws JSExn { > + return new Insets(top, insetFromJS(right), bottom, left); > + } > + > + /** creates an Insets instance by parsing the given JS for the > bottom inset */ > + final Insets fromBottomJS(JS bottom) throws JSExn { > + return new Insets(top, right, insetFromJS(bottom), left); > + } > +} > > > Property changes on: > branches/vexi3_integrated_layout/org.vexi-core.main/src/main/java/org/vexi/core/Insets.java > ___________________________________________________________________ > Added: svn:mime-type > ## -0,0 +1 ## > +text/plain > \ No newline at end of property > 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-05-02 16:30:06 UTC (rev 4788) > +++ > branches/vexi3_integrated_layout/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp > 2015-05-04 16:16:14 UTC (rev 4789) > @@ -78,8 +78,8 @@ > * <p>Herein considering the horizontal dimension, the contentwidth of a > box is the maximum of:</p> > * <ol> > * <li>The value of the box's minwidth property</li> > - * <li>The rendered width of the box's textual content</li> > - * <li>The constrained width of the box's children</li> > + * <li>The rendered width of the box's textual content plus any > padding</li> > + * <li>The constrained width of the box's children any padding</li> > * </ol> > * > * <p>The constrained width of a box's children depends on the layout > policy of the box:</p> > @@ -174,7 +174,7 @@ > // postPutTriggerTrapsAndCatchExceptions(_t_, NAME, _e_);\ > // } else {\ > // CODE;\ > - // } > + // }\ > > > // Trivial Helper Methods (should be inlined) > ///////////////////////////////////////// > @@ -217,7 +217,7 @@ > final private boolean test(int mask) { return ((flags & mask) == > mask); } > > > - // Required by Surface/Platform > ///////////////////////////////////////// > + // Required by Surface/Platform > ///////////////////////////////////////// > > public final int getIntFillcolor() { return fillcolor; } > public final Surface getSurface() { return > Surface.fromBox(getRoot()); } > @@ -269,8 +269,8 @@ > > private static final int PACK = 0x00001000; > private static final int CLIP = 0x00002000; > - private static final int HAS_WIDTH_SLACK = 0x00004000; > - private static final int HAS_HEIGHT_SLACK = 0x00008000; > +// private static final int HAS_WIDTH_SLACK = 0x00004000; > +// private static final int HAS_HEIGHT_SLACK = 0x00008000; > > private static final int ALIGN_TOP = 0x00010000; > private static final int ALIGN_BOTTOM = 0x00020000; > @@ -423,7 +423,14 @@ > private int contentwidth = 0; // == min(maxwidth, max(minwidth, > textwidth, sum(child.contentwidth))) > private int contentheight = 0; > > + private Insets margin = Insets.ZERO; > + private Insets padding = Insets.ZERO; > + > + // this is a calculated total of the gaps between packed children > + // TODO: put into a place() loop or another alternative mechanism > + private int box_spacing = 0; > > + > // Instance Methods > ///////////////////////////////////////////////////////////////////// > // FIX not right. Really we want the constructor to be showing, and > it does by default > // if it exists, but need to consider the case if a template is not > present (or indeed > @@ -486,8 +493,8 @@ > dirty(); > // Tiled images affect contentsize > if (test(TILE_IMAGE)) { > - setMinWidth(texture.getWidth(), true); > - setMinHeight(texture.getHeight(), true); > + setMinWidth(texture.getWidth(), true); > + setMinHeight(texture.getHeight(), true); > setConstrain(); > } > } else if (texture.getLoadFailed()!=null) { > @@ -624,7 +631,17 @@ > } > } > > + private final int nominalWidth() { return min(maxwidth, > max(contentwidth, minwidth)); } > + private final int nominalHeight() { return min(maxheight, > max(contentheight, minheight)); } > + > + private final int constrainToWidth(int testwidth, Box c) { > + return max(testwidth, c.nominalWidth() + max(padding.left, > c.margin.left) + max(padding.right, c.margin.right)); > + } > + private final int constrainToHeight(int testheight, Box c) { > + return max(testheight, c.nominalHeight() + max(padding.top, > c.margin.top) + max(padding.bottom, c.margin.bottom)); > + } > > + > // Reflow/rendering Pipeline ////////////////////////////////////// > > /** used to invoke reflow on a box and it's children */ > @@ -633,8 +650,8 @@ > return; > } > constrain(); > - int w = test(HSHRINK) ? contentwidth : min(maxwidth, > max(contentwidth, width)); > - int h = test(VSHRINK) ? contentheight : min(maxheight, > max(contentheight, height)); > + int w = test(HSHRINK) ? nominalWidth() : min(maxwidth, > max(contentwidth, width)); > + int h = test(VSHRINK) ? nominalHeight() : min(maxheight, > max(contentheight, height)); > tryResize(w, h, true); > place(test(PLACE_CLEAN)); > } > @@ -661,8 +678,8 @@ > private void constrain() { > int i; > if (test(CONSTRAIN_DESCENDENT)) { > - // clear first, because it is possible > - // that reflow may lead to more reflow > + // clear first, because it is possible > + // that reflow may lead to more reflow > clear(CONSTRAIN_DESCENDENT); > // reconstrain any children > for (Box c = getChild(i=0); c != null; c = getChild(++i)) { > @@ -676,10 +693,10 @@ > // REMARK: must happen after children's sizes known > // otherwise any update is immediately invalidated > if (trap_test(RESIZE_TRAP)) { > - justTriggerTrapsAndCatchExceptions(SC_Resize, JSU.T); > + justTriggerTrapsAndCatchExceptions(SC_Resize, JSU.T); > } > > - // no reconstrain necessary > + // no re-constrain necessary > if (!test(CONSTRAIN)) { > return; > } > @@ -687,22 +704,28 @@ > // establish new content size > int new_contentwidth = 0, new_contentheight = 0; > if (test(PACK)) { > - //#repeat width/height HORIZONTAL/VERTICAL > + //#repeat width/height HORIZONTAL/VERTICAL Width/Height > left/top right/bottom > if (test(ORIENT) == HORIZONTAL) { > // accumulate child contentwidth > + int prior_margin = padding.left; > + box_spacing = 0; > for (Box c = getChild(i=0); c != null; c = getChild(++i)) > { > if (!c.test(DISPLAY)) { > continue; > } > - new_contentwidth += c.contentwidth; > + int spacing = max(prior_margin, c.margin.left); > + box_spacing += spacing; > + new_contentwidth += c.nominalWidth() + spacing; > + prior_margin = c.margin.right; > } > + new_contentwidth += max(prior_margin, padding.right); > } else { > // maximum child contentwidth > for (Box c = getChild(i=0); c != null; c = getChild(++i)) > { > if (!c.test(DISPLAY)) { > continue; > } > - new_contentwidth = max(new_contentwidth, > c.contentwidth); > + new_contentwidth = constrainToWidth(new_contentwidth, > c); > } > } > //#end > @@ -712,12 +735,15 @@ > if (!c.test(DISPLAY)) { > continue; > } > - new_contentwidth = max(new_contentwidth, c.contentwidth); > - new_contentheight = max(new_contentheight, > c.contentheight); > + new_contentwidth = constrainToWidth(new_contentwidth, c); > + new_contentheight = constrainToHeight(new_contentheight, > c); > } > } > > //#repeat width/height WIDTH/HEIGHT > + if (test(CLIP)) > + new_contentwidth = max(new_contentwidth, textwidth) + > padding.left + padding.right; > +/* > if (test(CLIP)) { > if (new_contentwidth < maxwidth && new_contentwidth < > minwidth) { > set(HAS_WIDTH_SLACK); > @@ -726,7 +752,7 @@ > } > } else { > if (new_contentwidth < maxwidth && (new_contentwidth < > minwidth || new_contentwidth < textwidth || > - (texture!=null && new_contentwidth < > texture.getWidth()))) { > + (texture!=null && new_contentwidth < > texture.getWidth()))) { > set(HAS_WIDTH_SLACK); > } else { > clear(HAS_WIDTH_SLACK); > @@ -735,6 +761,7 @@ > } > > new_contentwidth = min(maxwidth, max(minwidth, new_contentwidth)); > +*/ > > // assign contentwidth and mark for place in parent and placing > of children > if (new_contentwidth != contentwidth) { > @@ -746,7 +773,7 @@ > } else { > // constrain contentwidth to frame width > if (getSurface()!=null && !test(SHRINK)) { > - new_contentwidth = min(getSurface().pendingWidth, > new_contentwidth); > + new_contentwidth = min(getSurface().pendingWidth, > new_contentwidth); > } > if (new_contentwidth != contentwidth) { > setPlaceInTree(); > @@ -778,26 +805,45 @@ > set(PLACE_CLEAN); > } > > + //#repeat HSHRINK/VSHRINK Width/Height getTargetX/getTargetY x/y > tx/ty width/height left/top right/bottom > + private final int getTargetWidth(final int availableWidth) { > + return test(HSHRINK) ? nominalWidth() > + : max(contentwidth, min(maxwidth, availableWidth - x > + - max(margin.left, parent.padding.left) - > max(margin.right, parent.padding.right))); > + } > + private final int getTargetX(final int availableWidth, final int > targetWidth, final boolean left, final boolean right) { > + if (left) return margin.left; > + if (right) return availableWidth - targetWidth - margin.right; > + > + int tx = (availableWidth - targetWidth) / 2; > + // honour margins > + if (tx < margin.left) return margin.left; > + if (availableWidth - tx - targetWidth < margin.right) > + return availableWidth - margin.bottom; > + return tx; > + } > + //#end > + > private final void placeChildren(boolean clean) { > if (test(PLACE)) { > clear(PLACE); > - // needed for later resize() > - int child_width, child_height, i; > > - // place children individually in box space > if (!test(PACK)) { > + // place children individually in box space > + int i; > for (Box child = getChild(i=treeSize()-1); child != null; > child = getChild(--i)) { > if (!child.test(DISPLAY)) { > continue; > } > - child_width = child.test(HSHRINK) ? > child.contentwidth : max(child.contentwidth, min(child.maxwidth, width - > child.x)); > - child_height = child.test(VSHRINK) ? > child.contentheight : max(child.contentheight, min(child.maxheight, height > - child.y)); > - child.tryResize(child_width, child_height, clean); > + child.tryResize(child.getTargetWidth(width), > + child.getTargetHeight(height), > + clean); > } > > - // pack children into available space > } else { > + // pack children into available space > int child_x = 0, child_y = 0; > + int child_width, child_height; > boolean top = test(ALIGN_TOP); > boolean left = test(ALIGN_LEFT); > boolean right = test(ALIGN_RIGHT); > @@ -805,18 +851,23 @@ > > if (test(ORIENT) == HORIZONTAL) { > // horizontal stacking > - if (!test(HAS_WIDTH_SLACK) && 0 >= > width-contentwidth) { > - // simple case - no slack, place children next to > eachother > + if (contentwidth >= width) { > + // simple case - no slack, place children next to > each other > + int i = 0; > + int prior_margin = padding.left; > for (Box child = getChild(i=0); child != null; > child = getChild(++i)) { > if (!child.test(DISPLAY)) { > continue; > } > // height, y > - child_height = child.test(VSHRINK) ? > child.contentheight : min(child.maxheight, height); > - child_y = top ? 0 : (bottom ? > height-child_height : (height-child_height)/2); > + child_height = child.getTargetHeight(height); > + child_y = getTargetY(height, child_height, > top, bottom); > // width, x > - child.tryMoveAndResize(child_x, child_y, > child.contentwidth, child_height, clean); > - child_x += child.contentwidth; > + child_width = child.nominalWidth(); > + child_x += max(prior_margin, > child.margin.left); > + child.tryMoveAndResize(child_x, child_y, > child_width, child_height, clean); > + child_x += child_width; > + prior_margin = child.margin.right; > } > > } else { > @@ -824,76 +875,76 @@ > // our layout lies somewhere between the min and > max size, > // loop over the children attempting to set their > width to > // targetsize and adjust until it meets the > parent width > - float targetsize = (float)width/(float)treeSize(); > + int packingspace = width - box_spacing; > + float targetsize = (float)(packingspace) / > (float)treeSize(); > float totalsize = 0; > - int numactive = 0; > for (int j=0; j<100; j++) { > + totalsize = 0; > int min_minsize = MAX_DIMENSION; > int max_maxsize = 0; > - int numflexible = 0; > + int num_active = 0; > int num_minsize = 0; > int num_maxsize = 0; > + int num_nolimit = 0; > int num_passive = 0; > + int i = 0; > for (Box child = getChild(i=0); child != > null; child = getChild(++i)) { > if (!child.test(DISPLAY)) { > continue; > } > - numactive++; > - if (child.test(HSHRINK) || > child.maxwidth==child.contentwidth) { > + final int child_nomwidth = > child.nominalWidth(); > + num_active++; > + if (child.test(HSHRINK) || > child.maxwidth==child_nomwidth) { > num_passive++; > - totalsize += child.contentwidth; > - } else if (child.contentwidth>targetsize) > { > - min_minsize = min(min_minsize, > child.contentwidth); > + totalsize += child_nomwidth; > + } else if (child_nomwidth>targetsize) { > + min_minsize = min(min_minsize, > child_nomwidth); > num_minsize++; > - totalsize += > (float)child.contentwidth; > + totalsize += (float)child_nomwidth; > } else if (child.maxwidth<targetsize) { > max_maxsize = max(max_maxsize, > child.maxwidth); > num_maxsize++; > totalsize += (float)child.maxwidth; > } else { > - numflexible++; > + num_nolimit++; > totalsize += targetsize; > } > } > > - if (numactive==0) { > + if (num_active==0) { > // no active children - nothing to do > return; > } > > // test to see if targetsize produces a > solution that rounds > - // to match the width, adjusting appropriatly > if it does not > + // to match the width, adjusting > appropriately if it does not > int totalsize_int = (int)(totalsize+0.5); > - if (totalsize_int > width) { > - if (numflexible>0) { > - targetsize -= > (totalsize-(float)width)/(float)numflexible; > + if (totalsize_int > packingspace) { > + if (num_nolimit>0) { > + targetsize -= > (totalsize-(float)packingspace)/(float)num_nolimit; > } else { > - if > (num_minsize+num_passive==numactive) { > - // no solution required - > avaiable min-sizes over-consume width > + if > (num_minsize+num_passive==num_active) { > + // no solution required - > available min-sizes over-consume width > targetsize = width; > break; > } > - targetsize = (float)max_maxsize - > (totalsize-(float)width)/(float)num_maxsize; > + targetsize = (float)max_maxsize - > (totalsize-(float)packingspace)/(float)num_maxsize; > } > - } else if (totalsize_int < width) { > - if (numflexible>0) { > - targetsize += > ((float)width-totalsize)/(float)numflexible; > + } else if (totalsize_int < packingspace) { > + if (num_nolimit>0) { > + targetsize += > ((float)packingspace-totalsize)/(float)num_nolimit; > } else { > - if > (num_maxsize+num_passive==numactive) { > - // no solution required - > avaiable max-sizes do not consume width > + if > (num_maxsize+num_passive==num_active) { > + // no solution required - > available max-sizes do not consume width > targetsize = width; > break; > } > - targetsize = (float)min_minsize + > ((float)width-totalsize)/(float)num_minsize; > + targetsize = (float)min_minsize + > ((float)packingspace-totalsize)/(float)num_minsize; > } > } else { > break; > } > > - // reset outer variables and try again > - numactive = 0; > - totalsize = 0; > - > // REMARK: this is error / infinite loop > prevention > // giving a helpful report if no solution is > found > if (j>=99) { > @@ -903,29 +954,34 @@ > if (!child.test(DISPLAY)) { > continue; > } > - Log.system.error(this, "Child "+i+": > "+child.contentwidth+", "+child.maxwidth+", "+child.test(HSHRINK)); > + Log.system.error(this, "Child "+i+": > "+child.nominalWidth()+", "+child.maxwidth+", "+child.test(HSHRINK)); > } > } > } > > // if there is 'slack' (child boxes do not > consume parent width) then > // align determines whether we pack boxes to > left, centre, or right > - int offset_x = (int)(totalsize+0.5)>=width || > left ? 0 : (int)(((float)width-totalsize)/(float)(right?1:2)); > + int offset_x = left ? 0 : > (int)(((float)width-totalsize)/(float)(right?1:2)); > > // we use total (a float) to keep tabs on final > layout totals > // so we do not get stray pixel sized gaps caused > by rounding > totalsize = 0; > - for (Box child = getChild(i=0); child != null; > child = getChild(++i)) { > + int prior_margin = padding.left; > + int i = 0; > + for (Box child = getChild(i); child != null; > child = getChild(++i)) { > if (!child.test(DISPLAY)) { > continue; > } > // height, y > - child_height = child.test(VSHRINK) ? > child.contentheight : min(child.maxheight, height); > - child_y = top ? 0 : (bottom ? > height-child_height : (height-child_height)/2); > + child_height = child.getTargetHeight(height); > + child_y = child.getTargetY(height, > child_height, top, bottom); > + > // width, x > + totalsize += (float)max(prior_margin, > child.margin.left); > child_x = offset_x + (int)(totalsize+0.5); > - if (child.test(HSHRINK) || child.contentwidth > > targetsize) { > - child_width = child.contentwidth; > + final int child_nomwidth = > child.nominalWidth(); > + if (child.test(HSHRINK) || child_nomwidth > > targetsize) { > + child_width = child_nomwidth; > totalsize += (float)child_width; > } else if (targetsize > child.maxwidth) { > child_width = child.maxwidth; > @@ -936,23 +992,29 @@ > totalsize += targetsize; > } > child.tryMoveAndResize(child_x, child_y, > child_width, child_height, clean); > + prior_margin = child.margin.right; > } > } > > } else { > // vertical stacking - mirrors horizontal stacking > code [see for comments] > - if (!test(HAS_HEIGHT_SLACK) && 0 >= height - > contentheight) { > + if (contentheight >= height) { > // simple case - no slack > + int i = 0; > + int prior_margin = padding.top; > for (Box child = getChild(i=0); child != null; > child = getChild(++i)) { > if (!child.test(DISPLAY)) { > continue; > } > // width, x > - child_width = child.test(HSHRINK) ? > child.contentwidth : min(child.maxwidth, width); > - child_x = left ? 0 : (right ? > width-child_width : (width-child_width)/2); > + child_width = child.getTargetWidth(width); > + child_x = child.getTargetX(width, > child_width, left, right); > // height, y > - child.tryMoveAndResize(child_x, child_y, > child_width, child.contentheight, clean); > - child_y += child.contentheight; > + child_height = child.nominalHeight(); > + child_y += max(prior_margin, > child.margin.top); > + child.tryMoveAndResize(child_x, child_y, > child_width, child_height, clean); > + child_y += child_height; > + prior_margin = child.margin.bottom; > } > > } else { > @@ -960,108 +1022,113 @@ > // our layout lies somewhere between the min and > max size, > // loop over the children attempting to set their > width to > // targetsize and adjust until it meets the > parent width > - float targetsize = > (float)height/(float)treeSize(); > + int packingspace = height - box_spacing; > + float targetsize = (float)packingspace / > (float)treeSize(); > float totalsize = 0; > - int numactive = 0; > for (int j=0; j<100; j++) { > + totalsize = 0; > int min_minsize = MAX_DIMENSION; > int max_maxsize = 0; > - int numflexible = 0; > + int num_active = 0; > int num_minsize = 0; > int num_maxsize = 0; > + int num_nolimit = 0; > int num_passive = 0; > + int i = 0; > for (Box child = getChild(i=0); child != > null; child = getChild(++i)) { > if (!child.test(DISPLAY)) { > continue; > } > - numactive++; > - if (child.test(VSHRINK) || > child.maxheight==child.contentheight) { > + num_active++; > + final int child_nomheight = > child.nominalHeight(); > + if (child.test(VSHRINK) || > child.maxheight==child_nomheight) { > num_passive++; > - totalsize += child.contentheight; > - } else if > (child.contentheight>targetsize) { > - min_minsize = min(min_minsize, > child.contentheight); > + totalsize += child_nomheight; > + } else if (child_nomheight>targetsize) { > + min_minsize = min(min_minsize, > child_nomheight); > num_minsize++; > - totalsize += > (float)child.contentheight; > + totalsize += (float)child_nomheight; > } else if (child.maxheight<targetsize) { > max_maxsize = max(max_maxsize, > child.maxheight); > num_maxsize++; > totalsize += (float)child.maxheight; > } else { > - numflexible++; > + num_nolimit++; > totalsize += targetsize; > } > } > > - if (numactive==0) { > + if (num_active==0) { > // no active children - nothing to do > return; > } > > // test to see if targetsize produces a > solution that rounds > - // to match the height, adjusting > appropriatly if it does not > + // to match the height, adjusting > appropriately if it does not > int totalsize_int = (int)(totalsize+0.5); > - if (totalsize_int > height) { > - if (numflexible>0) { > - targetsize -= > (totalsize-(float)height)/(float)numflexible; > + if (totalsize_int > packingspace) { > + if (num_nolimit>0) { > + targetsize -= > (totalsize-(float)packingspace)/(float)num_nolimit; > } else { > - if > (num_minsize+num_passive==numactive) { > - // no solution required - > avaiable min-sizes over-consume height > + if > (num_minsize+num_passive==num_active) { > + // no solution required - > available min-sizes over-consume height > targetsize = height; > break; > } > - targetsize = (float)max_maxsize - > (totalsize-(float)height)/(float)num_maxsize; > + targetsize = (float)max_maxsize - > (totalsize-(float)packingspace)/(float)num_maxsize; > } > - } else if (totalsize_int < height) { > - if (numflexible>0) { > - targetsize += > ((float)height-totalsize)/(float)numflexible; > + } else if (totalsize_int < packingspace) { > + if (num_nolimit>0) { > + targetsize += > ((float)packingspace-totalsize)/(float)num_nolimit; > } else { > - if > (num_maxsize+num_passive==numactive) { > - // no solution required - > avaiable max-sizes do not consume height > + if > (num_maxsize+num_passive==num_active) { > + // no solution required - > available max-sizes do not consume height > targetsize = height; > break; > } > - targetsize = (float)min_minsize + > ((float)height-totalsize)/(float)num_minsize; > + targetsize = (float)min_minsize + > ((float)packingspace-totalsize)/(float)num_minsize; > } > } else { > break; > } > > - // reset outer variables and try again > - numactive = 0; > - totalsize = 0; > - > // REMARK: this is error / infinite loop > prevention > // giving a helpful report if no solution is > found > if (j>=99) { > - Log.system.error(this, "Core layout > failure, please report:"); > - Log.system.error(this, "Parent height: > "+height); > + Log.system.error(this, "Core layout > failure, please report:"); > + Log.system.error(this, "Parent height: > "+height); > for (Box child = getChild(i=0); child != > null; child = getChild(++i)) { > if (!child.test(DISPLAY)) { > continue; > } > - Log.system.error(this, "Child "+i+": > "+child.contentheight+", "+child.maxheight+", "+child.test(VSHRINK)); > + Log.system.error(this, "Child "+i+": > "+child.nominalHeight()+", "+child.maxheight+", "+child.test(VSHRINK)); > } > } > } > > // if there is 'slack' (child boxes do not > consume parent width) then > // align determines whether we pack boxes to > left, centre, or right > - int offset_y = (int)(totalsize+0.5)>=height || > top ? 0 : (int)(((float)height-totalsize)/(float)(bottom?1:2)); > + int offset_y = top ? 0 : > (int)(((float)height-totalsize)/(float)(bottom?1:2)); > > // we use total (a float) to keep tabs on final > layout totals > // so we do not get stray pixel sized gaps caused > by rounding > totalsize = 0; > - for (Box child = getChild(i=0); child != null; > child = getChild(++i)) { > + int prior_margin = padding.top; > + int i = 0; > + for (Box child = getChild(i); child != null; > child = getChild(++i)) { > if (!child.test(DISPLAY)) { > continue; > } > // width, x > - child_width = child.test(HSHRINK) ? > child.contentwidth : min(child.maxwidth, width); > - child_x = left ? 0 : (right ? > width-child_width : (width-child_width)/2); > + child_width = child.getTargetWidth(width); > + child_x = child.getTargetX(width, > child_width, left, right); > + > // height, y > + totalsize += (float)max(prior_margin, > child.margin.top); > child_y = offset_y + (int)(totalsize+0.5); > - if (child.test(VSHRINK) || > child.contentheight > targetsize) { > - child_height = child.contentheight; > + final int child_nomheight = > child.nominalHeight(); > + if (child.test(VSHRINK) || child_nomheight > > targetsize) { > + child_height = child_nomheight; > totalsize += (float)child_height; > } else if (targetsize > child.maxheight) { > child_height = child.maxheight; > @@ -1072,6 +1139,7 @@ > totalsize += targetsize; > } > child.tryMoveAndResize(child_x, child_y, > child_width, child_height, clean); > + prior_margin = child.margin.bottom; > } > } > } > @@ -1209,13 +1277,13 @@ > > /** fetches a write trap for property 'name' */ > private Trap wtrap(JS name) { > - Trap t = getTrap(name); > + Trap t = getTrap(name); > return t==null?null:t.findWrite(); > } > > /** fetches a read trap for property 'name' */ > private Trap rtrap(JS name) { > - Trap t = getTrap(name); > + Trap t = getTrap(name); > return t==null?null:t.findRead(); > } > > @@ -1811,7 +1879,7 @@ > try { > //#switch (JSU.toString(key)) > case "from": this.from = (Box)value; return; > - case "to": this.to = (Box)value; return; > + case "to": this.to = (Box)value; return; > //#end > } catch(ClassCastException cce) { > throw new JSExn("Cannot put non-Box to property > '"+JSU.toString(key)+"' on DistanceTo"); > @@ -1852,9 +1920,9 @@ > return null; > case "discover": > reflow(); > - return null; > + return null; > case "reflow": > - setConstrain(); > + setConstrain(); > return null; > case "render": > reflow(); > @@ -1955,16 +2023,16 @@ > } > > /** 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; > - } > + 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") > @@ -2029,9 +2097,9 @@ > * @nofollow > * */ > case "font": > - if (redirect == null) return null; > - if (redirect == this) return font.stream; > - return redirect.getAndTriggerTraps(SC_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> > * > @@ -2053,9 +2121,9 @@ > * @initial_value("medium") > * */ > case "fontsize": > - if (redirect == null) return null; > - if (redirect == this) return sizeToJS(fontsize); > - return redirect.getAndTriggerTraps(SC_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> > @@ -2065,9 +2133,9 @@ > * @nofollow > * */ > case "text": > - if (redirect == null) return null; > - if (redirect == this) return text; > - return redirect.getAndTriggerTraps(SC_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> > @@ -2082,9 +2150,9 @@ > * @type(String) > * */ > case "textcolor": > - if (redirect == null) return null; > - if (redirect == this) return > JSU.S(Color.colorToString(textcolor)); > - return redirect.getAndTriggerTraps(SC_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 > @@ -2141,9 +2209,9 @@ > * @initial_value("center") > * */ > case "align": > - if (redirect == null) return null; > - if (redirect == this) return alignToJS(); > - return redirect.getAndTriggerTraps(SC_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> > * > @@ -2166,9 +2234,9 @@ > * @initial_value("pack") > * */ > 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); > + 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> > * > @@ -2193,9 +2261,9 @@ > * @initial_value("horizontal") > * */ > case "orient": > - if (redirect == null) return null; > - if (redirect == this) return test(ORIENT) ? SC_horizontal > : SC_vertical; > - return redirect.getAndTriggerTraps(SC_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 > @@ -2403,6 +2471,17 @@ > case "contentwidth": return JSU.N(contentwidth); > case "contentheight": return JSU.N(contentheight); > > + case "margin": return margin.toJS(); > + case "margin-top": return margin.topToJS(); > + case "margin-left": return margin.leftToJS(); > + case "margin-right": return margin.rightToJS(); > + case "margin-bottom": return margin.bottomToJS(); > + case "padding": return padding.toJS(); > + case "padding-top": return padding.topToJS(); > + case "padding-left": return padding.leftToJS(); > + case "padding-right": return padding.rightToJS(); > + case "padding-bottom": return padding.bottomToJS(); > + > /* <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 > @@ -2627,9 +2706,9 @@ > @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 > - // could be an int (even integer strings) so probably not what we > - // actually want. > + // SHOULD differentiate the methods here. isInt checks anything > that > + // could be an int (even integer strings) so probably not what we > + // actually want. > if (JSU.isInt(name)) { > put(JSU.toInt(name), value); > return; > @@ -2668,7 +2747,7 @@ > throw new JSExn("Attempt to put non-null value to the > 'thisbox' property"); > } > case "font": > - if (tryRedirect(name, value)) return; > + 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. > @@ -2679,7 +2758,7 @@ > if (test(FONTSTREAM_SET)) { > clear(FONTSTREAM_SET); > if (font.stream == DEFAULT_STREAM) > - return; > + return; > setFont(DEFAULT_STREAM, fontsize); > } > } else { > @@ -2694,11 +2773,11 @@ > dirty(); > } > case "fontsize": > - if (tryRedirect(name, value)) return; > + if (tryRedirect(name, value)) return; > if (value==null) { > clear(FONTSIZE_SET); > if (fontsize != MEDIUM_SIZE) > - return; > + return; > setFont(font.stream, MEDIUM_SIZE); > } else { > int ps = jsToSize(value); > @@ -2712,29 +2791,29 @@ > dirty(); > } > case "text": > - if (tryRedirect(name, value)) return; > + 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)) { > - if (text == EMPTY_STRING) > - return; > + if (value == null || EMPTY_STRING.equals(s)) { > + if (text == EMPTY_STRING) > + return; > text = EMPTY_STRING; > - } else { > - if (text.equals(s)) { > - return; > - } > - text = s; > - } > + } else { > + if (text.equals(s)) { > + return; > + } > + text = s; > + } > textCalculateDimensions(); > setConstrain(); > dirty(); > case "textcolor": > - if (tryRedirect(name, value)) return; > + if (tryRedirect(name, value)) return; > try { > if (value==null) { > clear(FONTCOLOR_SET); > if (textcolor == DEFAULT_COLOR) > - return; > + return; > textcolor = DEFAULT_COLOR; > } else { > int c = Color.stringToColor(JSU.toString(value)); > @@ -2751,32 +2830,32 @@ > case "shrink": > boolean set_shrink = JSU.toBoolean(value); > if (test(HSHRINK|VSHRINK) == set_shrink) { > - return; > + return; > } > // fire other relevant traps and set shrink flags > if (test(HSHRINK) != set_shrink) { > if (trap_test(HSHRINK_TRAP)) { > JS ret = justTriggerTraps(SC_hshrink, value); > if (ret!=Interpreter.CASCADE_PREVENTED) { > - setclear(HSHRINK, JSU.toBoolean(ret)); > + setclear(HSHRINK, JSU.toBoolean(ret)); > } > } else { > - setclear(HSHRINK, set_shrink); > + setclear(HSHRINK, set_shrink); > } > } > if (test(VSHRINK) != set_shrink) { > if (trap_test(VSHRINK_TRAP)) { > JS ret = justTriggerTraps(SC_vshrink, value); > if (ret!=Interpreter.CASCADE_PREVENTED) { > - setclear(VSHRINK, JSU.toBoolean(ret)); > + setclear(VSHRINK, JSU.toBoolean(ret)); > } > } else { > - setclear(VSHRINK, set_shrink); > + setclear(VSHRINK, set_shrink); > } > } > setParentPlace(); > case "hshrink": > - boolean set_hshrink = JSU.toBoolean(value); > + boolean set_hshrink = JSU.toBoolean(value); > if (test(HSHRINK) != set_hshrink) { > setParentPlace(); > setclear(HSHRINK, set_hshrink); > @@ -2786,7 +2865,7 @@ > } > } > case "vshrink": > - boolean set_hshrink = JSU.toBoolean(value); > + boolean set_hshrink = JSU.toBoolean(value); > if (test(VSHRINK) != JSU.toBoolean(value)) { > setParentPlace(); > setclear(VSHRINK, set_hshrink); > @@ -2811,7 +2890,7 @@ > // to change visible state if parent.visible == false as > box.visible is > // always be false) or if this box is attached to a > surface > WriteTrapChain trapchain = (parent!=null && > (parent.get(SC_visible) == JSU.T)) || (parent==null && getSurface()!=null) > - ? fireVisibleTraps(set_display) : null; > + ? fireVisibleTraps(set_display) : null; > if (set_display) { > set(DISPLAY); > requestReflow(); > @@ -2853,15 +2932,15 @@ > } > case "fill": > if (value == null && texture != null && test(TILE_IMAGE)) { > - // other cases handled by Box.run() > + // other cases handled by Box.run() > setConstrain(); > } > if (value == null) { > - if (text == null && !test(FILLCOLOR_SET)) > - return; > + if (text == null && !test(FILLCOLOR_SET)) > + return; > clear(FILLCOLOR_SET); > fillcolor = DEFAULT_FILLCOLOR; > - texture = null; > + texture = null; > } else if (JSU.isString(value)) { > // use as a hex colour value > int newfillcolor = > Color.stringToColor(JSU.toString(value)); > @@ -2884,25 +2963,25 @@ > } > dirty(); > case "tile": > - boolean tile = JSU.toBoolean(value); > + boolean tile = JSU.toBoolean(value); > if (test(TILE_IMAGE) != tile) { > - if (tile) > - set(TILE_IMAGE); > - else clear(TILE_IMAGE); > + if (tile) > + set(TILE_IMAGE); > + else clear(TILE_IMAGE); > dirty(); > if (texture != null && texture.isLoaded()) { > if (test(TILE_IMAGE)) { > - // this will cause the Box's minimum dimensions > - // to be set to the image dimensions when tiled > + // this will cause the Box's minimum dimensions > + // to be set to the image dimensions when tiled > run(null); > } > } > } > case "align": > - if (tryRedirect(name, value)) return; > - setAlign(value); > + if (tryRedirect(name, value)) return; > + setAlign(value); > case "layout": > - if (tryRedirect(name, value)) return; > + if (tryRedirect(name, value)) return; > if (SC_place.equals(value)) { > if (!test(PACK) && test(CLIP)) { > return; > @@ -2931,7 +3010,7 @@ > throw new JSExn("Attempt to set Box property 'layout' to > unsupported value '"+JSU.toString(value)+"'"); > } > case "orient": > - if (tryRedirect(name, value)) return; > + if (tryRedirect(name, value)) return; > if (SC_horizontal.equals(value)) { > if (test(ORIENT)) { > return; > @@ -3009,7 +3088,19 @@ > dirty(); > } > } > + > + case "margin": margin = Insets.fromJS(value); > setParentConstrain(); > + case "margin-top": margin = margin.fromTopJS(value); > setParentConstrain(); > + case "margin-left": margin = margin.fromLeftJS(value); > setParentConstrain(); > + case "margin-right": margin = margin.fromRightJS(value); > setParentConstrain(); > + case "margin-bottom": margin = margin.fromBottomJS(value); > setParentConstrain(); > > + case "padding": if (tryRedirect(name, value)) return; > padding = Insets.fromJS(value); setConstrain(); > + case "padding-top": if (tryRedirect(name, value)) return; > padding = padding.fromTopJS(value); setConstrain(); > + case... [truncated message content] |
From: Charles G. <ch...@we...> - 2015-04-29 11:13:29
|
On 28 April 2015 at 17:35, Mike Goodwin <mik...@ca...> wrote: > To be honest I think it should work ok now. Never got around to > integrating the change back. > I tried porting it to the latest version of Vexi and running it (once I fixed a bunch of strange casting errors... Eclipse/Java insisted on picking up Basket.List even though it wasn't in the imports) but it seems something isn't quite right yet. - C =========================================================================== Platform: Vexi build: unknown Main: argument 0: -hr argument 1: ../org.vexi-vexi.widgets/src_main argument 2: ../org.vexi-vexi.icons/src_main argument 3: ../org.vexi-vexi.demo/src_main =========================================================================== DotVexi: OS: Linux loading vexi application invoking initial template: main Scheduler: A JavaScript thread spawned with vexi.thread threw an exception: JSExn: Unexpected Java exception thrown by the core java.lang.ArrayIndexOutOfBoundsException:2147483647 org.ibex.js.util.Hash.put(Hash.java:137) org.ibex.js.JS$Obj.putSafe(JS.java:727) org.ibex.js.JS$Obj.put(JS.java:725) org.vexi.core.Box.put(Box.java:2890) org.ibex.js.Interpreter.run(Interpreter.java:400) org.ibex.js.Interpreter.run(Interpreter.java:140) org.ibex.js.Scheduler.runInCurrent(Scheduler.java:337) org.ibex.js.JSFunction.apply(JSFunction.java:52) org.vexi.core.VML$Static$Template.apply(VML.java:301) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:207) org.vexi.core.VML$Static$Template.apply(VML.java:230) org.vexi.core.VML$Static$Template.apply(VML.java:230) org.vexi.core.VML$Static$Template.apply(VML.java:230) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:207) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:207) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:206) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:207) org.vexi.core.VML$Static$Template.apply(VML.java:230) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:207) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:207) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:206) org.vexi.core.VML$Static$Template.preapply(VML.java:195) org.vexi.core.VML$Static$Template.apply(VML.java:207) org.vexi.core.VML$Static$Template.apply(VML.java:170) org.vexi.core.Blessing.apply_(Blessing.java:233) org.vexi.core.Blessing.new_(Blessing.java:220) org.vexi.core.Vexi.run(Vexi.java:268) org.ibex.js.Scheduler.run(Scheduler.java:101) org.ibex.js.Scheduler.defaultRun(Scheduler.java:115) org.ibex.js.Scheduler.run(Scheduler.java:96) org.vexi.core.Main.start(Main.java:270) org.vexi.core.Main.start(Main.java:129) org.vexi.core.Main.main(Main.java:64) at org.vexi.lib.text.edit:141 at org.vexi.lib.text.edit:90(apply) at org.vexi.lib.text.default:14(apply) at org.vexi.lib.text.default:13(apply) at org.vexi.lib.text.default:12(apply) at org.vexi.lib.text.default:9(apply) at org.vexi.lib.layout.editbox:8(apply) at org.vexi.theme.classic.tooltip:10(apply) at org.vexi.theme.classic.tooltip:11(apply) at org.vexi.lib.role.tooltipmanager:9(apply) at org.vexi.lib.role.tooltipmanager:8(apply) at vexi.widget.surface:27(apply) at org.vexi.demo.main:9(apply) at org.vexi.demo.main:10(apply) at main:4(apply) java.lang.ArrayIndexOutOfBoundsException: 2147483647 at org.ibex.js.util.Hash.put(Hash.java:137) at org.ibex.js.JS$Obj.putSafe(JS.java:727) at org.ibex.js.JS$Obj.put(JS.java:725) at org.vexi.core.Box.put(Box.java:2890) at org.ibex.js.Interpreter.run(Interpreter.java:400) at org.ibex.js.Interpreter.run(Interpreter.java:140) at org.ibex.js.Scheduler.runInCurrent(Scheduler.java:337) at org.ibex.js.JSFunction.apply(JSFunction.java:52) at org.vexi.core.VML$Static$Template.apply(VML.java:301) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:207) at org.vexi.core.VML$Static$Template.apply(VML.java:230) at org.vexi.core.VML$Static$Template.apply(VML.java:230) at org.vexi.core.VML$Static$Template.apply(VML.java:230) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:207) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:207) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:206) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:207) at org.vexi.core.VML$Static$Template.apply(VML.java:230) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:207) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:207) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:206) at org.vexi.core.VML$Static$Template.preapply(VML.java:195) at org.vexi.core.VML$Static$Template.apply(VML.java:207) at org.vexi.core.VML$Static$Template.apply(VML.java:170) at org.vexi.core.Blessing.apply_(Blessing.java:233) at org.vexi.core.Blessing.new_(Blessing.java:220) at org.vexi.core.Vexi.run(Vexi.java:268) at org.ibex.js.Scheduler.run(Scheduler.java:101) at org.ibex.js.Scheduler.defaultRun(Scheduler.java:115) at org.ibex.js.Scheduler.run(Scheduler.java:96) at org.vexi.core.Main.start(Main.java:270) at org.vexi.core.Main.start(Main.java:129) at org.vexi.core.Main.main(Main.java:64) halting |
From: Mike G. <mik...@ca...> - 2015-04-28 16:35:53
|
To be honest I think it should work ok now. Never got around to integrating the change back. On Tue, Apr 28, 2015 at 1:01 AM, Charles Goodwin <ch...@we...> wrote: > Saw this and was curious why it never made it into the vexi3 branch? > Needed more testing? > > - C <http://www.webenableit.com> > > On 26 May 2013 at 11:24, <mk...@us...> wrote: > >> Revision: 4528 >> http://sourceforge.net/p/vexi/code/4528 >> Author: mkpg2 >> Date: 2013-05-26 10:24:01 +0000 (Sun, 26 May 2013) >> Log Message: >> ----------- >> Improve Memory Performance. >> - Use org.ibex.js.util.Hash instead of java.util.HashMap for js object. >> >> Modified Paths: >> -------------- >> >> branches/vexi4/org.vexi-core.devtools/src/main/java/org/vexi/instrument/memoryhist/MemoryHist.java >> branches/vexi4/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp >> branches/vexi4/org.vexi-library.js/meta/module.xml >> >> branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSArrayLike.java >> branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java >> >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JS.jpp >> >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JSArray.jpp >> >> branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/array/TestArray.java >> >> branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/general/typeof.js >> >> Added Paths: >> ----------- >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/ >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/ >> >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java >> >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java >> >> Property Changed: >> ---------------- >> branches/vexi4/org.vexi-library.js/ >> >> Modified: >> branches/vexi4/org.vexi-core.devtools/src/main/java/org/vexi/instrument/memoryhist/MemoryHist.java >> =================================================================== >> --- >> branches/vexi4/org.vexi-core.devtools/src/main/java/org/vexi/instrument/memoryhist/MemoryHist.java >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ >> branches/vexi4/org.vexi-core.devtools/src/main/java/org/vexi/instrument/memoryhist/MemoryHist.java >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -8,6 +8,7 @@ >> import javax.swing.*; >> >> import org.ibex.js.*; >> +import org.ibex.util.Basket; >> >> // FIXME - move devl js implementation out of here >> public class MemoryHist extends JS.Immutable implements Instr.Memory { >> @@ -58,7 +59,7 @@ >> return s; >> } >> >> - private void hist_inc(SortedMap<Integer,Integer> hist, Map hash){ >> + private void hist_inc(SortedMap<Integer,Integer> hist, Basket.Map >> hash){ >> Integer size = hash==null?0:hash.size(); >> Integer count = hist.get(size); >> if(count==null) count = 0; >> >> Modified: >> branches/vexi4/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp >> =================================================================== >> --- branches/vexi4/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ branches/vexi4/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -3327,5 +3327,5 @@ >> // JSArrayLike >> public JS getElement(int i) throws JSExn { return get(i); } >> public JS[] toArray() throws JSExn { throw new JSExn("Cannot convert >> box to an array"); } >> - public int size() throws JSExn { return >> JSU.toInt(getAndTriggerTraps(SC_numchildren)); } >> + public int length() throws JSExn { return >> JSU.toInt(getAndTriggerTraps(SC_numchildren)); } >> } >> >> Index: branches/vexi4/org.vexi-library.js >> =================================================================== >> --- branches/vexi4/org.vexi-library.js 2013-05-26 10:16:43 UTC (rev 4527) >> +++ branches/vexi4/org.vexi-library.js 2013-05-26 10:24:01 UTC (rev 4528) >> >> Property changes on: branches/vexi4/org.vexi-library.js >> ___________________________________________________________________ >> Modified: svn:ignore >> ## -26,3 +26,105 ## >> release >> >> .configuration >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +old >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> + >> +.configuration >> + >> +gen >> + >> +.classpath >> + >> +.project >> + >> +.settings >> Modified: branches/vexi4/org.vexi-library.js/meta/module.xml >> =================================================================== >> --- branches/vexi4/org.vexi-library.js/meta/module.xml 2013-05-26 >> 10:16:43 UTC (rev 4527) >> +++ branches/vexi4/org.vexi-library.js/meta/module.xml 2013-05-26 >> 10:24:01 UTC (rev 4528) >> @@ -4,6 +4,7 @@ >> <artifact name="jpp.zip" /> >> >> <dependencies> >> + <system name="java.jre" tag="1.5"/> >> <dependency source="local" name="library.value"/> >> <dependency source="local" name="library.net"/> >> <dependency source="local" name="library.io"/> >> >> Modified: >> branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSArrayLike.java >> =================================================================== >> --- >> branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSArrayLike.java >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ >> branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSArrayLike.java >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -3,7 +3,9 @@ >> public interface JSArrayLike extends JS { >> public JS[] toArray() throws JSExn; >> public JS getElement(int i) throws JSExn; >> - public int size() throws JSExn; >> + public int length() throws JSExn; >> + >> + >> static public class Keys extends JS.Keys { >> JSArrayLike keysof; >> public Keys(JSArrayLike obj) { >> @@ -11,15 +13,15 @@ >> this.keysof = obj; >> } >> public boolean hasKey(JS key) throws JSExn { >> - return JSU.isInt(key) && (JSU.toInt(key)< >> keysof.size()); >> + return JSU.isInt(key) && (JSU.toInt(key)< >> keysof.length()); >> } >> public Enumeration iterator() throws JSExn { >> return new Enumeration(null) { >> private int n = 0; >> - public boolean _hasNext() throws JSExn { return n >> < keysof.size(); } >> + public boolean _hasNext() throws JSExn { return n >> < keysof.length(); } >> public JS _next() { return JSU.N(n++); } >> }; >> } >> - public int size() throws JSExn { return keysof.size(); } >> + public int size() throws JSExn { return keysof.length(); } >> } >> } >> >> Modified: >> branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java >> =================================================================== >> --- >> branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ >> branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -166,7 +166,7 @@ >> static public JS constructorsOf(JS arg){ >> JSArray r = new JSArray(); >> if(!(arg instanceof JS.Obj)) return r; >> - for(ConstructorList l = >> ((JS.Obj)arg).constructors;l!=null;l=l.next){ >> + for(ConstructorList l = >> ((JS.Obj)arg).getConstructorList();l!=null;l=l.next){ >> r.add(l.value); >> } >> return r; >> >> Modified: >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp >> =================================================================== >> --- >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -800,7 +800,7 @@ >> } >> public JS.Keys keys() throws JSExn { return new >> JSArrayLike.Keys(this);} >> public JS[] toArray() { return args;} >> - public int size(){ return args.length; } >> + public int length(){ return args.length; } >> } >> >> static class TrapArgs extends JS.Immutable { >> >> Modified: >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JS.jpp >> =================================================================== >> --- branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JS.jpp >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JS.jpp >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -4,7 +4,14 @@ >> >> package org.ibex.js; >> >> -import java.util.*; >> +import java.util.HashSet; >> +import java.util.Iterator; >> +import java.util.List; >> +import java.util.NoSuchElementException; >> +import java.util.Set; >> + >> +import org.ibex.js.util.Hash; >> +import org.ibex.js.util.MetaKey; >> import org.vexi.util.BasicTree; >> >> /*@PAGE(concept=Traps) >> @@ -284,7 +291,7 @@ >> >> /** Returns a 'keys object'. */ >> public JS.Keys keys() throws JSExn; >> - public Set keySet() throws JSExn; >> + public JS[] keysList() throws JSExn; >> >> /** Return the value associated with the given key. */ >> public JS get(JS key) throws JSExn; >> @@ -335,7 +342,7 @@ >> public JS unclone() { return this; } >> >> public Keys keys() throws JSExn { throw new JSExn(type()+" has >> no key set"); } >> - public Set keySet() throws JSExn { throw new JSExn(type()+" has >> no key set"); } >> + public JS[] keysList() throws JSExn { throw new JSExn(type()+" >> has no key set"); } >> public JS get(JS key) throws JSExn { >> //#noswitch - leave, needed for jsdoc >> /*@PAGE(varname=Immutable,humanname=Immutable JS Object) >> @@ -431,12 +438,20 @@ >> this.clonee = (Cloneable)clonee; >> } >> >> + private void addAll(Set s, JS[] arr){ >> + for(JS a: arr) s.add(a); >> + } >> + private Set<JS> asSet(JS[] arr){ >> + Set r = new HashSet(arr.length); >> + addAll(r, arr); >> + return r; >> + } >> public Keys keys() throws JSExn { >> - final Set ourkeys = keySet(); >> + final Set ourkeys = asSet(keysList()); >> final Set allkeys = new HashSet(ourkeys); >> JS c = this.clonee; >> while (true) { >> - allkeys.addAll(c.keySet()); >> + addAll(allkeys, c.keysList()); >> if (c instanceof Clone) c = ((Clone)c).clonee; >> else break; >> } >> @@ -517,30 +532,29 @@ >> >> /** Standard JS object implementation that can store arbitrarily >> named properties >> * and can have traps dynamically placed upon properties. */ >> - public static class Obj implements Cloneable, Copyable { >> + public static class Obj extends Hash implements Cloneable, Copyable { >> static public JS.Constructor Constructor = new >> JS.Constructor("Object") { >> public JS new_(JS[] args) throws JSExn { >> return new JS.Obj(); >> } >> }; >> static public ConstructorList base = new >> ConstructorList(Constructor,null); >> - >> - >> + >> + // contains traps >> + // and meta properties >> + private Hash other = null; >> protected ConstructorList constructors = null; >> - // a map of values against properties stored on this object >> - private Map props = null; >> - // a map of traps against properties stored on this object >> - private Map traps = null; >> >> public Obj() { >> this(base); >> } >> >> public Obj(ConstructorList constructor) { >> - if (Instr.memory!=null) { >> + super(0); >> + if (Instr.memory!=null) { >> Instr.memory.register(this); >> } >> - constructors = constructor; >> + setConstructorList(constructor); >> } >> >> protected void finalize() throws Throwable { >> @@ -548,31 +562,37 @@ >> Instr.memory.unregister(this); >> } >> } >> + public Object getOther(Object key){ >> + if(other==null) return null; >> + return other.get(key); >> + } >> >> - // HACK - neat, but still a hack. At least until the semantics >> are clear >> - // should we mirror, or should it just be a straight copy? >> - //protected Obj mirror() { >> - // if (props==null) props = new HashMap(4); >> - // if (traps==null) traps = new HashMap(4); >> - // Obj r = new Obj(); >> - // r.traps = traps; >> - // r.props = props; >> - // return r; >> - //} >> + public void putOther(Object key, Object obj){ >> + if(other==null){ >> + other = new Hash(1); >> + } >> + other.put(key, obj); >> + } >> >> + >> + public ConstructorList getConstructorList(){ return >> constructors; } >> + private void setConstructorList(ConstructorList cl){ >> constructors = cl; } >> + >> + >> + >> public JS copy() throws JSExn { >> if (getClass()!=Obj.class) { >> throw new JSExn("copy not supported for: >> "+getClass().getName()); >> } >> JS.Obj r = new JS.Obj(); >> - if (traps!=null && traps.size()>0) { >> - Iterator I = traps.keySet().iterator(); >> - while (I.hasNext()) { >> - JS key = (JS)I.next(); >> - Trap t = (Trap) traps.get(key); >> - r.addTrap(key, (JS)t); >> - } >> - } >> +// if (traps!=null && traps.size()>0) { >> +// Iterator I = traps.keySet().iterator(); >> +// while (I.hasNext()) { >> +// JS key = (JS)I.next(); >> +// Trap t = (Trap) traps.get(key); >> +// r.addTrap(key, (JS)t); >> +// } >> +// } >> Enumeration E = keys().iterator(); >> while (E.hasNext()) { >> JS key = E.next(); >> @@ -586,15 +606,15 @@ >> if (getClass()!=Obj.class) { >> throw new JSExn("deepcopy not supported for: >> "+getClass().getName()); >> } >> - if (traps!=null && traps.size()>0) { >> - Iterator I = traps.keySet().iterator(); >> - while (I.hasNext()) { >> - JS key = (JS)I.next(); >> - Trap t = (Trap) traps.get(key); >> - if (t.findRead()!=null) >> - throw new JSExn("cannot deepcopy object >> with read traps: "+JSU.toString(key)); >> - } >> - } >> +// if (traps!=null && traps.size()>0) { >> +// Iterator I = traps.keySet().iterator(); >> +// while (I.hasNext()) { >> +// JS key = (JS)I.next(); >> +// Trap t = (Trap) traps.get(key); >> +// if (t.findRead()!=null) >> +// throw new JSExn("cannot deepcopy object >> with read traps: "+JSU.toString(key)); >> +// } >> +// } >> JS.Obj r = new JS.Obj(); >> Enumeration E = keys().iterator(); >> while (E.hasNext()) { >> @@ -604,10 +624,10 @@ >> } >> return r; >> } >> - public Set keySet() throws JSExn { >> - return props!=null? >> - props.keySet(): >> - new HashSet(); // SHOULD use a constant here >> + public JS[] keysList() throws JSExn { >> + JS[] r = new JS[size()]; >> + listKeys(r); >> + return r; >> } >> public JS unclone() { return this; } >> public String[] getFormalArgs() { return EMPTY_STRING_ARRAY; } >> @@ -624,8 +644,9 @@ >> } >> >> public boolean instanceOf(JS constructor) { >> - // HACK sort this out. Type system based on constructors not >> finalised yet >> - for (ConstructorList cl=constructors; cl!=null; cl=cl.next) { >> + ConstructorList cl = getConstructorList(); >> + // HACK sort this out. Type system based on constructors >> not finalised yet >> + for (; cl!=null; cl=cl.next) { >> if (cl.value==constructor) { >> return true; >> } >> @@ -633,7 +654,8 @@ >> return constructor==this; >> } >> public void addConstructor(JS c) { >> - constructors = new ConstructorList(c,constructors); >> + ConstructorList cl0 = getConstructorList(); >> + setConstructorList(new ConstructorList(c,cl0)); >> } >> >> public Keys keys() throws JSExn { >> @@ -641,7 +663,7 @@ >> public Enumeration iterator() throws JSExn { >> return new Enumeration(null) { >> private int cur = 0; >> - private Object[] keys = >> props==null?EMPTY_JS_ARRAY:props.keySet().toArray(); >> + private Object[] keys = Obj.this.keysList(); >> public boolean _hasNext() { return cur < >> keys.length; } >> public JS _next() throws JSExn { >> if (cur >= keys.length) { >> @@ -696,62 +718,42 @@ >> * */ >> return getSafe(key); >> } >> - final public JS getSafe(JS key) { // workaround, avoid JSExn in >> signature >> - if (props==null) { >> - return null; >> - } >> - return (JS)props.get(key); >> + final public JS getSafe(JS key) { // workaround, avoid JSExn in >> signature >> + return (JS)super.get(key); >> } >> >> /** Store a value against a key on the object. */ >> public void put(JS key, JS value) throws JSExn { putSafe(key, >> value); } >> public void putSafe(JS key, JS value) { // workaround, avoid >> JSExn in signature >> - // FEATURE: MEMORY OPTIMIZE? >> - // if (props==null) props = new SmallMap(); >> - // else if (props.size()>4) props = new HashMap(props); >> - if (props==null) { >> - props = new HashMap(4); >> - } >> - props.put(key, value); >> + super.put(key, value); >> } >> >> protected boolean hasKey(JS key) { >> // SHOULD decide, do trapped properties have keys? >> Perhaps needs some >> // mechanism, e.g. setting a property on the trap >> function. >> - if (props==null) return false; >> - return props.containsKey(key); >> + return super.containsKey(key); >> } >> >> /** Removes a key and any value associated with it. */ >> protected void remove(JS key) { >> - if (props==null) return; >> - props.remove(key); >> + super.remove(key); >> } >> >> - private int size() { return props==null ? 0 : props.size(); } >> - >> /** Gets a trap for the given key */ >> public Trap getTrap(JS key) { >> - if (traps==null) { >> - return null; >> - } >> - return (Trap)traps.get(key); >> + return (Trap)getOther(key); >> } >> >> /** Places a trap on the given key. */ >> public void putTrap(JS key, Trap t) { >> - // FEATURE: MEMORY OPTIMIZE? >> - // if (traps==null) traps = new SmallMap(); >> - // else if(traps.size()>4) traps = new HashMap(traps); >> - if (traps==null) traps = new HashMap(4); >> - traps.put(key, t); >> + putOther(key, t); >> } >> >> /** Places the given function as a trap on the given key, first >> validating the function. */ >> public void addTrap(JS key, JS f) throws JSExn { >> TrapHolder.validateFunction(f); >> // ensure a trap is only be applied once to an object >> - Trap t0 = traps==null?null:(Trap)traps.get(key); >> + Trap t0 = getTrap(key); >> for (Trap t=t0; t != null; t = t.next()) { >> // REMARK: we are only interested in this JS object >> // although other JS implementations may cause trap >> @@ -766,7 +768,7 @@ >> /** Removes the trap represented by the given function from the >> given key. >> * If there is no trap represented by the function for the key, >> it does nothing */ >> public void delTrap(JS key, JS f) throws JSExn { >> - Trap t = traps==null?null:(Trap)traps.get(key); >> + Trap t = getTrap(key); >> if (t==null) { >> return; >> } >> @@ -775,7 +777,7 @@ >> t = t.next(); >> // no traps left on this object >> if (t==null || !t.target().equals(this)) { >> - traps.remove(key); >> + other.remove(key); >> } else { >> putTrap(key, t); >> } >> @@ -795,8 +797,9 @@ >> } >> >> private String stringPrefix(){ >> - if(constructors==null) return "object"; >> - String r = JSU.toString(constructors.value); >> + ConstructorList cl = getConstructorList(); >> + if(cl==null) return "object"; >> + String r = JSU.toString(cl.value); >> if(r.lastIndexOf("$")!=-1){ >> r = r.substring(0,r.lastIndexOf("$")); >> } >> @@ -813,8 +816,8 @@ >> return stringPrefix()+ "$" + Integer.toHexString(hashCode()); >> } >> >> - public Map getPropsMap() { return traps; } >> - public Map getTrapsMap() { return props; } >> + public Map getPropsMap() { return this; } >> + public Map getTrapsMap() { return other; } >> } >> >> /** An implementation of JS that supports a meta trap on all >> properties */ >> @@ -1141,7 +1144,7 @@ >> } >> >> public JS getElement(int i) throws JSExn { return get(JSU.N(i)); >> } >> - public int size() throws JSExn { return bt.treeSize(); } >> + public int length() throws JSExn { return bt.treeSize(); } >> >> public JS[] toArray() throws JSExn { throw new JSExn("Cannot >> convert proxylist to an array"); } >> public JS.Keys keys() throws JSExn { return new >> JSArrayLike.Keys(this); } >> >> Modified: >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JSArray.jpp >> =================================================================== >> --- >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JSArray.jpp >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ >> branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JSArray.jpp >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -25,7 +25,7 @@ >> public JS type() { return SC_array; } >> public JS unclone() { return this; } >> public JS.Keys keys() throws JSExn { return new >> JSArrayLike.Keys(this); } >> - public Set keySet() throws JSExn { throw new RuntimeException("!"); } >> + public JS[] keysList() throws JSExn { throw new >> RuntimeException("!"); } >> public boolean isTruthy(){ return true; } >> >> public JS get(JS key) throws JSExn { >> @@ -245,7 +245,7 @@ >> } >> >> private void concat_fill(JSArrayLike arr) throws JSExn { >> - for (int i=0; i<arr.size(); i++) { >> + for (int i=0; i<arr.length(); i++) { >> add(arr.getElement(i)); >> } >> } >> @@ -275,7 +275,7 @@ >> throw new JSExn("Arg "+i+" not an []"); >> } >> JSArrayLike a = ((JSArrayLike)args[i]); >> - l += a.size(); >> + l += a.length(); >> } >> JSArray r = new JSArray(l); >> r.concat_fill(this); >> @@ -372,6 +372,7 @@ >> return r; >> } >> >> + public int length(){ return size(); } >> public JS getElement(int i) throws JSExn { return (JS) get(i); } >> public JS[] toArray() { >> JS[] r = new JS[size()]; >> >> Added: >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java >> =================================================================== >> --- >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java >> (rev 0) >> +++ >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -0,0 +1,42 @@ >> +package poke.hash; >> + >> +import java.util.HashMap; >> +import java.util.Map; >> + >> +public class PokeQuadraticProbing { >> + static void scan(int n){ >> + System.err.println("-------"+n+"---------"); >> + for(int hash=0; hash<n; hash++){ >> + int probe=hash; >> + int inc=1; >> + Map visited = new HashMap(n); >> + int counter =0; >> + while(true){ >> + if(visited.get(probe)!=null){ >> + break; >> + } >> + >> + visited.put(probe, counter++); >> + >> + probe = probe + inc % n; >> + inc = inc + 1; >> + } >> + >> + System.err.println(visited.size()); >> + } >> + >> + >> + } >> + >> + static void run(){ >> + int size = 2; >> + for(int i=0; i<10; i++){ >> + scan(size); >> + size = size*2; >> + } >> + } >> + >> + static public void main(String[] args) { >> + run(); >> + } >> +} >> >> >> Property changes on: >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java >> ___________________________________________________________________ >> Added: svn:mime-type >> ## -0,0 +1 ## >> +text/plain >> \ No newline at end of property >> Added: >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java >> =================================================================== >> --- >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java >> (rev 0) >> +++ >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -0,0 +1,29 @@ >> +package poke.hash; >> + >> +import java.util.HashMap; >> +import java.util.Random; >> + >> +import org.ibex.js.util.Hash; >> +import static junit.framework.Assert.*; >> +public class StressTestHash { >> + static public void main(String[] args) { >> + stressFill(); >> + } >> + static public void stressFill(){ >> + System.err.println("-- Stress Fill Hash --"); >> + HashMap expected = new HashMap(); >> + Hash hash = new Hash(); >> + >> + Random rand = new Random(); >> + for(int i=0; i<1000000; i++){ >> + Integer key = rand.nextInt(100000); >> + Object value = key; >> + >> + expected.put(key, value); >> + hash.put(key, value); >> + } >> + System.err.println(hash.size()); >> + assertEquals(expected.size(), hash.size()); >> + >> + } >> +} >> >> >> Property changes on: >> branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java >> ___________________________________________________________________ >> Added: svn:mime-type >> ## -0,0 +1 ## >> +text/plain >> \ No newline at end of property >> Modified: >> branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/array/TestArray.java >> =================================================================== >> --- >> branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/array/TestArray.java >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ >> branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/array/TestArray.java >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -15,7 +15,7 @@ >> >> public static void main(String[] args) throws Throwable { >> JSTestSuite jts = new JSTestSuite(TestArray.class); >> - TestCase t = jts.createTestCase(jts.getResourceDirs(), >> "array_index.js"); >> + TestCase t = jts.createTestCase(jts.getResourceDirs(), >> "wierd_sort.js"); >> t.runBare(); >> } >> } >> >> Modified: >> branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/general/typeof.js >> =================================================================== >> --- >> branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/general/typeof.js >> 2013-05-26 10:16:43 UTC (rev 4527) >> +++ >> branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/general/typeof.js >> 2013-05-26 10:24:01 UTC (rev 4528) >> @@ -18,8 +18,6 @@ >> var c = true; >> assert(typeof(c)=="boolean"); >> >> -var d = sys.date(); >> -assert(typeof(d)=="date"); >> >> try{throw "foo"; >> }catch(d){ >> >> This was sent by the SourceForge.net collaborative development platform, >> the world's largest Open Source development site. >> >> >> >> ------------------------------------------------------------------------------ >> Try New Relic Now & We'll Send You this Cool Shirt >> New Relic is the only SaaS-based application performance monitoring >> service >> that delivers powerful full stack analytics. Optimize and monitor your >> browser, app, & servers with just a few lines of code. Try New Relic >> and get this awesome Nerd Life shirt! >> http://p.sf.net/sfu/newrelic_d2d_may >> _______________________________________________ >> Vexi-svn mailing list >> Vex...@li... >> https://lists.sourceforge.net/lists/listinfo/vexi-svn >> > > > > ------------------------------------------------------------------------------ > 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-core mailing list > Vex...@li... > https://lists.sourceforge.net/lists/listinfo/vexi-core > > |
From: Charles G. <ch...@we...> - 2015-04-28 00:01:45
|
Saw this and was curious why it never made it into the vexi3 branch? Needed more testing? - C <http://www.webenableit.com> On 26 May 2013 at 11:24, <mk...@us...> wrote: > Revision: 4528 > http://sourceforge.net/p/vexi/code/4528 > Author: mkpg2 > Date: 2013-05-26 10:24:01 +0000 (Sun, 26 May 2013) > Log Message: > ----------- > Improve Memory Performance. > - Use org.ibex.js.util.Hash instead of java.util.HashMap for js object. > > Modified Paths: > -------------- > > branches/vexi4/org.vexi-core.devtools/src/main/java/org/vexi/instrument/memoryhist/MemoryHist.java > branches/vexi4/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp > branches/vexi4/org.vexi-library.js/meta/module.xml > > branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSArrayLike.java > branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java > > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JS.jpp > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JSArray.jpp > > branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/array/TestArray.java > > branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/general/typeof.js > > Added Paths: > ----------- > branches/vexi4/org.vexi-library.js/src/poke/java/poke/ > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/ > > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java > > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java > > Property Changed: > ---------------- > branches/vexi4/org.vexi-library.js/ > > Modified: > branches/vexi4/org.vexi-core.devtools/src/main/java/org/vexi/instrument/memoryhist/MemoryHist.java > =================================================================== > --- > branches/vexi4/org.vexi-core.devtools/src/main/java/org/vexi/instrument/memoryhist/MemoryHist.java > 2013-05-26 10:16:43 UTC (rev 4527) > +++ > branches/vexi4/org.vexi-core.devtools/src/main/java/org/vexi/instrument/memoryhist/MemoryHist.java > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -8,6 +8,7 @@ > import javax.swing.*; > > import org.ibex.js.*; > +import org.ibex.util.Basket; > > // FIXME - move devl js implementation out of here > public class MemoryHist extends JS.Immutable implements Instr.Memory { > @@ -58,7 +59,7 @@ > return s; > } > > - private void hist_inc(SortedMap<Integer,Integer> hist, Map hash){ > + private void hist_inc(SortedMap<Integer,Integer> hist, Basket.Map > hash){ > Integer size = hash==null?0:hash.size(); > Integer count = hist.get(size); > if(count==null) count = 0; > > Modified: > branches/vexi4/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp > =================================================================== > --- branches/vexi4/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp > 2013-05-26 10:16:43 UTC (rev 4527) > +++ branches/vexi4/org.vexi-core.main/src/main/jpp/org/vexi/core/Box.jpp > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -3327,5 +3327,5 @@ > // JSArrayLike > public JS getElement(int i) throws JSExn { return get(i); } > public JS[] toArray() throws JSExn { throw new JSExn("Cannot convert > box to an array"); } > - public int size() throws JSExn { return > JSU.toInt(getAndTriggerTraps(SC_numchildren)); } > + public int length() throws JSExn { return > JSU.toInt(getAndTriggerTraps(SC_numchildren)); } > } > > Index: branches/vexi4/org.vexi-library.js > =================================================================== > --- branches/vexi4/org.vexi-library.js 2013-05-26 10:16:43 UTC (rev 4527) > +++ branches/vexi4/org.vexi-library.js 2013-05-26 10:24:01 UTC (rev 4528) > > Property changes on: branches/vexi4/org.vexi-library.js > ___________________________________________________________________ > Modified: svn:ignore > ## -26,3 +26,105 ## > release > > .configuration > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +old > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > + > +.configuration > + > +gen > + > +.classpath > + > +.project > + > +.settings > Modified: branches/vexi4/org.vexi-library.js/meta/module.xml > =================================================================== > --- branches/vexi4/org.vexi-library.js/meta/module.xml 2013-05-26 > 10:16:43 UTC (rev 4527) > +++ branches/vexi4/org.vexi-library.js/meta/module.xml 2013-05-26 > 10:24:01 UTC (rev 4528) > @@ -4,6 +4,7 @@ > <artifact name="jpp.zip" /> > > <dependencies> > + <system name="java.jre" tag="1.5"/> > <dependency source="local" name="library.value"/> > <dependency source="local" name="library.net"/> > <dependency source="local" name="library.io"/> > > Modified: > branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSArrayLike.java > =================================================================== > --- > branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSArrayLike.java > 2013-05-26 10:16:43 UTC (rev 4527) > +++ > branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSArrayLike.java > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -3,7 +3,9 @@ > public interface JSArrayLike extends JS { > public JS[] toArray() throws JSExn; > public JS getElement(int i) throws JSExn; > - public int size() throws JSExn; > + public int length() throws JSExn; > + > + > static public class Keys extends JS.Keys { > JSArrayLike keysof; > public Keys(JSArrayLike obj) { > @@ -11,15 +13,15 @@ > this.keysof = obj; > } > public boolean hasKey(JS key) throws JSExn { > - return JSU.isInt(key) && (JSU.toInt(key)< > keysof.size()); > + return JSU.isInt(key) && (JSU.toInt(key)< > keysof.length()); > } > public Enumeration iterator() throws JSExn { > return new Enumeration(null) { > private int n = 0; > - public boolean _hasNext() throws JSExn { return n > < keysof.size(); } > + public boolean _hasNext() throws JSExn { return n > < keysof.length(); } > public JS _next() { return JSU.N(n++); } > }; > } > - public int size() throws JSExn { return keysof.size(); } > + public int size() throws JSExn { return keysof.length(); } > } > } > > Modified: > branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java > =================================================================== > --- branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java > 2013-05-26 10:16:43 UTC (rev 4527) > +++ branches/vexi4/org.vexi-library.js/src/main/java/org/ibex/js/JSU.java > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -166,7 +166,7 @@ > static public JS constructorsOf(JS arg){ > JSArray r = new JSArray(); > if(!(arg instanceof JS.Obj)) return r; > - for(ConstructorList l = > ((JS.Obj)arg).constructors;l!=null;l=l.next){ > + for(ConstructorList l = > ((JS.Obj)arg).getConstructorList();l!=null;l=l.next){ > r.add(l.value); > } > return r; > > Modified: > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp > =================================================================== > --- > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp > 2013-05-26 10:16:43 UTC (rev 4527) > +++ > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/Interpreter.jpp > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -800,7 +800,7 @@ > } > public JS.Keys keys() throws JSExn { return new > JSArrayLike.Keys(this);} > public JS[] toArray() { return args;} > - public int size(){ return args.length; } > + public int length(){ return args.length; } > } > > static class TrapArgs extends JS.Immutable { > > Modified: > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JS.jpp > =================================================================== > --- branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JS.jpp > 2013-05-26 10:16:43 UTC (rev 4527) > +++ branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JS.jpp > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -4,7 +4,14 @@ > > package org.ibex.js; > > -import java.util.*; > +import java.util.HashSet; > +import java.util.Iterator; > +import java.util.List; > +import java.util.NoSuchElementException; > +import java.util.Set; > + > +import org.ibex.js.util.Hash; > +import org.ibex.js.util.MetaKey; > import org.vexi.util.BasicTree; > > /*@PAGE(concept=Traps) > @@ -284,7 +291,7 @@ > > /** Returns a 'keys object'. */ > public JS.Keys keys() throws JSExn; > - public Set keySet() throws JSExn; > + public JS[] keysList() throws JSExn; > > /** Return the value associated with the given key. */ > public JS get(JS key) throws JSExn; > @@ -335,7 +342,7 @@ > public JS unclone() { return this; } > > public Keys keys() throws JSExn { throw new JSExn(type()+" has no > key set"); } > - public Set keySet() throws JSExn { throw new JSExn(type()+" has > no key set"); } > + public JS[] keysList() throws JSExn { throw new JSExn(type()+" > has no key set"); } > public JS get(JS key) throws JSExn { > //#noswitch - leave, needed for jsdoc > /*@PAGE(varname=Immutable,humanname=Immutable JS Object) > @@ -431,12 +438,20 @@ > this.clonee = (Cloneable)clonee; > } > > + private void addAll(Set s, JS[] arr){ > + for(JS a: arr) s.add(a); > + } > + private Set<JS> asSet(JS[] arr){ > + Set r = new HashSet(arr.length); > + addAll(r, arr); > + return r; > + } > public Keys keys() throws JSExn { > - final Set ourkeys = keySet(); > + final Set ourkeys = asSet(keysList()); > final Set allkeys = new HashSet(ourkeys); > JS c = this.clonee; > while (true) { > - allkeys.addAll(c.keySet()); > + addAll(allkeys, c.keysList()); > if (c instanceof Clone) c = ((Clone)c).clonee; > else break; > } > @@ -517,30 +532,29 @@ > > /** Standard JS object implementation that can store arbitrarily > named properties > * and can have traps dynamically placed upon properties. */ > - public static class Obj implements Cloneable, Copyable { > + public static class Obj extends Hash implements Cloneable, Copyable { > static public JS.Constructor Constructor = new > JS.Constructor("Object") { > public JS new_(JS[] args) throws JSExn { > return new JS.Obj(); > } > }; > static public ConstructorList base = new > ConstructorList(Constructor,null); > - > - > + > + // contains traps > + // and meta properties > + private Hash other = null; > protected ConstructorList constructors = null; > - // a map of values against properties stored on this object > - private Map props = null; > - // a map of traps against properties stored on this object > - private Map traps = null; > > public Obj() { > this(base); > } > > public Obj(ConstructorList constructor) { > - if (Instr.memory!=null) { > + super(0); > + if (Instr.memory!=null) { > Instr.memory.register(this); > } > - constructors = constructor; > + setConstructorList(constructor); > } > > protected void finalize() throws Throwable { > @@ -548,31 +562,37 @@ > Instr.memory.unregister(this); > } > } > + public Object getOther(Object key){ > + if(other==null) return null; > + return other.get(key); > + } > > - // HACK - neat, but still a hack. At least until the semantics > are clear > - // should we mirror, or should it just be a straight copy? > - //protected Obj mirror() { > - // if (props==null) props = new HashMap(4); > - // if (traps==null) traps = new HashMap(4); > - // Obj r = new Obj(); > - // r.traps = traps; > - // r.props = props; > - // return r; > - //} > + public void putOther(Object key, Object obj){ > + if(other==null){ > + other = new Hash(1); > + } > + other.put(key, obj); > + } > > + > + public ConstructorList getConstructorList(){ return constructors; > } > + private void setConstructorList(ConstructorList cl){ constructors > = cl; } > + > + > + > public JS copy() throws JSExn { > if (getClass()!=Obj.class) { > throw new JSExn("copy not supported for: > "+getClass().getName()); > } > JS.Obj r = new JS.Obj(); > - if (traps!=null && traps.size()>0) { > - Iterator I = traps.keySet().iterator(); > - while (I.hasNext()) { > - JS key = (JS)I.next(); > - Trap t = (Trap) traps.get(key); > - r.addTrap(key, (JS)t); > - } > - } > +// if (traps!=null && traps.size()>0) { > +// Iterator I = traps.keySet().iterator(); > +// while (I.hasNext()) { > +// JS key = (JS)I.next(); > +// Trap t = (Trap) traps.get(key); > +// r.addTrap(key, (JS)t); > +// } > +// } > Enumeration E = keys().iterator(); > while (E.hasNext()) { > JS key = E.next(); > @@ -586,15 +606,15 @@ > if (getClass()!=Obj.class) { > throw new JSExn("deepcopy not supported for: > "+getClass().getName()); > } > - if (traps!=null && traps.size()>0) { > - Iterator I = traps.keySet().iterator(); > - while (I.hasNext()) { > - JS key = (JS)I.next(); > - Trap t = (Trap) traps.get(key); > - if (t.findRead()!=null) > - throw new JSExn("cannot deepcopy object > with read traps: "+JSU.toString(key)); > - } > - } > +// if (traps!=null && traps.size()>0) { > +// Iterator I = traps.keySet().iterator(); > +// while (I.hasNext()) { > +// JS key = (JS)I.next(); > +// Trap t = (Trap) traps.get(key); > +// if (t.findRead()!=null) > +// throw new JSExn("cannot deepcopy object > with read traps: "+JSU.toString(key)); > +// } > +// } > JS.Obj r = new JS.Obj(); > Enumeration E = keys().iterator(); > while (E.hasNext()) { > @@ -604,10 +624,10 @@ > } > return r; > } > - public Set keySet() throws JSExn { > - return props!=null? > - props.keySet(): > - new HashSet(); // SHOULD use a constant here > + public JS[] keysList() throws JSExn { > + JS[] r = new JS[size()]; > + listKeys(r); > + return r; > } > public JS unclone() { return this; } > public String[] getFormalArgs() { return EMPTY_STRING_ARRAY; } > @@ -624,8 +644,9 @@ > } > > public boolean instanceOf(JS constructor) { > - // HACK sort this out. Type system based on constructors not > finalised yet > - for (ConstructorList cl=constructors; cl!=null; cl=cl.next) { > + ConstructorList cl = getConstructorList(); > + // HACK sort this out. Type system based on constructors > not finalised yet > + for (; cl!=null; cl=cl.next) { > if (cl.value==constructor) { > return true; > } > @@ -633,7 +654,8 @@ > return constructor==this; > } > public void addConstructor(JS c) { > - constructors = new ConstructorList(c,constructors); > + ConstructorList cl0 = getConstructorList(); > + setConstructorList(new ConstructorList(c,cl0)); > } > > public Keys keys() throws JSExn { > @@ -641,7 +663,7 @@ > public Enumeration iterator() throws JSExn { > return new Enumeration(null) { > private int cur = 0; > - private Object[] keys = > props==null?EMPTY_JS_ARRAY:props.keySet().toArray(); > + private Object[] keys = Obj.this.keysList(); > public boolean _hasNext() { return cur < > keys.length; } > public JS _next() throws JSExn { > if (cur >= keys.length) { > @@ -696,62 +718,42 @@ > * */ > return getSafe(key); > } > - final public JS getSafe(JS key) { // workaround, avoid JSExn in > signature > - if (props==null) { > - return null; > - } > - return (JS)props.get(key); > + final public JS getSafe(JS key) { // workaround, avoid JSExn in > signature > + return (JS)super.get(key); > } > > /** Store a value against a key on the object. */ > public void put(JS key, JS value) throws JSExn { putSafe(key, > value); } > public void putSafe(JS key, JS value) { // workaround, avoid > JSExn in signature > - // FEATURE: MEMORY OPTIMIZE? > - // if (props==null) props = new SmallMap(); > - // else if (props.size()>4) props = new HashMap(props); > - if (props==null) { > - props = new HashMap(4); > - } > - props.put(key, value); > + super.put(key, value); > } > > protected boolean hasKey(JS key) { > // SHOULD decide, do trapped properties have keys? Perhaps > needs some > // mechanism, e.g. setting a property on the trap function. > - if (props==null) return false; > - return props.containsKey(key); > + return super.containsKey(key); > } > > /** Removes a key and any value associated with it. */ > protected void remove(JS key) { > - if (props==null) return; > - props.remove(key); > + super.remove(key); > } > > - private int size() { return props==null ? 0 : props.size(); } > - > /** Gets a trap for the given key */ > public Trap getTrap(JS key) { > - if (traps==null) { > - return null; > - } > - return (Trap)traps.get(key); > + return (Trap)getOther(key); > } > > /** Places a trap on the given key. */ > public void putTrap(JS key, Trap t) { > - // FEATURE: MEMORY OPTIMIZE? > - // if (traps==null) traps = new SmallMap(); > - // else if(traps.size()>4) traps = new HashMap(traps); > - if (traps==null) traps = new HashMap(4); > - traps.put(key, t); > + putOther(key, t); > } > > /** Places the given function as a trap on the given key, first > validating the function. */ > public void addTrap(JS key, JS f) throws JSExn { > TrapHolder.validateFunction(f); > // ensure a trap is only be applied once to an object > - Trap t0 = traps==null?null:(Trap)traps.get(key); > + Trap t0 = getTrap(key); > for (Trap t=t0; t != null; t = t.next()) { > // REMARK: we are only interested in this JS object > // although other JS implementations may cause trap > @@ -766,7 +768,7 @@ > /** Removes the trap represented by the given function from the > given key. > * If there is no trap represented by the function for the key, > it does nothing */ > public void delTrap(JS key, JS f) throws JSExn { > - Trap t = traps==null?null:(Trap)traps.get(key); > + Trap t = getTrap(key); > if (t==null) { > return; > } > @@ -775,7 +777,7 @@ > t = t.next(); > // no traps left on this object > if (t==null || !t.target().equals(this)) { > - traps.remove(key); > + other.remove(key); > } else { > putTrap(key, t); > } > @@ -795,8 +797,9 @@ > } > > private String stringPrefix(){ > - if(constructors==null) return "object"; > - String r = JSU.toString(constructors.value); > + ConstructorList cl = getConstructorList(); > + if(cl==null) return "object"; > + String r = JSU.toString(cl.value); > if(r.lastIndexOf("$")!=-1){ > r = r.substring(0,r.lastIndexOf("$")); > } > @@ -813,8 +816,8 @@ > return stringPrefix()+ "$" + Integer.toHexString(hashCode()); > } > > - public Map getPropsMap() { return traps; } > - public Map getTrapsMap() { return props; } > + public Map getPropsMap() { return this; } > + public Map getTrapsMap() { return other; } > } > > /** An implementation of JS that supports a meta trap on all > properties */ > @@ -1141,7 +1144,7 @@ > } > > public JS getElement(int i) throws JSExn { return get(JSU.N(i)); } > - public int size() throws JSExn { return bt.treeSize(); } > + public int length() throws JSExn { return bt.treeSize(); } > > public JS[] toArray() throws JSExn { throw new JSExn("Cannot > convert proxylist to an array"); } > public JS.Keys keys() throws JSExn { return new > JSArrayLike.Keys(this); } > > Modified: > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JSArray.jpp > =================================================================== > --- > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JSArray.jpp > 2013-05-26 10:16:43 UTC (rev 4527) > +++ > branches/vexi4/org.vexi-library.js/src/main/jpp/org/ibex/js/JSArray.jpp > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -25,7 +25,7 @@ > public JS type() { return SC_array; } > public JS unclone() { return this; } > public JS.Keys keys() throws JSExn { return new > JSArrayLike.Keys(this); } > - public Set keySet() throws JSExn { throw new RuntimeException("!"); } > + public JS[] keysList() throws JSExn { throw new > RuntimeException("!"); } > public boolean isTruthy(){ return true; } > > public JS get(JS key) throws JSExn { > @@ -245,7 +245,7 @@ > } > > private void concat_fill(JSArrayLike arr) throws JSExn { > - for (int i=0; i<arr.size(); i++) { > + for (int i=0; i<arr.length(); i++) { > add(arr.getElement(i)); > } > } > @@ -275,7 +275,7 @@ > throw new JSExn("Arg "+i+" not an []"); > } > JSArrayLike a = ((JSArrayLike)args[i]); > - l += a.size(); > + l += a.length(); > } > JSArray r = new JSArray(l); > r.concat_fill(this); > @@ -372,6 +372,7 @@ > return r; > } > > + public int length(){ return size(); } > public JS getElement(int i) throws JSExn { return (JS) get(i); } > public JS[] toArray() { > JS[] r = new JS[size()]; > > Added: > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java > =================================================================== > --- > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java > (rev 0) > +++ > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -0,0 +1,42 @@ > +package poke.hash; > + > +import java.util.HashMap; > +import java.util.Map; > + > +public class PokeQuadraticProbing { > + static void scan(int n){ > + System.err.println("-------"+n+"---------"); > + for(int hash=0; hash<n; hash++){ > + int probe=hash; > + int inc=1; > + Map visited = new HashMap(n); > + int counter =0; > + while(true){ > + if(visited.get(probe)!=null){ > + break; > + } > + > + visited.put(probe, counter++); > + > + probe = probe + inc % n; > + inc = inc + 1; > + } > + > + System.err.println(visited.size()); > + } > + > + > + } > + > + static void run(){ > + int size = 2; > + for(int i=0; i<10; i++){ > + scan(size); > + size = size*2; > + } > + } > + > + static public void main(String[] args) { > + run(); > + } > +} > > > Property changes on: > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/PokeQuadraticProbing.java > ___________________________________________________________________ > Added: svn:mime-type > ## -0,0 +1 ## > +text/plain > \ No newline at end of property > Added: > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java > =================================================================== > --- > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java > (rev 0) > +++ > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -0,0 +1,29 @@ > +package poke.hash; > + > +import java.util.HashMap; > +import java.util.Random; > + > +import org.ibex.js.util.Hash; > +import static junit.framework.Assert.*; > +public class StressTestHash { > + static public void main(String[] args) { > + stressFill(); > + } > + static public void stressFill(){ > + System.err.println("-- Stress Fill Hash --"); > + HashMap expected = new HashMap(); > + Hash hash = new Hash(); > + > + Random rand = new Random(); > + for(int i=0; i<1000000; i++){ > + Integer key = rand.nextInt(100000); > + Object value = key; > + > + expected.put(key, value); > + hash.put(key, value); > + } > + System.err.println(hash.size()); > + assertEquals(expected.size(), hash.size()); > + > + } > +} > > > Property changes on: > branches/vexi4/org.vexi-library.js/src/poke/java/poke/hash/StressTestHash.java > ___________________________________________________________________ > Added: svn:mime-type > ## -0,0 +1 ## > +text/plain > \ No newline at end of property > Modified: > branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/array/TestArray.java > =================================================================== > --- > branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/array/TestArray.java > 2013-05-26 10:16:43 UTC (rev 4527) > +++ > branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/array/TestArray.java > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -15,7 +15,7 @@ > > public static void main(String[] args) throws Throwable { > JSTestSuite jts = new JSTestSuite(TestArray.class); > - TestCase t = jts.createTestCase(jts.getResourceDirs(), > "array_index.js"); > + TestCase t = jts.createTestCase(jts.getResourceDirs(), > "wierd_sort.js"); > t.runBare(); > } > } > > Modified: > branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/general/typeof.js > =================================================================== > --- > branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/general/typeof.js > 2013-05-26 10:16:43 UTC (rev 4527) > +++ > branches/vexi4/org.vexi-library.js/src/test/java/test/js/exec/general/typeof.js > 2013-05-26 10:24:01 UTC (rev 4528) > @@ -18,8 +18,6 @@ > var c = true; > assert(typeof(c)=="boolean"); > > -var d = sys.date(); > -assert(typeof(d)=="date"); > > try{throw "foo"; > }catch(d){ > > This was sent by the SourceForge.net collaborative development platform, > the world's largest Open Source development site. > > > > ------------------------------------------------------------------------------ > Try New Relic Now & We'll Send You this Cool Shirt > New Relic is the only SaaS-based application performance monitoring service > that delivers powerful full stack analytics. Optimize and monitor your > browser, app, & servers with just a few lines of code. Try New Relic > and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may > _______________________________________________ > Vexi-svn mailing list > Vex...@li... > https://lists.sourceforge.net/lists/listinfo/vexi-svn > |
From: Charles G. <ch...@we...> - 2015-04-24 16:42:22
|
https://bitbucket.org/robeden/trove/ Perhaps something we could use to make Vexi less top heavy. - C GNU Trove: High performance collections for Java. The GNU Trove library has two objectives: 1. Provide "free" (as in "free speech" and "free beer"), fast, lightweight implementations of the java.util Collections API. These implementations are designed to be pluggable replacements for their JDK equivalents. 2. Whenever possible, provide the same collections support for primitive types. This gap in the JDK is often addressed by using the "wrapper" classes (java.lang.Integer, java.lang.Float, etc.) with Object-based collections. For most applications, however, collections which store primitives directly will require less space and yield significant performance gains. <http://www.webenableit.com> |
From: Charles G. <ch...@we...> - 2015-04-11 07:52:52
|
It seems my using Gmail's inbox layouts has meant I missed the notifications from Nabble that our forum was scheduled to be deleted. As nice as Nabble was, I guess that's just something we can't have. I'll look in to an alternative. I do have a back up, but it's not really any use to us (just an SQL dump). Regards, Charles Goodwin Web Enable IT Ltd Mobile: +44 777 3013221 Phone: +44 845 3880685 Web: www.webenableit.com |
From: Charlie <cha...@gm...> - 2014-06-26 11:04:33
|
Been looking into getting underlined text; it seems that position/width hints are returnable from the font file via freetype but it must be drawn manually. Source: http://www.freetype.org/freetype1/docs/faq/freetype1.txt Underlining and stroking, are not really part of the glyphs. They're simply lines that are printed on the glyph after it has been rendered. Each TrueType file provides, in its OS/2 table, which is accessible through the face object properties in FreeType, several values that define the position and width of those lines, in notional font units. If you want to use them, you'll have to scale these values to your current instance/point size, then draw the lines yourself. These values seem to be available from the font's "global design metrics" and are called ' underline_position ' (relative to the baseline/bottom - negative is below) and ' underline_thickness '. It seems we need to modify the core to expose these values. Source: http://www.freetype.org/freetype2/docs/tutorial/step2.html - C |
From: Mike G. <mik...@ca...> - 2014-05-24 10:56:47
|
Good catch. On Sat, May 24, 2014 at 1:02 AM, <jef...@us...> wrote: > Revision: 4700 > http://sourceforge.net/p/vexi/code/4700 > Author: jeffbuhrt > Date: 2014-05-24 00:02:26 +0000 (Sat, 24 May 2014) > Log Message: > ----------- > Fixes memory leak in new widgets due to typo > > Modified Paths: > -------------- > > branches/vexi3/org.vexi-vexi.widgets/src_main/org/vexi/lib/widget/tabpane.t > > Modified: > branches/vexi3/org.vexi-vexi.widgets/src_main/org/vexi/lib/widget/tabpane.t > =================================================================== > --- > branches/vexi3/org.vexi-vexi.widgets/src_main/org/vexi/lib/widget/tabpane.t > 2014-05-23 23:58:35 UTC (rev 4699) > +++ > branches/vexi3/org.vexi-vexi.widgets/src_main/org/vexi/lib/widget/tabpane.t > 2014-05-24 00:02:26 UTC (rev 4700) > @@ -106,7 +106,7 @@ > th_headwrap.width --= tabScrollPolicy; > th_head.width --= tabScrollPolicy; > show --= tabScrollPolicy; > - v_content.Chdilren --= tabListPolicy; > + v_content.Children --= tabListPolicy; > break; > case "scroll": > throw "not implemented"; > > This was sent by the SourceForge.net collaborative development platform, > the world's largest Open Source development site. > > > > ------------------------------------------------------------------------------ > "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE > Instantly run your Selenium tests across 300+ browser/OS combos. > Get unparalleled scalability from the best Selenium testing platform > available > Simple to use. Nothing to install. Get started now for free." > http://p.sf.net/sfu/SauceLabs > _______________________________________________ > Vexi-svn mailing list > Vex...@li... > https://lists.sourceforge.net/lists/listinfo/vexi-svn > |