diff --git a/sources/net.sf.j2s.core/dist/swingjs/SwingJS-site.zip b/sources/net.sf.j2s.core/dist/swingjs/SwingJS-site.zip index 69e6c8e98..94dda5ff6 100644 Binary files a/sources/net.sf.j2s.core/dist/swingjs/SwingJS-site.zip and b/sources/net.sf.j2s.core/dist/swingjs/SwingJS-site.zip differ diff --git a/sources/net.sf.j2s.core/dist/swingjs/timestamp b/sources/net.sf.j2s.core/dist/swingjs/timestamp index be7cf525b..3482393bd 100644 --- a/sources/net.sf.j2s.core/dist/swingjs/timestamp +++ b/sources/net.sf.j2s.core/dist/swingjs/timestamp @@ -1 +1 @@ -20180913053826 +20180915215829 diff --git a/sources/net.sf.j2s.core/dist/swingjs/ver/3.2.2/SwingJS-site.zip b/sources/net.sf.j2s.core/dist/swingjs/ver/3.2.2/SwingJS-site.zip index 69e6c8e98..94dda5ff6 100644 Binary files a/sources/net.sf.j2s.core/dist/swingjs/ver/3.2.2/SwingJS-site.zip and b/sources/net.sf.j2s.core/dist/swingjs/ver/3.2.2/SwingJS-site.zip differ diff --git a/sources/net.sf.j2s.core/dist/swingjs/ver/3.2.2/timestamp b/sources/net.sf.j2s.core/dist/swingjs/ver/3.2.2/timestamp index be7cf525b..3482393bd 100644 --- a/sources/net.sf.j2s.core/dist/swingjs/ver/3.2.2/timestamp +++ b/sources/net.sf.j2s.core/dist/swingjs/ver/3.2.2/timestamp @@ -1 +1 @@ -20180913053826 +20180915215829 diff --git a/sources/net.sf.j2s.java.core/dist/SwingJS-site.zip b/sources/net.sf.j2s.java.core/dist/SwingJS-site.zip index 69e6c8e98..94dda5ff6 100644 Binary files a/sources/net.sf.j2s.java.core/dist/SwingJS-site.zip and b/sources/net.sf.j2s.java.core/dist/SwingJS-site.zip differ diff --git a/sources/net.sf.j2s.java.core/doc/Differences.txt b/sources/net.sf.j2s.java.core/doc/Differences.txt index bea26b9ac..64d98df05 100644 --- a/sources/net.sf.j2s.java.core/doc/Differences.txt +++ b/sources/net.sf.j2s.java.core/doc/Differences.txt @@ -1,5 +1,6 @@ Notes ===== +updated 9/15/19 -- adds integer 1/0 == 0 updated 7/24/18 -- most classes replaced with https://github.com/frohoff/jdk8u-jdk updated 6/28/18 -- arrays do not inherit Object updated 2/26/18 @@ -174,7 +175,6 @@ JTabbedPane (in development, NEM) MINOR ISSUES--required some rewriting/refactoring by Bob and Udo ================================================================ -java.util.BitSet is implemented using 16-bit integers, not 32 Thread.currentThread() == dispatchThread @@ -214,6 +214,7 @@ no format internationalization no winding rules text-related field implementation Formatter/Regex limitations +integer 1/0 == 0 ======================================================================== @@ -1133,6 +1134,9 @@ Matcher.start(groupID) is not supported. java.util.Formatter will function correctly for all standard %... patterns. +integer 1/0 == 0 +---------------- +1/0 in Java throws java.lang.ArithmeticException: / by zero but in JavaScript is just 0. diff --git a/sources/net.sf.j2s.java.core/src/java/awt/Container.java b/sources/net.sf.j2s.java.core/src/java/awt/Container.java index 4c2a13545..8c0a5dfaf 100644 --- a/sources/net.sf.j2s.java.core/src/java/awt/Container.java +++ b/sources/net.sf.j2s.java.core/src/java/awt/Container.java @@ -1823,6 +1823,8 @@ public void paint(Graphics g) { } public void paintContainer(Graphics g) { + + // !NOT! -- 9/15/18 // SwingJS: split off here so that // the new JComponent-subclassed Window can // hit this one directly instead of JComponent.paint() @@ -2693,7 +2695,7 @@ public void addNotify() { public void setDispatcher() { if (dispatcher != null) return; - System.err.println("LWD dispatch for "+ this); + //System.err.println("LWD dispatch for "+ this); dispatcher = new LightweightDispatcher(this); } /** diff --git a/sources/net.sf.j2s.java.core/src/javax/swing/BoxLayout.java b/sources/net.sf.j2s.java.core/src/javax/swing/BoxLayout.java index cf9a9841f..d2104892f 100644 --- a/sources/net.sf.j2s.java.core/src/javax/swing/BoxLayout.java +++ b/sources/net.sf.j2s.java.core/src/javax/swing/BoxLayout.java @@ -38,6 +38,7 @@ import java.awt.Dimension; import java.awt.Insets; import java.awt.LayoutManager2; +import java.io.PrintStream; /** * A layout manager that allows multiple components to be laid out either @@ -169,6 +170,9 @@ public class BoxLayout implements LayoutManager2 { */ public static final int PAGE_AXIS = 3; + public BoxLayout(Container target, int axis, PrintStream dbg) { + this(target, axis); + } /** * Creates a layout manager that will lay out components along the * given axis. diff --git a/sources/net.sf.j2s.java.core/src/javax/swing/RepaintManager.java b/sources/net.sf.j2s.java.core/src/javax/swing/RepaintManager.java index 25fa78475..278b7b0e5 100644 --- a/sources/net.sf.j2s.java.core/src/javax/swing/RepaintManager.java +++ b/sources/net.sf.j2s.java.core/src/javax/swing/RepaintManager.java @@ -870,7 +870,7 @@ private void paintDirtyRegions1( if (g != null) { // SwingJS not clipping, for performance g.setClip(rect.x, rect.y, rect.width, rect.height); try { - ((Container) dirtyComponent).paintContainer(g); // SwingJS + ((Container) dirtyComponent).paint(g); // SwingJS was paintContainer, but that bypasses user's paint(g)?? 9/15/18 } finally { g.dispose(); } diff --git a/sources/net.sf.j2s.java.core/src/swingjs/JSGraphics2D.java b/sources/net.sf.j2s.java.core/src/swingjs/JSGraphics2D.java index b51d4d27e..996955bc7 100644 --- a/sources/net.sf.j2s.java.core/src/swingjs/JSGraphics2D.java +++ b/sources/net.sf.j2s.java.core/src/swingjs/JSGraphics2D.java @@ -86,6 +86,11 @@ public JSGraphics2D(Object canvas) { // this must be Object, because we are hints = new RenderingHints(new Hashtable()); this.canvas = (HTML5Canvas) canvas; ctx = this.canvas.getContext("2d"); + // reduce antialiasing, thank you, + // http://www.rgraph.net/docs/howto-get-crisp-lines-with-no- antialias.html + if (!isShifted) + ctx.translate(-0.5, -0.5); + isShifted = true; transform = new AffineTransform(); setStroke(new BasicStroke()); /** @@ -184,14 +189,6 @@ private double toRad(double a) { public void background(Color bgcolor) { backgroundColor = bgcolor; if (bgcolor == null) { - /* - * - * reduce antialiasing, thank you, - * http://www.rgraph.net/docs/howto-get-crisp-lines-with-no- antialias.html - */ - if (!isShifted) - ctx.translate(-0.5, -0.5); - isShifted = true; return; } clearRect(0, 0, width, height); @@ -244,7 +241,15 @@ public void fillRect(int x, int y, int width, int height) { if (width <= 0 || height <= 0) return; backgroundPainted = true; + ctx.translate(0.5, 0.5); ctx.fillRect(x, y, width, height); + ctx.translate(-0.5, -0.5); +// +// if (width == 1) +// drawLine(x, y, x, y + height); +// else if (height == 1) +// drawLine(x, y, x + width, y); +// else } public void draw3DRect(int x, int y, int width, int height, boolean raised) { @@ -702,10 +707,14 @@ public Shape getClip() { } public void drawString(String s, int x, int y) { - ctx.fillText(s, x, y); + fillText(s, x, y); } public void drawString(String str, float x, float y) { + fillText(str, x, y); + } + + private void fillText(String str, float x, float y) { ctx.fillText(str, x, y); } diff --git a/sources/net.sf.j2s.java.core/src/swingjs/jquery/jquery-ui-j2sslider.css b/sources/net.sf.j2s.java.core/src/swingjs/jquery/jquery-ui-j2sslider.css index 1b2dee8ad..e1cf7e4e3 100644 --- a/sources/net.sf.j2s.java.core/src/swingjs/jquery/jquery-ui-j2sslider.css +++ b/sources/net.sf.j2s.java.core/src/swingjs/jquery/jquery-ui-j2sslider.css @@ -306,4 +306,9 @@ .swingjs .ui-j2sslider-tick-mark-vert { display:inline-block; width:1px; background: black; border:1px; height:5px; position:absolute; top:12px; } .swingjs .ui-j2sslider-tick-mark-horiz { display:inline-block; height:1px; background: black; border:1px; width:5px; position:absolute; left:14px; } +.swingjs .ui-j2sslider-at-bottom { border-bottom-width:3px; border-bottom-color:red } +.swingjs .ui-j2sslider-at-top { border-top-width:3px; border-top-color:red } +.swingjs .ui-j2sslider-at-left { border-left-width:3px; border-left-color:red } +.swingjs .ui-j2sslider-at-right { border-right-width:3px; border-right-color:red } + diff --git a/sources/net.sf.j2s.java.core/src/swingjs/jquery/jquery-ui-j2sslider.js b/sources/net.sf.j2s.java.core/src/swingjs/jquery/jquery-ui-j2sslider.js index 6aa89fdde..0e5c56e97 100644 --- a/sources/net.sf.j2s.java.core/src/swingjs/jquery/jquery-ui-j2sslider.js +++ b/sources/net.sf.j2s.java.core/src/swingjs/jquery/jquery-ui-j2sslider.js @@ -24,6 +24,13 @@ var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle; + var clearEnds = function(e) { + e.removeClass("ui-j2sslider-at-top"); + e.removeClass("ui-j2sslider-at-bottom"); + e.removeClass("ui-j2sslider-at-left"); + e.removeClass("ui-j2sslider-at-right"); + }; + $ .widget( "ui.j2sslider", @@ -137,6 +144,14 @@ me._mouseSliding = false; }; + var fOutTrack = function(event, id) { + clearEnds(me.element); + }; + + var fMoveTrack = function(event, id) { + me._doMouseCapture(event, true, true); + }; + var fDrag = function(xye, id) { if (me.options.disabled) return; @@ -190,9 +205,14 @@ fUp ]); } - if (handleCount == 1) + if (handleCount == 1) { $(this.element).mousedown(fDownTrack); - + if (this.isScrollBar) { + $(this.element).mousemove(fMoveTrack); + $(this.element).mouseout(fOutTrack); + } + } + this.handle = this.handles.eq(0); this.handles.add(this.range).filter("a").click( @@ -231,7 +251,8 @@ this._mouseDestroy(); }, - _doMouseCapture : function(event, isTrackClick) { + _doMouseCapture : function(event, isTrackClick, isEndCheck) { + var that = this, o = this.options; if (o.disabled) { @@ -293,11 +314,11 @@ this._clickOffset = (mouseOverHandle ? { left : position.x - offset.left - - (closestHandle.width() / 2 * this.options.scaleX) + - (closestHandle.width() / 2 * o.scaleX) , top : position.y - offset.top - - (closestHandle.height() / 2 * this.options.scaleY) + - (closestHandle.height() / 2 * o.scaleY) - (parseInt(closestHandle .css("borderTopWidth"), 10) || 0) - (parseInt(closestHandle @@ -310,10 +331,27 @@ left : 0, top : 0 }); - - normValue = this._normValueFromMouse(position, isTrackClick); + var val = this._normValueFromMouse(position, isTrackClick); + var isMin = false; + var isAtEnd = (!this.isScrollBar ? 0 : (isMin = (val == this._valueMin())) ? -1 + : val >= this._getRealMax() - (isTrackClick ? 0 : o.jslider.ui.getUnitIncrement$()) ? 1 : 0); + if (isAtEnd) { + this.element.addClass(this.orientation === "horizontal" ? + (isAtEnd == 1 ? "ui-j2sslider-at-right" : "ui-j2sslider-at-left") + : (isAtEnd == 1 ? "ui-j2sslider-at-bottom" : "ui-j2sslider-at-top")); + } else { + clearEnds(this.element); + } + if (isEndCheck) { + return; + } + var dir = Math.signum(!isAtEnd ? val - o.jslider.getValue$() : isMin ? -1 : 1); if (!this.handles.hasClass("ui-state-hover")) { - this._slide(event, index, normValue); + if (isAtEnd) { + o.jslider.ui.scrollByUnit$I(dir); + } else if (isTrackClick) { + o.jslider.ui.scrollDueToClickInTrack$I(dir); + } } this._animateOff = true; return true; @@ -573,7 +611,7 @@ this._animateOff = false; break; case "handleSize": - this.isScrollBar = this.options.isScrollBar = true; + this.isScrollBar = true; this.handleFraction = value; if (this.orientation === "horizontal") $(this.handles[0]).width(this.handleSize = value * this.element.outerWidth()); @@ -590,10 +628,7 @@ // _value() returns value trimmed by min and max, // aligned by step _value : function() { - var val = this.options.value; - val = this._trimAlignValue(val); - - return val; + return this._trimAlignValue(this.options.value); }, // internal values getter @@ -602,33 +637,30 @@ // _values( index ) returns single value trimmed by // min and max, aligned by step _values : function(index) { - var val, vals, i; - if (arguments.length) { - val = this.options.values[index]; - val = this._trimAlignValue(val); - - return val; - } else { - // .slice() creates a copy of the array - // this copy gets trimmed by min and max and - // then returned - vals = this.options.values.slice(); - for (i = 0; i < vals.length; i += 1) { - vals[i] = this._trimAlignValue(vals[i]); - } - - return vals; + return this._trimAlignValue(this.options.values[index]); + } + // .slice() creates a copy of the array + // this copy gets trimmed by min and max and + // then returned + var vals = this.options.values.slice(); + for (var i = 0; i < vals.length; i += 1) { + vals[i] = this._trimAlignValue(vals[i]); } + return vals; }, + _getRealMax : function() { + return Math.round((this._valueMax() - this._valueMin()) * (1-this.handleFraction) + this._valueMin()); + }, + // returns the step-aligned value that val is // closest to, between (inclusive) min and max _trimAlignValue : function(val) { if (val <= this._valueMin()) { return this._valueMin(); } - var max = Math.round((this._valueMax() - this._valueMin()) * (1-this.handleFraction) + this._valueMin()); + var max = this._getRealMax(); if (val >= max) { return max; } @@ -791,3 +823,4 @@ })(J2S.__$); })(); +// BH 9/15/2018 diff --git a/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSComponentUI.java b/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSComponentUI.java index ae3f1443e..4ff30d8a8 100644 --- a/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSComponentUI.java +++ b/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSComponentUI.java @@ -1614,14 +1614,14 @@ protected void setHorizontalButtonAlignments(JComponent b, int pos, int align) { DOMNode.setStyles(iconNode, "left", null, "right", null); DOMNode.setStyles(centeringNode, "text-align", null, "left", null, "right", null); DOMNode.setStyles(centeringNode, poslr, "0px", "text-align", alignlr); - if (buttonNode != null) { - DOMNode.setStyles(buttonNode, "text-align", null, "left", null, "right", null); - DOMNode.setStyles(buttonNode, "text-align", alignlr, alignlr, "0px"); - } + //if (buttonNode != null) { + DOMNode.setStyles(domNode, "text-align", null, "left", null, "right", null); + DOMNode.setStyles(domNode, "text-align", alignlr, poslr, "0px"); + //} if (centered) { - int w = actualWidth; - if (w == 0) - w = setHTMLSize1(centeringNode, false, false).width; + int w = (buttonNode == null ? + $(domNode).width() : setHTMLSize1(centeringNode, false, false).width + ); int off = (w - wText - wIcon) / 2; if (text0) { DOMNode.setStyles(textNode, "left", off + "px"); diff --git a/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSLabelUI.java b/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSLabelUI.java index 48c709756..9a385a8e1 100644 --- a/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSLabelUI.java +++ b/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSLabelUI.java @@ -1,5 +1,8 @@ package swingjs.plaf; +import java.awt.Container; +import java.awt.Dimension; + import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JLabel; @@ -52,7 +55,7 @@ public DOMNode updateDOMNode() { if (label != null) { // not for JToolTip setHorizontalButtonAlignments(label, label.getHorizontalTextPosition(), - label.getHorizontalAlignment()); + label.getHorizontalAlignment()); } if (jc.isOpaque() && jc.isEnabled()) setBackground(jc.getBackground()); @@ -89,4 +92,8 @@ public void uninstallUI(JComponent jc) { } + Dimension getMaximumSize(JComponent jc) { + return getPreferredSize(); + } + } diff --git a/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSScrollBarUI.java b/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSScrollBarUI.java index 0efafbb57..cf7d6b629 100644 --- a/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSScrollBarUI.java +++ b/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSScrollBarUI.java @@ -96,6 +96,42 @@ void setScrollBarExtentAndCSS() { } } + @Override + public void scrollByBlock(int direction) { + // general click in track + JScrollBar sb = (JScrollBar) jc; + int delta = sb.getBlockIncrement(); + if (delta == Integer.MIN_VALUE && direction > 0) + return; + delta *= (direction > 0 ? POSITIVE_SCROLL : NEGATIVE_SCROLL); + sb.setValue(sb.getValue() + delta); + } + + @Override + public void scrollByUnit(int direction) { + // scroll click at end of scrollbar + JScrollBar sb = (JScrollBar) jc; + int delta = sb.getUnitIncrement(); + if (delta == Integer.MIN_VALUE && direction > 0) + return; + delta *= (direction > 0 ? POSITIVE_SCROLL : NEGATIVE_SCROLL); + sb.setValue(sb.getValue() + delta); + } + + @Override + public int getUnitIncrement() { + JScrollBar sb = (JScrollBar) jc; + return sb.getUnitIncrement(); + } + + + + @Override + public void scrollDueToClickInTrack( int dir ) { + scrollByBlock( dir ); + } + + } diff --git a/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSSliderUI.java b/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSSliderUI.java index d530a32c4..29e890e29 100644 --- a/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSSliderUI.java +++ b/sources/net.sf.j2s.java.core/src/swingjs/plaf/JSSliderUI.java @@ -24,6 +24,11 @@ @SuppressWarnings({"rawtypes", "unchecked", "unused"}) public class JSSliderUI extends JSLightweightUI implements PropertyChangeListener, ChangeListener { + public static final int POSITIVE_SCROLL = +1; + public static final int NEGATIVE_SCROLL = -1; + public static final int MIN_SCROLL = -2; + public static final int MAX_SCROLL = +2; + static { Object jqueryui = JQueryUI.class; // loads jQuery.ui // this static call allows for the CSS to be loaded only once and only when needed @@ -31,7 +36,7 @@ public class JSSliderUI extends JSLightweightUI implements PropertyChangeListene JSUtil.loadStaticResource("swingjs/jquery/jquery-ui-j2sslider.js"); } - JSlider jSlider; + protected JSlider slider; private int min, max, val, majorSpacing, minorSpacing; protected boolean paintTicks; protected boolean paintLabels; @@ -77,9 +82,9 @@ public DOMNode updateDOMNode() { orientation = (js.getOrientation() == SwingConstants.VERTICAL ? "vertical" : "horizontal"); model = js.getModel(); - boolean isHoriz = (jSlider.getOrientation() == SwingConstants.HORIZONTAL); + boolean isHoriz = (slider.getOrientation() == SwingConstants.HORIZONTAL); boolean isVerticalScrollBar = (isScrollBar && !isHoriz); - boolean isInverted = isVerticalScrollBar || !isScrollBar && jSlider.getInverted(); + boolean isInverted = isVerticalScrollBar || !isScrollBar && slider.getInverted(); boolean isChanged = false; if (isHoriz != this.isHoriz || isVerticalScrollBar != this.isVerticalScrollBar || isInverted != this.isInverted) { @@ -111,7 +116,7 @@ public DOMNode updateDOMNode() { @Override public void installUI(JComponent jc) { - jSlider = (JSlider) jc; + slider = (JSlider) jc; if (isScrollBar) jScrollBar = (JScrollBar) jc; } @@ -126,7 +131,7 @@ private void setJQuerySliderAndEvents() { * slider.j2sslider( * { orientation: me.orientation, * jslider: me.c, - * isScrollBar: me.isScrollPaneScrollBar, + * isScrollBar: me.isScrollBar, * range: false, * min: me.min, * max: me.max, @@ -154,7 +159,7 @@ private void setJQuerySliderAndEvents() { * @param ui */ public void jqueryStart(Object event, Object ui) { - jSlider.setValueIsAdjusting(true); + slider.setValueIsAdjusting(true); } /** @@ -164,7 +169,7 @@ public void jqueryStart(Object event, Object ui) { * @param ui */ public void jqueryStop(Object event, Object ui) { - jSlider.setValueIsAdjusting(false); + slider.setValueIsAdjusting(false); } /** @@ -184,7 +189,7 @@ public void jqueryCallback(Object event, Object ui) { */ {} - jSlider.setValue(val = Math.round(value)); + slider.setValue(val = Math.round(value)); } @Override @@ -235,7 +240,7 @@ public void setSlider() { myHeight = 10; int barPlace = 40; - if (isHoriz && jSlider.getBorder() != null) + if (isHoriz && slider.getBorder() != null) barPlace += 10; String tickClass = "ui-j2sslider-tick-mark" @@ -247,7 +252,7 @@ public void setSlider() { return; int margin = 10; - int length = (isHoriz ? jSlider.getWidth() : jSlider.getHeight()); + int length = (isHoriz ? slider.getWidth() : slider.getHeight()); if (length <= 0) length = (isHoriz ? getPreferredHorizontalSize().width : getPreferredVerticalSize().height); @@ -279,7 +284,7 @@ public void setSlider() { } if (paintLabels) { myHeight += 20; - labelTable = jSlider.getLabelTable(); + labelTable = slider.getLabelTable(); Enumeration keys = labelTable.keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); @@ -334,7 +339,7 @@ protected Dimension setHTMLSize(DOMNode obj, boolean addCSS) { int d = 20; if (paintLabels || paintTicks) d += 10; - if (jSlider.getBorder() != null) + if (slider.getBorder() != null) d += 10; // only the width or height will be read here, not both return new Dimension((isHoriz ? actualWidth : d), (isHoriz ? d : actualHeight)); @@ -351,11 +356,11 @@ public void propertyChange(PropertyChangeEvent e) { @Override public void stateChanged(ChangeEvent e) { int v; - if ((v = jSlider.getMinimum()) != min) + if ((v = slider.getMinimum()) != min) setSliderAttr("min", min = v); - if ((v = jSlider.getMaximum()) != max) + if ((v = slider.getMaximum()) != max) setSliderAttr("max", max = v); - if ((v = jSlider.getValue()) != val) + if ((v = slider.getValue()) != val) setSliderAttr("value", val = v); setup(false); } @@ -385,7 +390,7 @@ public Dimension getMinimumSize(JComponent c) { } private Dimension getMinimumHorizontalSize() { - Dimension horizDim = (Dimension) DefaultLookup.get(jSlider, this, + Dimension horizDim = (Dimension) DefaultLookup.get(slider, this, "Slider.minimumHorizontalSize"); if (horizDim == null) { horizDim = new Dimension(36, 21); @@ -394,7 +399,7 @@ private Dimension getMinimumHorizontalSize() { } private Dimension getMinimumVerticalSize() { - Dimension vertDim = (Dimension) DefaultLookup.get(jSlider, this, + Dimension vertDim = (Dimension) DefaultLookup.get(slider, this, "Slider.minimumVerticalSize"); if (vertDim == null) { vertDim = new Dimension(21, 36); @@ -407,7 +412,7 @@ public Dimension getPreferredSize(JComponent c) { } public Dimension getPreferredHorizontalSize() { - Dimension horizDim = (Dimension) DefaultLookup.get(jSlider, this, + Dimension horizDim = (Dimension) DefaultLookup.get(slider, this, "Slider.horizontalSize"); if (horizDim == null) { horizDim = new Dimension(200, 21); @@ -416,12 +421,77 @@ public Dimension getPreferredHorizontalSize() { } public Dimension getPreferredVerticalSize() { - Dimension vertDim = (Dimension) DefaultLookup.get(jSlider, this, + Dimension vertDim = (Dimension) DefaultLookup.get(slider, this, "Slider.verticalSize"); if (vertDim == null) { vertDim = new Dimension(21, 200); } return vertDim; } + + public void scrollByBlock(int direction) { + synchronized(slider) { + int blockIncrement = + (slider.getMaximum() - slider.getMinimum()) / 10; + if (blockIncrement == 0) { + blockIncrement = 1; + } + + if (slider.getSnapToTicks()) { + int tickSpacing = getTickSpacing(); + + if (blockIncrement < tickSpacing) { + blockIncrement = tickSpacing; + } + } + + int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL); + slider.setValue(slider.getValue() + delta); + } + } + + public void scrollByUnit(int direction) { + synchronized(slider) { + int delta = ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL); + + if (slider.getSnapToTicks()) { + delta *= getTickSpacing(); + } + + slider.setValue(slider.getValue() + delta); + } + } + + public int getUnitIncrement() { + // JScrollBar only + return -1; + } + + public void scrollDueToClickInTrack(int dir) { + scrollByUnit(dir); + } + + private int getTickSpacing() { + int majorTickSpacing = slider.getMajorTickSpacing(); + int minorTickSpacing = slider.getMinorTickSpacing(); + + int result; + + if (minorTickSpacing > 0) { + result = minorTickSpacing; + } else if (majorTickSpacing > 0) { + result = majorTickSpacing; + } else { + result = 0; + } + + return result; + } + + Dimension getMaximumSize(JComponent jc) { + Dimension d = super.getMaximumSize(jc); + return (d != null ? d : isHoriz ? new Dimension(Short.MAX_VALUE, 21) : new Dimension(21, Short.MAX_VALUE)); + } + } diff --git a/sources/net.sf.j2s.java.core/src/test/TApp2.java b/sources/net.sf.j2s.java.core/src/test/TApp2.java new file mode 100644 index 000000000..62baa63e4 --- /dev/null +++ b/sources/net.sf.j2s.java.core/src/test/TApp2.java @@ -0,0 +1,52 @@ +package test; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Container; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GridLayout; + +import javax.swing.JApplet; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import a2s.Label; + + +public class TApp2 extends JApplet { + public void init() { + setSize(500,500); + ((JComponent) ((Container) super.getRootPane().getComponent(1)).getComponent(0)).setOpaque(false); + setBackground(Color.white); + setLayout(null); + JPanel panel = new JPanel(); + panel.setBounds(10, 10, 100, 150); + add(panel); + panel.setLayout(null); + panel.setBackground(Color.red); + JLabel label = new JLabel("OK"); + label.setBounds(10, 10, 50, 60); + panel.add(label); + + JPanel panel2 = new JPanel(); + panel2.setLayout(new GridLayout(2, 1)); + Label label2 = new Label("1"); + label2.setAlignment(Label.CENTER); + panel2.add(label2); + panel2.add(new JLabel("2")); + panel2.setBounds(200, 150, 100, 150); + add(panel2); + } + + public void paint(Graphics g) { + super.paint(g); + ((Graphics2D) g).setStroke((new BasicStroke(0))); + g.drawRect(130, 150, 40, 60); + g.fillRect(140, 5, 1, 200); + g.drawRect(160, 5, 1, 200); + g.drawLine(150, 150, 150, 350); + g.drawString("testing123", 50, 200); + } +} diff --git a/sources/net.sf.j2s.java.core/src/test/TApp4.java b/sources/net.sf.j2s.java.core/src/test/TApp4.java new file mode 100644 index 000000000..95ec8a30e --- /dev/null +++ b/sources/net.sf.j2s.java.core/src/test/TApp4.java @@ -0,0 +1,107 @@ +package test; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JApplet; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JScrollBar; +import javax.swing.SwingConstants; +import javax.swing.Timer; + +import javajs.util.JSThread; + +public class TApp4 extends JApplet { + JLabel label; + //JSThread ZeitThread; + + public void init() { +// setSize(500,500); + ((JComponent) getContentPane()).setOpaque(false); +// ((JComponent) getRootPane()).setOpaque(false); + createGUI(); + } + + private void createGUI() { + setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); //new GridLayout(2, 1)); + label = new JLabel("You are successfully running a Swing applet!"); + label.setHorizontalAlignment(JLabel.CENTER); + label.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.black)); + label.setAlignmentX(CENTER_ALIGNMENT); + add(label); + JScrollBar sb = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 10); + sb.setBlockIncrement(1); + sb.setUnitIncrement(3); + sb.setAlignmentX(CENTER_ALIGNMENT); + add(sb); + setBackground(Color.green); + } + + public void start() { + label.setText("1"); + Timer t = new Timer(1000, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + label.setText("" + (new Integer(label.getText()).intValue() + 1)); + } + }); + t.setRepeats(true); + t.start(); +// if (ZeitThread == null) { +// label.setText("1"); +// ZeitThread = new JSThread() { +// +// @Override +// protected boolean myInit() { +// // TODO Auto-generated method stub +// return true; +// } +// +// @Override +// protected boolean isLooping() { +// return (ZeitThread != null); +// } +// +// @Override +// protected boolean myLoop() { +// label.setText("" + (new Integer(label.getText()).intValue() + 1)); +// return true; +// } +// +// @Override +// protected void whenDone() { +// // TODO Auto-generated method stub +// +// } +// +// @Override +// protected int getDelayMillis() { +// return 1000; +// } +// +// @Override +// protected void onException(Exception e) { +// // TODO Auto-generated method stub +// +// } +// +// @Override +// protected void doFinally() { +// // TODO Auto-generated method stub +// +// } +// }; +// ZeitThread.start(); +// } + + } +} diff --git a/sources/net.sf.j2s.java.core/src/test/Test_.java b/sources/net.sf.j2s.java.core/src/test/Test_.java index 220fe329c..5294c548e 100644 --- a/sources/net.sf.j2s.java.core/src/test/Test_.java +++ b/sources/net.sf.j2s.java.core/src/test/Test_.java @@ -119,6 +119,7 @@ public static void main(String[] args) { Test_J8_Stream.main(args); Test_Java8.main(args); Test_Map.main(args); + Test_Math.main(args); Test_Native.main(args); Test_NoAssert.main(args); Test_NoHeadless_1.main(args); diff --git a/sources/net.sf.j2s.java.core/src/test/Test_Applet_Scroll.java b/sources/net.sf.j2s.java.core/src/test/Test_Applet_Scroll.java index 1412b8932..94f2a3c09 100644 --- a/sources/net.sf.j2s.java.core/src/test/Test_Applet_Scroll.java +++ b/sources/net.sf.j2s.java.core/src/test/Test_Applet_Scroll.java @@ -39,6 +39,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.ViewportUI; +import javax.swing.plaf.basic.BasicSliderUI; public class Test_Applet_Scroll extends JApplet implements ChangeListener { @@ -52,7 +53,6 @@ public class Test_Applet_Scroll extends JApplet implements ChangeListener { */ } static DecimalFormat df = new DecimalFormat("0.00"); - boolean preferred = true; private JScrollBar hsb; @@ -68,6 +68,7 @@ void setSize(JComponent c, int x, int y) { @Override public void init() { + BasicSliderUI ui; final JLabel label = new JLabel("hello"); // label.setBounds(0, 60, 200, 60); @@ -278,6 +279,7 @@ public void mouseMoved(MouseEvent e) { getContentPane().add(sp); sp.getViewport().addChangeListener(this); hsb = sp.getHorizontalScrollBar(); + hsb.setUnitIncrement(100); button2.setToolTipText("this is hsb"); mkBar(p, tf, Adjustable.VERTICAL, 20, 200).setToolTipText("this is scrollbar 1"); @@ -321,6 +323,8 @@ public void mouseWheelMoved(MouseWheelEvent e) { setSize(bar, x, y); bar.setBackground(Color.orange); bar.setForeground(Color.green); + bar.setBlockIncrement(10); + bar.setUnitIncrement(100); bar.setOpaque(true); p.add(bar); sbar = bar; diff --git a/sources/net.sf.j2s.java.core/src/test/Test_Math.java b/sources/net.sf.j2s.java.core/src/test/Test_Math.java new file mode 100644 index 000000000..d60dae1f9 --- /dev/null +++ b/sources/net.sf.j2s.java.core/src/test/Test_Math.java @@ -0,0 +1,61 @@ +package test; + +class Test_Math extends Test_ { + +// Java output: +// +// rem(3.0/2.0) = -1.0 == -1.0 +// rem(4.0/2.0) = 0.0 == 0.0 +// rem(10.0/3.0) = 1.0 == 1.0 +// rem(11.0/3.0) = -1.0 == -1.0 +// rem(27.0/4.0) = -1.0 == -1.0 +// rem(28.0/5.0) = -2.0 == -2.0 +// rem(17.8/4.0) = 1.8000000000000007 == 1.8000000000000007 +// rem(17.8/4.1) = 1.4000000000000021 == 1.4000000000000021 +// rem(-16.3/4.1) = 0.09999999999999787 == 0.09999999999999787 +// rem(17.8/-4.1) = 1.4000000000000021 == 1.4000000000000021 +// rem(-17.8/-4.1) = -1.4000000000000021 == -1.4000000000000021 +// rem(NaN/5.0) = NaN == NaN +// rem(5.0/NaN) = NaN == NaN +// rem(Infinity/Infinity) = NaN == NaN +// rem(Infinity/5.0) = NaN == NaN +// rem(28.0/0.0) = NaN == NaN +// rem(28.0/Infinity) = 28.0 == 28.0 +// rem(1.7976931348623157E308/4.1) = 1.4678815408981212 == 1.4678815408981212 +// rem(4.1/1.7976931348623157E308) = 4.1 == 4.1 + + public static void main(String[] args) { + ShowRemainders(3, 2, -1); + ShowRemainders(4, 2, 0); + ShowRemainders(10, 3, 1); + ShowRemainders(11, 3, -1); + ShowRemainders(27, 4, -1); + ShowRemainders(28, 5, -2); + // the agreement here is with Java, not MSDN.net + ShowRemainders(17.8, 4, 1.8000000000000007); + ShowRemainders(17.8, 4.1, 1.4000000000000021); + ShowRemainders(-16.3, 4.1, 0.09999999999999787); + ShowRemainders(17.8, -4.1, 1.4000000000000021); + ShowRemainders(-17.8, -4.1, -1.4000000000000021); + // If either argument is NaN, or the first argument is infinite, or the second + // argument is positive zero or negative zero, then the result is NaN. + ShowRemainders(Double.NaN, 5, Double.NaN); + ShowRemainders(5, Double.NaN, Double.NaN); + ShowRemainders(1.0 / 0, 1.0 / 0, Double.NaN); + ShowRemainders(1.0 / 0, 5, Double.NaN); + ShowRemainders(28, 0, Double.NaN); + // If the first argument is finite and the second argument is infinite, + // then the result is the same as the first argument. + ShowRemainders(28, 1.0 / 0, 28); + // How about max value? + ShowRemainders(Double.MAX_VALUE, 4.1, 1.4678815408981212); + ShowRemainders(4.1, Double.MAX_VALUE, 4.1); + System.out.println("Test_Math OK"); + } + + private static void ShowRemainders(double number1, double number2, double val) { + double ieeeRemainder = Math.IEEEremainder(number1, number2); + System.out.println("rem(" + number1 + "/" + number2 + ") = " + ieeeRemainder + " == " + val); + assert (Double.isNaN(ieeeRemainder) ? Double.isNaN(val) : ieeeRemainder == val); + } +} diff --git a/sources/net.sf.j2s.java.core/srcjs/js/j2sApplet.js b/sources/net.sf.j2s.java.core/srcjs/js/j2sApplet.js index e288020f6..fc116accb 100644 --- a/sources/net.sf.j2s.java.core/srcjs/js/j2sApplet.js +++ b/sources/net.sf.j2s.java.core/srcjs/js/j2sApplet.js @@ -1634,6 +1634,9 @@ if (!J2S._version) J2S.setMouseOwner(null); + if (!who) + return true; + var ui = ev.target["data-ui"]; // e.g., a textbox var handled = (ui && ui.handleJSEvent$O$I$O(who, 502, ev)); if (checkStopPropagation(ev, ui, handled)) diff --git a/sources/net.sf.j2s.java.core/srcjs/js/j2sClazz.js b/sources/net.sf.j2s.java.core/srcjs/js/j2sClazz.js index b3c379282..33faab0ee 100644 --- a/sources/net.sf.j2s.java.core/srcjs/js/j2sClazz.js +++ b/sources/net.sf.j2s.java.core/srcjs/js/j2sClazz.js @@ -10,6 +10,8 @@ // TODO: CharacterSequence does not implement Java 8 default methods chars() or codePoints() // It is possible that these might be loaded dynamically. +// BH 9/15/2018 3.2.2.06 adds JScrollBar block and unit increments; fixes JLabel ui getMaximumSize +// BH 9/15/2018 3.2.2.05 fixes Math.IEEEremainder // BH 8/21/2018 3.2.2.04 fixes ?j2strace=xxx message; sets user.home to https://./, not https://.//; Boolean upgrade and fix // BH 8/20/2018 3.2.2.04 adds character.isJavaIdentifierPart$C and several Character...$I equivalents, fixes newEnumConst(), System.getBoolean$S // BH 8/19/2018 3.2.2.04 fixes Enum .name being .$name @@ -102,7 +104,7 @@ window["j2s.clazzloaded"] = true; _debugging: false, _loadcore: true, _nooutput: 0, - _VERSION_R: "3.2.2.05", + _VERSION_R: "3.2.2.06", _VERSION_T: "unknown", }; @@ -3410,18 +3412,19 @@ Math.nextUp||(Math.nextUp=function(d){return 0}); Math.ulp||(Math.ulp=function(d){return 0}); Math.getExponent||(Math.getExponent=function(d){return 0}); Math.IEEEremainder||(Math.IEEEremainder=function (x, y) { - if (y == 0 || Double.isNaN(x) || Double.isInfinite(y) && !Double.isInfinite(x) ) return NaN; - var modxy = x % y; - if (modxy == 0 ) return modxy; - var rem = modxy - (Math.abs(y) * Math.signum(x)); - if (Math.abs(rem) == Math.abs(modxy) ) { - var div = x / y; - return (Math.abs(Math.round(div)) > Math.abs(div) ? rem : modxy); - } - return (Math.abs(rem) < Math.abs(modxy) ? rem : modxy); - }); - -//end datatype reliant math declarations + if (Double.isNaN$D(x) || Double.isNaN$D(y) || Double.isInfinite$D(x) || y == 0) + return NaN; + if (!Double.isInfinite$D(x) && Double.isInfinite$D(y)) + return x; + var modxy = x % y; + if (modxy == 0) return modxy; + var rem = modxy - Math.abs(y) * Math.signum(x); + if (Math.abs(rem) == Math.abs(modxy)) { + var div = x / y; + return (Math.abs(Math.round(div)) > Math.abs(div) ? rem : modxy); + } + return (Math.abs(rem) < Math.abs(modxy) ? rem : modxy); +}); Clazz._setDeclared("java.lang.Number", java.lang.Number=Number); diff --git a/sources/net.sf.j2s.java.core/srcjs/swingjs2.js b/sources/net.sf.j2s.java.core/srcjs/swingjs2.js index 12057a96c..57f43cb94 100644 --- a/sources/net.sf.j2s.java.core/srcjs/swingjs2.js +++ b/sources/net.sf.j2s.java.core/srcjs/swingjs2.js @@ -12290,6 +12290,9 @@ if (!J2S._version) J2S.setMouseOwner(null); + if (!who) + return true; + var ui = ev.target["data-ui"]; // e.g., a textbox var handled = (ui && ui.handleJSEvent$O$I$O(who, 502, ev)); if (checkStopPropagation(ev, ui, handled)) @@ -13551,6 +13554,8 @@ if (!J2S._version) // TODO: CharacterSequence does not implement Java 8 default methods chars() or codePoints() // It is possible that these might be loaded dynamically. +// BH 9/15/2018 3.2.2.06 adds JScrollBar block and unit increments; fixes JLabel ui getMaximumSize +// BH 9/15/2018 3.2.2.05 fixes Math.IEEEremainder // BH 8/21/2018 3.2.2.04 fixes ?j2strace=xxx message; sets user.home to https://./, not https://.//; Boolean upgrade and fix // BH 8/20/2018 3.2.2.04 adds character.isJavaIdentifierPart$C and several Character...$I equivalents, fixes newEnumConst(), System.getBoolean$S // BH 8/19/2018 3.2.2.04 fixes Enum .name being .$name @@ -13643,7 +13648,7 @@ window["j2s.clazzloaded"] = true; _debugging: false, _loadcore: true, _nooutput: 0, - _VERSION_R: "3.2.2.05", + _VERSION_R: "3.2.2.06", _VERSION_T: "unknown", }; @@ -16951,18 +16956,19 @@ Math.nextUp||(Math.nextUp=function(d){return 0}); Math.ulp||(Math.ulp=function(d){return 0}); Math.getExponent||(Math.getExponent=function(d){return 0}); Math.IEEEremainder||(Math.IEEEremainder=function (x, y) { - if (y == 0 || Double.isNaN(x) || Double.isInfinite(y) && !Double.isInfinite(x) ) return NaN; - var modxy = x % y; - if (modxy == 0 ) return modxy; - var rem = modxy - (Math.abs(y) * Math.signum(x)); - if (Math.abs(rem) == Math.abs(modxy) ) { - var div = x / y; - return (Math.abs(Math.round(div)) > Math.abs(div) ? rem : modxy); - } - return (Math.abs(rem) < Math.abs(modxy) ? rem : modxy); - }); - -//end datatype reliant math declarations + if (Double.isNaN$D(x) || Double.isNaN$D(y) || Double.isInfinite$D(x) || y == 0) + return NaN; + if (!Double.isInfinite$D(x) && Double.isInfinite$D(y)) + return x; + var modxy = x % y; + if (modxy == 0) return modxy; + var rem = modxy - Math.abs(y) * Math.signum(x); + if (Math.abs(rem) == Math.abs(modxy)) { + var div = x / y; + return (Math.abs(Math.round(div)) > Math.abs(div) ? rem : modxy); + } + return (Math.abs(rem) < Math.abs(modxy) ? rem : modxy); +}); Clazz._setDeclared("java.lang.Number", java.lang.Number=Number);