diff --git a/app/build/bin/resources.ap_ b/app/build/bin/resources.ap_ index 01063af27..831367129 100644 Binary files a/app/build/bin/resources.ap_ and b/app/build/bin/resources.ap_ differ diff --git a/app/src/main/java/java/awt/Canvas.java b/app/src/main/java/java/awt/Canvas.java index 8ae88b244..d4691bc68 100644 --- a/app/src/main/java/java/awt/Canvas.java +++ b/app/src/main/java/java/awt/Canvas.java @@ -4,36 +4,29 @@ import java.awt.image.*; import net.kdt.pojavlaunch.*; public class Canvas extends Component { - private Graphics mGraphics; - private Dimension mSize; + private Graphics graphics; public Canvas() { - mSize = new Dimension(1280, 720); - mGraphics = new Graphics(new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB)); + graphics = new Graphics(new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB)); } public void setPreferredSize(Dimension dim){ - mSize = dim; } - public void setFocusTraversalKeysEnabled(boolean b) { - System.out.println("java.awt.Canvas.setFocusTraversalKeysEnabled(" + b + ")"); - } - public boolean isDisplayable(){ return true; } public Graphics getGraphics() { - return mGraphics; + return graphics; } public int getWidth() { - return (int) mSize.getWidth(); + return 1280; } public int getHeight() { - return (int) mSize.getHeight(); + return 720; } } diff --git a/app/src/main/java/java/awt/Desktop.java b/app/src/main/java/java/awt/Desktop.java index 4869b21ac..b4a20ff0d 100644 --- a/app/src/main/java/java/awt/Desktop.java +++ b/app/src/main/java/java/awt/Desktop.java @@ -13,7 +13,7 @@ import java.awt.mod.*; public class Desktop { - private Activity currentActivity; + private MainActivity currentActivity; public enum Action { BROWSE, EDIT, MAIL, OPEN, PRINT @@ -22,36 +22,43 @@ public class Desktop public Desktop() { peer = Toolkit.getDefaultToolkit().createDesktopPeer(); - try { + try + { if (currentActivity == null) currentActivity = ModdingKit.getCurrentActivity(); - } catch (Exception e) { + } + catch (Exception e) + { throw new RuntimeException(e); } } - public static Desktop getDesktop() { + public static Desktop getDesktop() + { return new Desktop(); } - public static boolean isDesktopSupported() { + public static boolean isDesktopSupported() + { return true; } - public boolean isSupported(Action action) { + public boolean isSupported(Action action) + { return true; } - public void browse(URI uri) { + public void browse(URI uri) + { try { URL url = uri.toURL(); if(url.toString().startsWith("file:")){ String fPath = url.toString().replace("file:", ""); - System.out.println("PojavLauncher:java.awt.Desktop: Browse folder: " + fPath); + Log.d("MineDebug:java.awt.Desktop", "Browse folder: " + fPath); // Current not implemented } else{ - System.out.println("PojavLauncher:java.awt.Desktop: Browse URL: " + url.toString()); + Log.d("MineDebug:java.awt.Desktop", "Browse URL: " + url.toString()); if (!url.toString().startsWith("http://") && !url.toString().startsWith("https://")){ url = new URL("http://" + url.toString()); } diff --git a/app/src/main/java/java/awt/Graphics.java b/app/src/main/java/java/awt/Graphics.java index 2efb54124..474a50114 100644 --- a/app/src/main/java/java/awt/Graphics.java +++ b/app/src/main/java/java/awt/Graphics.java @@ -1,9 +1,10 @@ package java.awt; -import android.graphics.*; -import java.awt.image.*; +import java.awt.image.BufferedImage; +import java.awt.image.ImageObserver; import android.graphics.Canvas; +import android.graphics.Paint; public class Graphics { private Paint androidPaint; @@ -32,24 +33,10 @@ public class Graphics { } public boolean drawImage(Image image, int x, int y, ImageObserver observer) { - return false; - } - - public boolean drawImage(Image image, ImageObserver observer) { - return drawImage(image, 0, 0, observer); - } - - public boolean drawImage(Image image, int x, int y, int width, int height, ImageObserver observer) { - return drawImage(image, x ,y ,x + width, y + height, observer); - } - - public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) { - if (image instanceof BufferedImage) { - ((BufferedImage) image).getAndroidBitmap().reconfigure(dx2 - dx1, dy2 - dy1, Bitmap.Config.ARGB_8888); - this.androidCanvas.drawBitmap(((BufferedImage) image).getAndroidBitmap(), (float) dx1, (float) dy1, null); - return true; + if (image instanceof BufferedImage) { + this.androidCanvas.drawBitmap(((BufferedImage) image).getAndroidBitmap(), (float) x, (float) y, null); } - return false; - } + return true; + } } diff --git a/app/src/main/java/java/awt/Paint.java b/app/src/main/java/java/awt/Paint.java new file mode 100644 index 000000000..dfea3a74b --- /dev/null +++ b/app/src/main/java/java/awt/Paint.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Alexey A. Petrenko + * @version $Revision$ + */ + +package java.awt; + +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.ColorModel; + +/** + * The Paint interface provides possibility of generating color patterns in + * device space for fill, draw, or stroke operations in a Graphics2D. + * + * @since Android 1.0 + */ +public interface Paint extends Transparency { + + /** + * Creates the PaintContext which is used to generate color patterns for + * rendering operations of Graphics2D. + * + * @param cm + * the ColorModel object, or null. + * @param deviceBounds + * the Rectangle represents the bounding box of device space for + * the graphics rendering operations. + * @param userBounds + * the Rectangle represents bounding box of user space for the + * graphics rendering operations. + * @param xform + * the AffineTransform for translation from user space to device + * space. + * @param hints + * the RenderingHints preferences. + * @return the PaintContext for generating color patterns. + */ + PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, + AffineTransform xform, RenderingHints hints); +} diff --git a/app/src/main/java/java/awt/PaintContext.java b/app/src/main/java/java/awt/PaintContext.java new file mode 100644 index 000000000..966b6ca99 --- /dev/null +++ b/app/src/main/java/java/awt/PaintContext.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Alexey A. Petrenko + * @version $Revision$ + */ + +package java.awt; + +import java.awt.image.ColorModel; +import java.awt.image.Raster; + +/** + * The PaintContext interface determines the specific environment for generating + * color patterns in device space for fill, draw, or stroke rendering operations + * using Graphics2D. This interface provides colors through the Raster object + * associated with the specific ColorModel for Graphics2D rendering operations. + * + * @since Android 1.0 + */ +public interface PaintContext { + + /** + * Releases the resources allocated for the operation. + */ + void dispose(); + + /** + * Gets the color model. + * + * @return the ColorModel object. + */ + ColorModel getColorModel(); + + /** + * Gets the Raster which defines the colors of the specified rectangular + * area for Graphics2D rendering operations. + * + * @param x + * the X coordinate of the device space area for which colors are + * generated. + * @param y + * the Y coordinate of the device space area for which colors are + * generated. + * @param w + * the width of the device space area for which colors are + * generated. + * @param h + * the height of the device space area for which colors are + * generated. + * @return the Raster object which contains the colors of the specified + * rectangular area for Graphics2D rendering operations. + */ + Raster getRaster(int x, int y, int w, int h); +} diff --git a/app/src/main/java/java/awt/Polygon.java b/app/src/main/java/java/awt/Polygon.java new file mode 100644 index 000000000..de31eb989 --- /dev/null +++ b/app/src/main/java/java/awt/Polygon.java @@ -0,0 +1,515 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Denis M. Kishenko + * @version $Revision$ + */ + +package java.awt; + +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.PathIterator; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.io.Serializable; +import java.util.NoSuchElementException; + +import org.apache.harmony.awt.gl.*; +import org.apache.harmony.awt.internal.nls.Messages; + +/** + * The Polygon class defines an closed area specified by n vertices and n edges. + * The coordinates of the vertices are specified by x, y arrays. The edges are + * the line segments from the point (x[i], y[i]) to the point (x[i+1], y[i+1]), + * for -1 < i < (n-1) plus the line segment from the point (x[n-1], y[n-1]) to + * the point (x[0], y[0]) point. The Polygon is empty if the number of vertices + * is zero. + * + * @since Android 1.0 + */ +public class Polygon implements Shape, Serializable { + + /** + * The Constant serialVersionUID. + */ + private static final long serialVersionUID = -6460061437900069969L; + + /** + * The points buffer capacity. + */ + private static final int BUFFER_CAPACITY = 4; + + /** + * The number of Polygon vertices. + */ + public int npoints; + + /** + * The array of X coordinates of the vertices. + */ + public int[] xpoints; + + /** + * The array of Y coordinates of the vertices. + */ + public int[] ypoints; + + /** + * The smallest Rectangle that completely contains this Polygon. + */ + protected Rectangle bounds; + + /* + * Polygon path iterator + */ + /** + * The internal Class Iterator. + */ + class Iterator implements PathIterator { + + /** + * The source Polygon object. + */ + public Polygon p; + + /** + * The path iterator transformation. + */ + public AffineTransform t; + + /** + * The current segment index. + */ + public int index; + + /** + * Constructs a new Polygon.Iterator for the given polygon and + * transformation + * + * @param at + * the AffineTransform object to apply rectangle path. + * @param p + * the p. + */ + public Iterator(AffineTransform at, Polygon p) { + this.p = p; + this.t = at; + if (p.npoints == 0) { + index = 1; + } + } + + public int getWindingRule() { + return WIND_EVEN_ODD; + } + + public boolean isDone() { + return index > p.npoints; + } + + public void next() { + index++; + } + + public int currentSegment(double[] coords) { + if (isDone()) { + // awt.110=Iterator out of bounds + throw new NoSuchElementException(Messages.getString("awt.110")); //$NON-NLS-1$ + } + if (index == p.npoints) { + return SEG_CLOSE; + } + coords[0] = p.xpoints[index]; + coords[1] = p.ypoints[index]; + if (t != null) { + t.transform(coords, 0, coords, 0, 1); + } + return index == 0 ? SEG_MOVETO : SEG_LINETO; + } + + public int currentSegment(float[] coords) { + if (isDone()) { + // awt.110=Iterator out of bounds + throw new NoSuchElementException(Messages.getString("awt.110")); //$NON-NLS-1$ + } + if (index == p.npoints) { + return SEG_CLOSE; + } + coords[0] = p.xpoints[index]; + coords[1] = p.ypoints[index]; + if (t != null) { + t.transform(coords, 0, coords, 0, 1); + } + return index == 0 ? SEG_MOVETO : SEG_LINETO; + } + } + + /** + * Instantiates a new empty polygon. + */ + public Polygon() { + xpoints = new int[BUFFER_CAPACITY]; + ypoints = new int[BUFFER_CAPACITY]; + } + + /** + * Instantiates a new polygon with the specified number of vertices, and the + * given arrays of x, y vertex coordinates. The length of each coordinate + * array may not be less than the specified number of vertices but may be + * greater. Only the first n elements are used from each coordinate array. + * + * @param xpoints + * the array of X vertex coordinates. + * @param ypoints + * the array of Y vertex coordinates. + * @param npoints + * the number vertices of the polygon. + * @throws IndexOutOfBoundsException + * if the length of xpoints or ypoints is less than n. + * @throws NegativeArraySizeException + * if n is negative. + */ + public Polygon(int[] xpoints, int[] ypoints, int npoints) { + if (npoints > xpoints.length || npoints > ypoints.length) { + // awt.111=Parameter npoints is greater than array length + throw new IndexOutOfBoundsException(Messages.getString("awt.111")); //$NON-NLS-1$ + } + if (npoints < 0) { + // awt.112=Negative number of points + throw new NegativeArraySizeException(Messages.getString("awt.112")); //$NON-NLS-1$ + } + this.npoints = npoints; + this.xpoints = new int[npoints]; + this.ypoints = new int[npoints]; + System.arraycopy(xpoints, 0, this.xpoints, 0, npoints); + System.arraycopy(ypoints, 0, this.ypoints, 0, npoints); + } + + /** + * Resets the current Polygon to an empty Polygon. More precisely, the + * number of Polygon vertices is set to zero, but x, y coordinates arrays + * are not affected. + */ + public void reset() { + npoints = 0; + bounds = null; + } + + /** + * Invalidates the data that depends on the vertex coordinates. This method + * should be called after direct manipulations of the x, y vertex + * coordinates arrays to avoid unpredictable results of methods which rely + * on the bounding box. + */ + public void invalidate() { + bounds = null; + } + + /** + * Adds the point to the Polygon and updates the bounding box accordingly. + * + * @param px + * the X coordinate of the added vertex. + * @param py + * the Y coordinate of the added vertex. + */ + public void addPoint(int px, int py) { + if (npoints == xpoints.length) { + int[] tmp; + + tmp = new int[xpoints.length + BUFFER_CAPACITY]; + System.arraycopy(xpoints, 0, tmp, 0, xpoints.length); + xpoints = tmp; + + tmp = new int[ypoints.length + BUFFER_CAPACITY]; + System.arraycopy(ypoints, 0, tmp, 0, ypoints.length); + ypoints = tmp; + } + + xpoints[npoints] = px; + ypoints[npoints] = py; + npoints++; + + if (bounds != null) { + bounds.setFrameFromDiagonal(Math.min(bounds.getMinX(), px), Math.min(bounds.getMinY(), + py), Math.max(bounds.getMaxX(), px), Math.max(bounds.getMaxY(), py)); + } + } + + /** + * Gets the bounding rectangle of the Polygon. The bounding rectangle is the + * smallest rectangle which contains the Polygon. + * + * @return the bounding rectangle of the Polygon. + * @see java.awt.Shape#getBounds() + */ + public Rectangle getBounds() { + if (bounds != null) { + return bounds; + } + if (npoints == 0) { + return new Rectangle(); + } + + int bx1 = xpoints[0]; + int by1 = ypoints[0]; + int bx2 = bx1; + int by2 = by1; + + for (int i = 1; i < npoints; i++) { + int x = xpoints[i]; + int y = ypoints[i]; + if (x < bx1) { + bx1 = x; + } else if (x > bx2) { + bx2 = x; + } + if (y < by1) { + by1 = y; + } else if (y > by2) { + by2 = y; + } + } + + return bounds = new Rectangle(bx1, by1, bx2 - bx1, by2 - by1); + } + + /** + * Gets the bounding rectangle of the Polygon. The bounding rectangle is the + * smallest rectangle which contains the Polygon. + * + * @return the bounding rectangle of the Polygon. + * @deprecated Use getBounds() method. + */ + @Deprecated + public Rectangle getBoundingBox() { + return getBounds(); + } + + /** + * Gets the Rectangle2D which represents Polygon bounds. The bounding + * rectangle is the smallest rectangle which contains the Polygon. + * + * @return the bounding rectangle of the Polygon. + * @see java.awt.Shape#getBounds2D() + */ + public Rectangle2D getBounds2D() { + return getBounds().getBounds2D(); + } + + /** + * Translates all vertices of Polygon the specified distances along X, Y + * axis. + * + * @param mx + * the distance to translate horizontally. + * @param my + * the distance to translate vertically. + */ + public void translate(int mx, int my) { + for (int i = 0; i < npoints; i++) { + xpoints[i] += mx; + ypoints[i] += my; + } + if (bounds != null) { + bounds.translate(mx, my); + } + } + + /** + * Checks whether or not the point given by the coordinates x, y lies inside + * the Polygon. + * + * @param x + * the X coordinate of the point to check. + * @param y + * the Y coordinate of the point to check. + * @return true, if the specified point lies inside the Polygon, false + * otherwise. + * @deprecated Use contains(int, int) method. + */ + @Deprecated + public boolean inside(int x, int y) { + return contains((double)x, (double)y); + } + + /** + * Checks whether or not the point given by the coordinates x, y lies inside + * the Polygon. + * + * @param x + * the X coordinate of the point to check. + * @param y + * the Y coordinate of the point to check. + * @return true, if the specified point lies inside the Polygon, false + * otherwise. + */ + public boolean contains(int x, int y) { + return contains((double)x, (double)y); + } + + /** + * Checks whether or not the point with specified double coordinates lies + * inside the Polygon. + * + * @param x + * the X coordinate of the point to check. + * @param y + * the Y coordinate of the point to check. + * @return true, if the point given by the double coordinates lies inside + * the Polygon, false otherwise. + * @see java.awt.Shape#contains(double, double) + */ + public boolean contains(double x, double y) { + return Crossing.isInsideEvenOdd(Crossing.crossShape(this, x, y)); + } + + /** + * Checks whether or not the rectangle determined by the parameters [x, y, + * width, height] lies inside the Polygon. + * + * @param x + * the X coordinate of the rectangles's left upper corner as a + * double. + * @param y + * the Y coordinate of the rectangles's left upper corner as a + * double. + * @param width + * the width of rectangle as a double. + * @param height + * the height of rectangle as a double. + * @return true, if the specified rectangle lies inside the Polygon, false + * otherwise. + * @see java.awt.Shape#contains(double, double, double, double) + */ + public boolean contains(double x, double y, double width, double height) { + int cross = Crossing.intersectShape(this, x, y, width, height); + return cross != Crossing.CROSSING && Crossing.isInsideEvenOdd(cross); + } + + /** + * Checks whether or not the rectangle determined by the parameters [x, y, + * width, height] intersects the interior of the Polygon. + * + * @param x + * the X coordinate of the rectangles's left upper corner as a + * double. + * @param y + * the Y coordinate of the rectangles's left upper corner as a + * double. + * @param width + * the width of rectangle as a double. + * @param height + * the height of rectangle as a double. + * @return true, if the specified rectangle intersects the interior of the + * Polygon, false otherwise. + * @see java.awt.Shape#intersects(double, double, double, double) + */ + public boolean intersects(double x, double y, double width, double height) { + int cross = Crossing.intersectShape(this, x, y, width, height); + return cross == Crossing.CROSSING || Crossing.isInsideEvenOdd(cross); + } + + /** + * Checks whether or not the specified rectangle lies inside the Polygon. + * + * @param rect + * the Rectangle2D object. + * @return true, if the specified rectangle lies inside the Polygon, false + * otherwise. + * @see java.awt.Shape#contains(java.awt.geom.Rectangle2D) + */ + public boolean contains(Rectangle2D rect) { + return contains(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); + } + + /** + * Checks whether or not the specified Point lies inside the Polygon. + * + * @param point + * the Point object. + * @return true, if the specified Point lies inside the Polygon, false + * otherwise. + */ + public boolean contains(Point point) { + return contains(point.getX(), point.getY()); + } + + /** + * Checks whether or not the specified Point2D lies inside the Polygon. + * + * @param point + * the Point2D object. + * @return true, if the specified Point2D lies inside the Polygon, false + * otherwise. + * @see java.awt.Shape#contains(java.awt.geom.Point2D) + */ + public boolean contains(Point2D point) { + return contains(point.getX(), point.getY()); + } + + /** + * Checks whether or not the interior of rectangle specified by the + * Rectangle2D object intersects the interior of the Polygon. + * + * @param rect + * the Rectangle2D object. + * @return true, if the Rectangle2D intersects the interior of the Polygon, + * false otherwise. + * @see java.awt.Shape#intersects(java.awt.geom.Rectangle2D) + */ + public boolean intersects(Rectangle2D rect) { + return intersects(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); + } + + /** + * Gets the PathIterator object which gives the coordinates of the polygon, + * transformed according to the specified AffineTransform. + * + * @param t + * the specified AffineTransform object or null. + * @return PathIterator object for the Polygon. + * @see java.awt.Shape#getPathIterator(java.awt.geom.AffineTransform) + */ + public PathIterator getPathIterator(AffineTransform t) { + return new Iterator(t, this); + } + + /** + * Gets the PathIterator object which gives the coordinates of the polygon, + * transformed according to the specified AffineTransform. The flatness + * parameter is ignored. + * + * @param t + * the specified AffineTransform object or null. + * @param flatness + * the maximum number of the control points for a given curve + * which varies from colinear before a subdivided curve is + * replaced by a straight line connecting the endpoints. This + * parameter is ignored for the Polygon class. + * @return PathIterator object for the Polygon. + * @see java.awt.Shape#getPathIterator(java.awt.geom.AffineTransform, + * double) + */ + public PathIterator getPathIterator(AffineTransform t, double flatness) { + return new Iterator(t, this); + } + +} diff --git a/app/src/main/java/java/awt/RenderingHints.java b/app/src/main/java/java/awt/RenderingHints.java new file mode 100644 index 000000000..acf6fa15d --- /dev/null +++ b/app/src/main/java/java/awt/RenderingHints.java @@ -0,0 +1,606 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Alexey A. Petrenko + * @version $Revision$ + */ + +package java.awt; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +/** + * The RenderingHints class represents preferences for the rendering algorithms. + * The preferences are arbitrary and can be specified by Map objects or by + * key-value pairs. + * + * @since Android 1.0 + */ +public class RenderingHints implements Map, Cloneable { + + /** + * The Constant KEY_ALPHA_INTERPOLATION - alpha interpolation rendering hint + * key. + */ + public static final Key KEY_ALPHA_INTERPOLATION = new KeyImpl(1); + + /** + * The Constant VALUE_ALPHA_INTERPOLATION_DEFAULT - alpha interpolation + * rendering hint value. + */ + public static final Object VALUE_ALPHA_INTERPOLATION_DEFAULT = new KeyValue( + KEY_ALPHA_INTERPOLATION); + + /** + * The Constant VALUE_ALPHA_INTERPOLATION_SPEED - alpha interpolation + * rendering hint value. + */ + public static final Object VALUE_ALPHA_INTERPOLATION_SPEED = new KeyValue( + KEY_ALPHA_INTERPOLATION); + + /** + * The Constant VALUE_ALPHA_INTERPOLATION_QUALITY - alpha interpolation + * rendering hint value. + */ + public static final Object VALUE_ALPHA_INTERPOLATION_QUALITY = new KeyValue( + KEY_ALPHA_INTERPOLATION); + + /** + * The Constant KEY_ANTIALIASING - antialiasing rendering hint key. + */ + public static final Key KEY_ANTIALIASING = new KeyImpl(2); + + /** + * The Constant VALUE_ANTIALIAS_DEFAULT - antialiasing rendering hint value. + */ + public static final Object VALUE_ANTIALIAS_DEFAULT = new KeyValue(KEY_ANTIALIASING); + + /** + * The Constant VALUE_ANTIALIAS_ON - antialiasing rendering hint value. + */ + public static final Object VALUE_ANTIALIAS_ON = new KeyValue(KEY_ANTIALIASING); + + /** + * The Constant VALUE_ANTIALIAS_OFF - antialiasing rendering hint value. + */ + public static final Object VALUE_ANTIALIAS_OFF = new KeyValue(KEY_ANTIALIASING); + + /** + * The Constant KEY_COLOR_RENDERING - color rendering hint key. + */ + public static final Key KEY_COLOR_RENDERING = new KeyImpl(3); + + /** + * The Constant VALUE_COLOR_RENDER_DEFAULT - color rendering hint value. + */ + public static final Object VALUE_COLOR_RENDER_DEFAULT = new KeyValue(KEY_COLOR_RENDERING); + + /** + * The Constant VALUE_COLOR_RENDER_SPEED - color rendering hint value. + */ + public static final Object VALUE_COLOR_RENDER_SPEED = new KeyValue(KEY_COLOR_RENDERING); + + /** + * The Constant VALUE_COLOR_RENDER_QUALITY - color rendering hint value. + */ + public static final Object VALUE_COLOR_RENDER_QUALITY = new KeyValue(KEY_COLOR_RENDERING); + + /** + * The Constant KEY_DITHERING - dithering rendering hint key. + */ + public static final Key KEY_DITHERING = new KeyImpl(4); + + /** + * The Constant VALUE_DITHER_DEFAULT - dithering rendering hint value. + */ + public static final Object VALUE_DITHER_DEFAULT = new KeyValue(KEY_DITHERING); + + /** + * The Constant VALUE_DITHER_DISABLE - dithering rendering hint value. + */ + public static final Object VALUE_DITHER_DISABLE = new KeyValue(KEY_DITHERING); + + /** + * The Constant VALUE_DITHER_DISABLE - dithering rendering hint value. + */ + public static final Object VALUE_DITHER_ENABLE = new KeyValue(KEY_DITHERING); + + /** + * The Constant KEY_FRACTIONALMETRICS - fractional metrics rendering hint + * key. + */ + public static final Key KEY_FRACTIONALMETRICS = new KeyImpl(5); + + /** + * The Constant VALUE_FRACTIONALMETRICS_DEFAULT - fractional metrics + * rendering hint value. + */ + public static final Object VALUE_FRACTIONALMETRICS_DEFAULT = new KeyValue(KEY_FRACTIONALMETRICS); + + /** + * The Constant VALUE_FRACTIONALMETRICS_ON - fractional metrics rendering + * hint value. + */ + public static final Object VALUE_FRACTIONALMETRICS_ON = new KeyValue(KEY_FRACTIONALMETRICS); + + /** + * The Constant VALUE_FRACTIONALMETRICS_OFF - fractional metrics rendering + * hint value. + */ + public static final Object VALUE_FRACTIONALMETRICS_OFF = new KeyValue(KEY_FRACTIONALMETRICS); + + /** + * The Constant KEY_INTERPOLATION - interpolation rendering hint key. + */ + public static final Key KEY_INTERPOLATION = new KeyImpl(6); + + /** + * The Constant VALUE_INTERPOLATION_BICUBIC - interpolation rendering hint + * value. + */ + public static final Object VALUE_INTERPOLATION_BICUBIC = new KeyValue(KEY_INTERPOLATION); + + /** + * The Constant VALUE_INTERPOLATION_BILINEAR - interpolation rendering hint + * value. + */ + public static final Object VALUE_INTERPOLATION_BILINEAR = new KeyValue(KEY_INTERPOLATION); + + /** + * The Constant VALUE_INTERPOLATION_NEAREST_NEIGHBOR - interpolation + * rendering hint value. + */ + public static final Object VALUE_INTERPOLATION_NEAREST_NEIGHBOR = new KeyValue( + KEY_INTERPOLATION); + + /** + * The Constant KEY_RENDERING - rendering hint key. + */ + public static final Key KEY_RENDERING = new KeyImpl(7); + + /** + * The Constant VALUE_RENDER_DEFAULT - rendering hint value. + */ + public static final Object VALUE_RENDER_DEFAULT = new KeyValue(KEY_RENDERING); + + /** + * The Constant VALUE_RENDER_SPEED - rendering hint value. + */ + public static final Object VALUE_RENDER_SPEED = new KeyValue(KEY_RENDERING); + + /** + * The Constant VALUE_RENDER_QUALITY - rendering hint value. + */ + public static final Object VALUE_RENDER_QUALITY = new KeyValue(KEY_RENDERING); + + /** + * The Constant KEY_STROKE_CONTROL - stroke control hint key. + */ + public static final Key KEY_STROKE_CONTROL = new KeyImpl(8); + + /** + * The Constant VALUE_STROKE_DEFAULT - stroke hint value. + */ + public static final Object VALUE_STROKE_DEFAULT = new KeyValue(KEY_STROKE_CONTROL); + + /** + * The Constant VALUE_STROKE_NORMALIZE - stroke hint value. + */ + public static final Object VALUE_STROKE_NORMALIZE = new KeyValue(KEY_STROKE_CONTROL); + + /** + * The Constant VALUE_STROKE_PURE - stroke hint value. + */ + public static final Object VALUE_STROKE_PURE = new KeyValue(KEY_STROKE_CONTROL); + + /** + * The Constant KEY_TEXT_ANTIALIASING - text antialiasing hint key. + */ + public static final Key KEY_TEXT_ANTIALIASING = new KeyImpl(9); + + /** + * The Constant VALUE_TEXT_ANTIALIAS_DEFAULT - text antialiasing hint key. + */ + public static final Object VALUE_TEXT_ANTIALIAS_DEFAULT = new KeyValue(KEY_TEXT_ANTIALIASING); + + /** + * The Constant VALUE_TEXT_ANTIALIAS_ON - text antialiasing hint key. + */ + public static final Object VALUE_TEXT_ANTIALIAS_ON = new KeyValue(KEY_TEXT_ANTIALIASING); + + /** + * The Constant VALUE_TEXT_ANTIALIAS_OFF - text antialiasing hint key. + */ + public static final Object VALUE_TEXT_ANTIALIAS_OFF = new KeyValue(KEY_TEXT_ANTIALIASING); + + /** The map. */ + private HashMap map = new HashMap(); + + /** + * Instantiates a new rendering hints object from specified Map object with + * defined key/value pairs or null for empty RenderingHints. + * + * @param map + * the Map object with defined key/value pairs or null for empty + * RenderingHints. + */ + public RenderingHints(Map map) { + super(); + if (map != null) { + putAll(map); + } + } + + /** + * Instantiates a new rendering hints object with the specified key/value + * pair. + * + * @param key + * the key of hint property. + * @param value + * the value of hint property. + */ + public RenderingHints(Key key, Object value) { + super(); + put(key, value); + } + + /** + * Adds the properties represented by key/value pairs from the specified + * RenderingHints object to current object. + * + * @param hints + * the RenderingHints to be added. + */ + public void add(RenderingHints hints) { + map.putAll(hints.map); + } + + /** + * Puts the specified value to the specified key. Neither the key nor the + * value can be null. + * + * @param key + * the rendering hint key. + * @param value + * the rendering hint value. + * @return the previous rendering hint value assigned to the key or null. + */ + public Object put(Object key, Object value) { + if (!((Key)key).isCompatibleValue(value)) { + throw new IllegalArgumentException(); + } + + return map.put(key, value); + } + + /** + * Removes the specified key and corresponding value from the RenderingHints + * object. + * + * @param key + * the specified hint key to be removed. + * @return the object of previous rendering hint value which is assigned to + * the specified key, or null. + */ + public Object remove(Object key) { + return map.remove(key); + } + + /** + * Gets the value assigned to the specified key. + * + * @param key + * the rendering hint key. + * @return the object assigned to the specified key. + */ + public Object get(Object key) { + return map.get(key); + } + + /** + * Returns a set of rendering hints keys for current RenderingHints object. + * + * @return the set of rendering hints keys. + */ + public Set keySet() { + return map.keySet(); + } + + /** + * Returns a set of Map.Entry objects which contain current RenderingHint + * key/value pairs. + * + * @return the a set of mapped RenderingHint key/value pairs. + */ + public Set> entrySet() { + return map.entrySet(); + } + + /** + * Puts all of the preferences from the specified Map into the current + * RenderingHints object. These mappings replace all existing preferences. + * + * @param m + * the specified Map of preferences. + */ + public void putAll(Map m) { + if (m instanceof RenderingHints) { + map.putAll(((RenderingHints)m).map); + } else { + Set entries = m.entrySet(); + + if (entries != null) { + Iterator it = entries.iterator(); + while (it.hasNext()) { + Map.Entry entry = (Map.Entry)it.next(); + Key key = (Key)entry.getKey(); + Object val = entry.getValue(); + put(key, val); + } + } + } + } + + /** + * Returns a Collection of values contained in current RenderingHints + * object. + * + * @return the Collection of RenderingHints's values. + */ + public Collection values() { + return map.values(); + } + + /** + * Checks whether or not current RenderingHints object contains at least one + * the value which is equal to the specified Object. + * + * @param value + * the specified Object. + * @return true, if the specified object is assigned to at least one + * RenderingHint's key, false otherwise. + */ + public boolean containsValue(Object value) { + return map.containsValue(value); + } + + /** + * Checks whether or not current RenderingHints object contains the key + * which is equal to the specified Object. + * + * @param key + * the specified Object. + * @return true, if the RenderingHints object contains the specified Object + * as a key, false otherwise. + */ + public boolean containsKey(Object key) { + if (key == null) { + throw new NullPointerException(); + } + + return map.containsKey(key); + } + + /** + * Checks whether or not the RenderingHints object contains any key/value + * pairs. + * + * @return true, if the RenderingHints object is empty, false otherwise. + */ + public boolean isEmpty() { + return map.isEmpty(); + } + + /** + * Clears the RenderingHints of all key/value pairs. + */ + public void clear() { + map.clear(); + } + + /** + * Returns the number of key/value pairs in the RenderingHints. + * + * @return the number of key/value pairs. + */ + public int size() { + return map.size(); + } + + /** + * Compares the RenderingHints object with the specified object. + * + * @param o + * the specified Object to be compared. + * @return true, if the Object is a Map whose key/value pairs match this + * RenderingHints' key/value pairs, false otherwise. + */ + @Override + public boolean equals(Object o) { + if (!(o instanceof Map)) { + return false; + } + + Map m = (Map)o; + Set keys = keySet(); + if (!keys.equals(m.keySet())) { + return false; + } + + Iterator it = keys.iterator(); + while (it.hasNext()) { + Key key = (Key)it.next(); + Object v1 = get(key); + Object v2 = m.get(key); + if (!(v1 == null ? v2 == null : v1.equals(v2))) { + return false; + } + } + return true; + } + + /** + * Returns the hash code for this RenderingHints object. + * + * @return the hash code for this RenderingHints object. + */ + @Override + public int hashCode() { + return map.hashCode(); + } + + /** + * Returns the clone of the RenderingHints object with the same contents. + * + * @return the clone of the RenderingHints instance. + */ + @SuppressWarnings("unchecked") + @Override + public Object clone() { + RenderingHints clone = new RenderingHints(null); + clone.map = (HashMap)this.map.clone(); + return clone; + } + + /** + * Returns the string representation of the RenderingHints object. + * + * @return the String object which represents RenderingHints object. + */ + @Override + public String toString() { + return "RenderingHints[" + map.toString() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ + } + + /** + * The RenderingHints.Key class is abstract and defines a base type for all + * RenderingHints keys. + * + * @since Android 1.0 + */ + public abstract static class Key { + + /** The key. */ + private final int key; + + /** + * Instantiates a new key with unique integer identifier. No two objects + * of the same subclass with the same integer key can be instantiated. + * + * @param key + * the unique key. + */ + protected Key(int key) { + this.key = key; + } + + /** + * Compares the Key object with the specified object. + * + * @param o + * the specified Object to be compared. + * @return true, if the Key is equal to the specified object, false + * otherwise. + */ + @Override + public final boolean equals(Object o) { + return this == o; + } + + /** + * Returns the hash code for this Key object. + * + * @return the hash code for this Key object. + */ + @Override + public final int hashCode() { + return System.identityHashCode(this); + } + + /** + * Returns integer unique key with which this Key object has been + * instantiated. + * + * @return the integer unique key with which this Key object has been + * instantiated. + */ + protected final int intKey() { + return key; + } + + /** + * Checks whether or not specified value is compatible with the Key. + * + * @param val + * the Object. + * @return true, if the specified value is compatible with the Key, + * false otherwise. + */ + public abstract boolean isCompatibleValue(Object val); + } + + /** + * Private implementation of Key class. + */ + private static class KeyImpl extends Key { + + /** + * Instantiates a new key implementation. + * + * @param key + * the key. + */ + protected KeyImpl(int key) { + super(key); + } + + @Override + public boolean isCompatibleValue(Object val) { + if (!(val instanceof KeyValue)) { + return false; + } + + return ((KeyValue)val).key == this; + } + } + + /** + * Private class KeyValue is used as value for Key class instance. + */ + private static class KeyValue { + + /** + * The key. + */ + private final Key key; + + /** + * Instantiates a new key value. + * + * @param key + * the key. + */ + protected KeyValue(Key key) { + this.key = key; + } + } +} diff --git a/app/src/main/java/java/awt/Stroke.java b/app/src/main/java/java/awt/Stroke.java new file mode 100644 index 000000000..6d17a23bd --- /dev/null +++ b/app/src/main/java/java/awt/Stroke.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @author Alexey A. Petrenko + * @version $Revision$ + */ + +package java.awt; + +/** + * The Stroke interface gives a pen style to be used by the Graphics2D + * interface. It provides a means for getting a stroked version of a shape, + * which is the version that is suitable for drawing via the Graphics2D + * interface. Stroking a shape gives the shape's outline a width or drawing + * style. + *

+ * The Draw methods from Graphics2D interface should use the Stroke object for + * rendering the shape's outline. The stroke should be set by + * setStroke(java.awt.Stroke) method of the Graphics2D interface. + * + * @see java.awt.Graphics2D#setStroke(java.awt.Stroke) + * @since Android 1.0 + */ +public interface Stroke { + + /** + * Creates the stroked shape, which is the version that is suitable for + * drawing via the Graphics2D interface. Stroking a shape gives the shape's + * outline a width or drawing style. + * + * @param p + * the original shape. + * @return the stroked shape. + */ + public Shape createStrokedShape(Shape p); +} diff --git a/app/src/main/java/java/awt/datatransfer/Clipboard.java b/app/src/main/java/java/awt/datatransfer/Clipboard.java index 80fe5ff0a..7eb6fda5f 100644 --- a/app/src/main/java/java/awt/datatransfer/Clipboard.java +++ b/app/src/main/java/java/awt/datatransfer/Clipboard.java @@ -20,7 +20,7 @@ public class Clipboard extends Object public void run() { ClipboardManager clipboard = (ClipboardManager) act.getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("Minecraft", ((StringSelection) contents).getString()); + ClipData clip = ClipData.newPlainText("Copied text", ((StringSelection) contents).getString()); clipboard.setPrimaryClip(clip); Toast.makeText(act, "Copied to clipboard!", Toast.LENGTH_SHORT).show(); @@ -30,15 +30,4 @@ public class Clipboard extends Object e.printStackTrace(); } } - - public synchronized Transferable getContents(Object requestor) { - try { - final Activity act = ModdingKit.getCurrentActivity(); - ClipboardManager clipboard = (ClipboardManager) act.getSystemService(Context.CLIPBOARD_SERVICE); - return new StringSelection(clipboard.getText().toString()); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } } diff --git a/app/src/main/java/java/awt/geom/FlatteningPathIterator.java b/app/src/main/java/java/awt/geom/FlatteningPathIterator.java index 72b460dad..8208f3963 100644 --- a/app/src/main/java/java/awt/geom/FlatteningPathIterator.java +++ b/app/src/main/java/java/awt/geom/FlatteningPathIterator.java @@ -233,7 +233,7 @@ public class FlatteningPathIterator implements PathIterator { bufIndex -= 6; buf[bufIndex + 0] = px; buf[bufIndex + 1] = py; - net.kdt.pojavlaunch.SystemCrackResolver.arraycopy(coords, 0, buf, bufIndex + 2, 4); + System.arraycopy(coords, 0, buf, bufIndex + 2, 4); bufSubdiv = 0; } @@ -245,7 +245,7 @@ public class FlatteningPathIterator implements PathIterator { // Realloc buffer if (bufIndex <= 4) { double tmp[] = new double[bufSize + BUFFER_CAPACITY]; - net.kdt.pojavlaunch.SystemCrackResolver.arraycopy(buf, bufIndex, tmp, bufIndex + BUFFER_CAPACITY, bufSize + System.arraycopy(buf, bufIndex, tmp, bufIndex + BUFFER_CAPACITY, bufSize - bufIndex); buf = tmp; bufSize += BUFFER_CAPACITY; @@ -275,7 +275,7 @@ public class FlatteningPathIterator implements PathIterator { bufIndex -= 8; buf[bufIndex + 0] = px; buf[bufIndex + 1] = py; - net.kdt.pojavlaunch.SystemCrackResolver.arraycopy(coords, 0, buf, bufIndex + 2, 6); + System.arraycopy(coords, 0, buf, bufIndex + 2, 6); bufSubdiv = 0; } @@ -287,7 +287,7 @@ public class FlatteningPathIterator implements PathIterator { // Realloc buffer if (bufIndex <= 6) { double tmp[] = new double[bufSize + BUFFER_CAPACITY]; - net.kdt.pojavlaunch.SystemCrackResolver.arraycopy(buf, bufIndex, tmp, bufIndex + BUFFER_CAPACITY, bufSize + System.arraycopy(buf, bufIndex, tmp, bufIndex + BUFFER_CAPACITY, bufSize - bufIndex); buf = tmp; bufSize += BUFFER_CAPACITY; diff --git a/app/src/main/java/java/awt/geom/GeneralPath.java b/app/src/main/java/java/awt/geom/GeneralPath.java index 681324bc6..0669bc77b 100644 --- a/app/src/main/java/java/awt/geom/GeneralPath.java +++ b/app/src/main/java/java/awt/geom/GeneralPath.java @@ -181,7 +181,7 @@ public final class GeneralPath implements Shape, Cloneable { } int type = p.types[typeIndex]; int count = GeneralPath.pointShift[type]; - net.kdt.pojavlaunch.SystemCrackResolver.arraycopy(p.points, pointIndex, coords, 0, count); + System.arraycopy(p.points, pointIndex, coords, 0, count); if (t != null) { t.transform(coords, 0, coords, 0, count / 2); } @@ -290,12 +290,12 @@ public final class GeneralPath implements Shape, Cloneable { } if (typeSize == types.length) { byte tmp[] = new byte[typeSize + BUFFER_CAPACITY]; - net.kdt.pojavlaunch.SystemCrackResolver.arraycopy(types, 0, tmp, 0, typeSize); + System.arraycopy(types, 0, tmp, 0, typeSize); types = tmp; } if (pointSize + pointCount > points.length) { float tmp[] = new float[pointSize + Math.max(BUFFER_CAPACITY * 2, pointCount)]; - net.kdt.pojavlaunch.SystemCrackResolver.arraycopy(points, 0, tmp, 0, pointSize); + System.arraycopy(points, 0, tmp, 0, pointSize); points = tmp; } } diff --git a/app/src/main/java/java/awt/image/BufferedImage.java b/app/src/main/java/java/awt/image/BufferedImage.java index 629bed330..e5d2a3fa5 100644 --- a/app/src/main/java/java/awt/image/BufferedImage.java +++ b/app/src/main/java/java/awt/image/BufferedImage.java @@ -14,7 +14,6 @@ public class BufferedImage extends Image implements RenderedImage { private Bitmap mkBitmap(int width, int height, Config mode) { return Bitmap.createBitmap(width, height, mode); } - public BufferedImage(Bitmap bitmap) { if (bitmap != null) { this.bitmap = bitmap; diff --git a/app/src/main/java/java/awt/mod/ModdingKit.java b/app/src/main/java/java/awt/mod/ModdingKit.java index 55f9b5db1..8ef5edfd8 100644 --- a/app/src/main/java/java/awt/mod/ModdingKit.java +++ b/app/src/main/java/java/awt/mod/ModdingKit.java @@ -1,14 +1,15 @@ package java.awt.mod; -import android.app.*; import android.graphics.*; +import android.util.*; import java.awt.image.*; import java.lang.reflect.*; import java.util.*; +import net.kdt.pojavlaunch.*; public class ModdingKit { - public static Activity getCurrentActivity() + public static MainActivity getCurrentActivity() { try { Class activityThreadClass = Class.forName("android.app.ActivityThread"); @@ -26,7 +27,7 @@ public class ModdingKit if (!pausedField.getBoolean(activityRecord)) { Field activityField = activityRecordClass.getDeclaredField("activity"); activityField.setAccessible(true); - Activity activity = (Activity) activityField.get(activityRecord); + MainActivity activity = (MainActivity) activityField.get(activityRecord); return activity; } } diff --git a/app/src/main/java/java/beans/FeatureDescriptor.java b/app/src/main/java/java/beans/FeatureDescriptor.java new file mode 100644 index 000000000..2945c65b8 --- /dev/null +++ b/app/src/main/java/java/beans/FeatureDescriptor.java @@ -0,0 +1,234 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package java.beans; + +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; + +/** + * Common base class for Descriptors. + */ +public class FeatureDescriptor { + + private Map values; + + boolean preferred, hidden, expert; + + String shortDescription; + + String name; + + String displayName; + + /** + *

+ * Constructs an instance. + *

+ */ + public FeatureDescriptor() { + this.values = new HashMap(); + } + + /** + *

+ * Sets the value for the named attribute. + *

+ * + * @param attributeName + * The name of the attribute to set a value with. + * @param value + * The value to set. + */ + public void setValue(String attributeName, Object value) { + if (attributeName == null || value == null) { + throw new NullPointerException(); + } + values.put(attributeName, value); + } + + /** + *

+ * Gets the value associated with the named attribute. + *

+ * + * @param attributeName + * The name of the attribute to get a value for. + * @return The attribute's value. + */ + public Object getValue(String attributeName) { + Object result = null; + if (attributeName != null) { + result = values.get(attributeName); + } + return result; + } + + /** + *

+ * Enumerates the attribute names. + *

+ * + * @return An instance of {@link Enumeration}. + */ + public Enumeration attributeNames() { + // Create a new list, so that the references are copied + return Collections.enumeration(new LinkedList(values.keySet())); + } + + /** + *

+ * Sets the short description. + *

+ * + * @param text + * The description to set. + */ + public void setShortDescription(String text) { + this.shortDescription = text; + } + + /** + *

+ * Sets the name. + *

+ * + * @param name + * The name to set. + */ + public void setName(String name) { + this.name = name; + } + + /** + *

+ * Sets the display name. + *

+ * + * @param displayName + * The display name to set. + */ + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + /** + *

+ * Gets the short description or {@link #getDisplayName()} if not set. + *

+ * + * @return The description. + */ + public String getShortDescription() { + return shortDescription == null ? getDisplayName() : shortDescription; + } + + /** + *

+ * Gets the name. + *

+ * + * @return The name. + */ + public String getName() { + return name; + } + + /** + *

+ * Gets the display name or {@link #getName()} if not set. + *

+ * + * @return The display name. + */ + public String getDisplayName() { + return displayName == null ? getName() : displayName; + } + + /** + *

+ * Sets the preferred indicator. + *

+ * + * @param preferred + * true if preferred, false + * otherwise. + */ + public void setPreferred(boolean preferred) { + this.preferred = preferred; + } + + /** + *

+ * Sets the hidden indicator. + *

+ * + * @param hidden + * true if hidden, false otherwise. + */ + public void setHidden(boolean hidden) { + this.hidden = hidden; + } + + /** + *

+ * Sets the expert indicator. + *

+ * + * @param expert + * true if expert, false otherwise. + */ + public void setExpert(boolean expert) { + this.expert = expert; + } + + /** + *

+ * Indicates if this feature is preferred. + *

+ * + * @return true if preferred, false otherwise. + */ + public boolean isPreferred() { + return preferred; + } + + /** + *

+ * Indicates if this feature is hidden. + *

+ * + * @return true if hidden, false otherwise. + */ + public boolean isHidden() { + return hidden; + } + + /** + *

+ * Indicates if this feature is an expert feature. + *

+ * + * @return true if hidden, false otherwise. + */ + public boolean isExpert() { + return expert; + } +} diff --git a/app/src/main/java/java/beans/IndexedPropertyDescriptor.java b/app/src/main/java/java/beans/IndexedPropertyDescriptor.java new file mode 100644 index 000000000..25667d96e --- /dev/null +++ b/app/src/main/java/java/beans/IndexedPropertyDescriptor.java @@ -0,0 +1,227 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package java.beans; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import org.apache.harmony.beans.internal.nls.Messages; + +public class IndexedPropertyDescriptor extends PropertyDescriptor { + private Method indexedGetter; + + private Method indexedSetter; + + public IndexedPropertyDescriptor(String propertyName, Class beanClass, + String getterName, String setterName, String indexedGetterName, + String indexedSetterName) throws IntrospectionException { + super(propertyName, beanClass, getterName, setterName); + + // RI behaves like this + if (indexedGetterName == null && indexedSetterName == null && + (getterName != null || setterName != null)) { + throw new IntrospectionException(Messages.getString("beans.50")); + } + setIndexedReadMethod(beanClass, indexedGetterName); + setIndexedWriteMethod(beanClass, indexedSetterName); + } + + public IndexedPropertyDescriptor(String propertyName, Method getter, Method setter, + Method indexedGetter, Method indexedSetter) throws IntrospectionException { + super(propertyName, getter, setter); + + // we need this in order to be compatible with RI + if (indexedGetter == null && indexedSetter == null && + (getter != null || setter != null)) { + throw new IntrospectionException(Messages.getString("beans.50")); + } + setIndexedReadMethod(indexedGetter); + setIndexedWriteMethod(indexedSetter); + } + + public IndexedPropertyDescriptor(String propertyName, Class beanClass) + throws IntrospectionException { + super(propertyName, beanClass, null, null); + String getterName; + String setterName; + String indexedGetterName; + String indexedSetterName; + + // array getter + getterName = createDefaultMethodName(propertyName, "get"); //$NON-NLS-1$ + if (hasMethod(beanClass, getterName)) { + setReadMethod(beanClass, getterName); + } + // array setter + setterName = createDefaultMethodName(propertyName, "set"); //$NON-NLS-1$ + if (hasMethod(beanClass, setterName)) { + setWriteMethod(beanClass, setterName); + } + // indexed getter + indexedGetterName = createDefaultMethodName(propertyName, "get"); //$NON-NLS-1$ + if (hasMethod(beanClass, indexedGetterName)) { + setIndexedReadMethod(beanClass, indexedGetterName); + } + // indexed setter + indexedSetterName = createDefaultMethodName(propertyName, "set"); //$NON-NLS-1$ + if (hasMethod(beanClass, indexedSetterName)) { + setIndexedWriteMethod(beanClass, indexedSetterName); + } + // RI seems to behave a bit differently + if (indexedGetter == null && indexedSetter == null && + getReadMethod() == null && getWriteMethod() == null) { + throw new IntrospectionException( + Messages.getString("beans.01", propertyName)); //$NON-NLS-1$ + } + if (indexedGetter == null && indexedSetter == null) { + // not an indexed property indeed + throw new IntrospectionException(Messages.getString("beans.50")); + } + } + + public void setIndexedReadMethod(Method indexedGetter) throws IntrospectionException { + if (indexedGetter != null) { + int modifiers = indexedGetter.getModifiers(); + Class[] parameterTypes; + Class returnType; + Class indexedPropertyType; + + if (!Modifier.isPublic(modifiers)) { + throw new IntrospectionException(Messages.getString("beans.21")); //$NON-NLS-1$ + } + parameterTypes = indexedGetter.getParameterTypes(); + if (parameterTypes.length != 1) { + throw new IntrospectionException(Messages.getString("beans.22")); //$NON-NLS-1$ + } + if (!parameterTypes[0].equals(int.class)) { + throw new IntrospectionException(Messages.getString("beans.23")); //$NON-NLS-1$ + } + returnType = indexedGetter.getReturnType(); + indexedPropertyType = getIndexedPropertyType(); + if ((indexedPropertyType != null) && !returnType.equals(indexedPropertyType)) { + throw new IntrospectionException(Messages.getString("beans.24")); //$NON-NLS-1$ + } + } + this.indexedGetter = indexedGetter; + } + + public void setIndexedWriteMethod(Method indexedSetter) throws IntrospectionException { + if (indexedSetter != null) { + int modifiers = indexedSetter.getModifiers(); + Class[] parameterTypes; + Class firstParameterType; + Class secondParameterType; + Class propType; + + if (!Modifier.isPublic(modifiers)) { + throw new IntrospectionException(Messages.getString("beans.25")); //$NON-NLS-1$ + } + parameterTypes = indexedSetter.getParameterTypes(); + if (parameterTypes.length != 2) { + throw new IntrospectionException(Messages.getString("beans.26")); //$NON-NLS-1$ + } + firstParameterType = parameterTypes[0]; + if (!firstParameterType.equals(int.class)) { + throw new IntrospectionException(Messages.getString("beans.27")); //$NON-NLS-1$ + } + secondParameterType = parameterTypes[1]; + propType = getIndexedPropertyType(); + if (propType != null && !secondParameterType.equals(propType)) { + throw new IntrospectionException(Messages.getString("beans.28")); //$NON-NLS-1$ + } + } + this.indexedSetter = indexedSetter; + } + + public Method getIndexedWriteMethod() { + return indexedSetter; + } + + public Method getIndexedReadMethod() { + return indexedGetter; + } + + @Override + public boolean equals(Object obj) { + boolean result = super.equals(obj); + + if (result) { + IndexedPropertyDescriptor pd = (IndexedPropertyDescriptor) obj; + + if (indexedGetter != null) { + result = indexedGetter.equals(pd.getIndexedReadMethod()); + } else if (result && indexedGetter == null) { + result = pd.getIndexedReadMethod() == null; + } + + if (result) { + if (indexedSetter != null) { + result = indexedSetter.equals(pd.getIndexedWriteMethod()); + } else if (indexedSetter == null) { + result = pd.getIndexedWriteMethod() == null; + } + } + } + + return result; + } + + public Class getIndexedPropertyType() { + Class result = null; + + if (indexedGetter != null) { + result = indexedGetter.getReturnType(); + } else if (indexedSetter != null) { + Class[] parameterTypes = indexedSetter.getParameterTypes(); + + result = parameterTypes[1]; + } + return result; + } + + private void setIndexedReadMethod(Class beanClass, String indexedGetterName) { + Method[] getters = findMethods(beanClass, indexedGetterName); + boolean result = false; + + for (Method element : getters) { + try { + setIndexedReadMethod(element); + result = true; + } catch (IntrospectionException ie) {} + + if (result) { + break; + } + } + } + + private void setIndexedWriteMethod(Class beanClass, String indexedSetterName) { + Method[] setters = findMethods(beanClass, indexedSetterName); + boolean result = false; + + for (Method element : setters) { + try { + setIndexedWriteMethod(element); + result = true; + } catch (IntrospectionException ie) {} + + if (result) { + break; + } + } + } +} diff --git a/app/src/main/java/java/beans/IntrospectionException.java b/app/src/main/java/java/beans/IntrospectionException.java new file mode 100644 index 000000000..c895afe07 --- /dev/null +++ b/app/src/main/java/java/beans/IntrospectionException.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package java.beans; + +public class IntrospectionException extends Exception { + + static final long serialVersionUID = -3728150539969542619L; + + public IntrospectionException(String message) { + super(message); + } +} diff --git a/app/src/main/java/java/beans/PropertyDescriptor.java b/app/src/main/java/java/beans/PropertyDescriptor.java new file mode 100644 index 000000000..93891525a --- /dev/null +++ b/app/src/main/java/java/beans/PropertyDescriptor.java @@ -0,0 +1,300 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package java.beans; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Vector; +import org.apache.harmony.beans.internal.nls.Messages; + +public class PropertyDescriptor extends FeatureDescriptor { + private Method getter; + + private Method setter; + + private Class propertyEditorClass; + + private boolean constrained; + + private boolean bound; + + public PropertyDescriptor(String propertyName, Class beanClass, String getterName, + String setterName) throws IntrospectionException { + super(); + if (beanClass == null) { + throw new IntrospectionException(Messages.getString("beans.03")); //$NON-NLS-1$ + } + if (propertyName == null || propertyName.length() == 0) { + throw new IntrospectionException(Messages.getString("beans.04")); //$NON-NLS-1$ + } + this.setName(propertyName); + this.setDisplayName(propertyName); + if (setterName != null) { + if (hasMethod(beanClass, setterName)) { + setWriteMethod(beanClass, setterName); + } else { + throw new IntrospectionException(Messages.getString("beans.20")); //$NON-NLS-1$ + } + } + if (getterName != null) { + if (hasMethod(beanClass, getterName)) { + setReadMethod(beanClass, getterName); + } else { + throw new IntrospectionException(Messages.getString("beans.1F")); //$NON-NLS-1$ + } + } + } + + public PropertyDescriptor(String propertyName, Method getter, Method setter) + throws IntrospectionException { + super(); + if (propertyName == null || propertyName.length() == 0) { + throw new IntrospectionException(Messages.getString("beans.04")); //$NON-NLS-1$ + } + this.setName(propertyName); + this.setDisplayName(propertyName); + setWriteMethod(setter); + setReadMethod(getter); + } + + public PropertyDescriptor(String propertyName, Class beanClass) + throws IntrospectionException { + String getterName; + String setterName; + if (beanClass == null) { + throw new IntrospectionException(Messages.getString("beans.03")); //$NON-NLS-1$ + } + if (propertyName == null || propertyName.length() == 0) { + throw new IntrospectionException(Messages.getString("beans.04")); //$NON-NLS-1$ + } + this.setName(propertyName); + this.setDisplayName(propertyName); + getterName = createDefaultMethodName(propertyName, "is"); //$NON-NLS-1$ + if (hasMethod(beanClass, getterName)) { + setReadMethod(beanClass, getterName); + } else { + getterName = createDefaultMethodName(propertyName, "get"); //$NON-NLS-1$ + if (hasMethod(beanClass, getterName)) { + setReadMethod(beanClass, getterName); + } + } + setterName = createDefaultMethodName(propertyName, "set"); //$NON-NLS-1$ + if (hasMethod(beanClass, setterName)) { + setWriteMethod(beanClass, setterName); + } + if (getter == null && setter == null) { + throw new IntrospectionException(Messages.getString("beans.01", propertyName)); //$NON-NLS-1$ + } + } + + public void setWriteMethod(Method setter) throws IntrospectionException { + if (setter != null) { + int modifiers = setter.getModifiers(); + if (!Modifier.isPublic(modifiers)) { + throw new IntrospectionException(Messages.getString("beans.05")); //$NON-NLS-1$ + } + Class[] parameterTypes = setter.getParameterTypes(); + if (parameterTypes.length != 1) { + throw new IntrospectionException(Messages.getString("beans.06")); //$NON-NLS-1$ + } + Class parameterType = parameterTypes[0]; + Class propertyType = getPropertyType(); + if (propertyType != null && !propertyType.equals(parameterType)) { + throw new IntrospectionException(Messages.getString("beans.07")); //$NON-NLS-1$ + } + } + this.setter = setter; + } + + public void setReadMethod(Method getter) throws IntrospectionException { + if (getter != null) { + int modifiers = getter.getModifiers(); + if (!Modifier.isPublic(modifiers)) { + throw new IntrospectionException(Messages.getString("beans.0A")); //$NON-NLS-1$ + } + Class[] parameterTypes = getter.getParameterTypes(); + if (parameterTypes.length != 0) { + throw new IntrospectionException(Messages.getString("beans.08")); //$NON-NLS-1$ + } + Class returnType = getter.getReturnType(); + if (returnType.equals(Void.TYPE)) { + throw new IntrospectionException(Messages.getString("beans.33")); //$NON-NLS-1$ + } + Class propertyType = getPropertyType(); + if ((propertyType != null) && !returnType.equals(propertyType)) { + throw new IntrospectionException(Messages.getString("beans.09")); //$NON-NLS-1$ + } + } + this.getter = getter; + } + + public Method getWriteMethod() { + return setter; + } + + public Method getReadMethod() { + return getter; + } + + @Override + public boolean equals(Object object) { + boolean result = (object != null && object instanceof PropertyDescriptor); + if (result) { + PropertyDescriptor pd = (PropertyDescriptor) object; + boolean gettersAreEqual = (this.getter == null) && (pd.getReadMethod() == null) + || (this.getter != null) && (this.getter.equals(pd.getReadMethod())); + boolean settersAreEqual = (this.setter == null) && (pd.getWriteMethod() == null) + || (this.setter != null) && (this.setter.equals(pd.getWriteMethod())); + boolean propertyTypesAreEqual = this.getPropertyType() == pd.getPropertyType(); + boolean propertyEditorClassesAreEqual = this.getPropertyEditorClass() == pd + .getPropertyEditorClass(); + boolean boundPropertyAreEqual = this.isBound() == pd.isBound(); + boolean constrainedPropertyAreEqual = this.isConstrained() == pd.isConstrained(); + result = gettersAreEqual && settersAreEqual && propertyTypesAreEqual + && propertyEditorClassesAreEqual && boundPropertyAreEqual + && constrainedPropertyAreEqual; + } + return result; + } + + public void setPropertyEditorClass(Class propertyEditorClass) { + this.propertyEditorClass = propertyEditorClass; + } + + public Class getPropertyType() { + Class result = null; + if (getter != null) { + result = getter.getReturnType(); + } else if (setter != null) { + Class[] parameterTypes = setter.getParameterTypes(); + result = parameterTypes[0]; + } + return result; + } + + public Class getPropertyEditorClass() { + return propertyEditorClass; + } + + public void setConstrained(boolean constrained) { + this.constrained = constrained; + } + + public void setBound(boolean bound) { + this.bound = bound; + } + + public boolean isConstrained() { + return constrained; + } + + public boolean isBound() { + return bound; + } + + boolean hasMethod(Class beanClass, String methodName) { + Method[] methods = findMethods(beanClass, methodName); + return (methods.length > 0); + } + + String createDefaultMethodName(String propertyName, String prefix) { + String result = null; + if (propertyName != null) { + String bos = propertyName.substring(0, 1).toUpperCase(); + String eos = propertyName.substring(1, propertyName.length()); + result = prefix + bos + eos; + } + return result; + } + + Method[] findMethods(Class aClass, String methodName) { + Method[] allMethods = aClass.getMethods(); + Vector matchedMethods = new Vector(); + Method[] result; + for (Method method : allMethods) { + if (method.getName().equals(methodName)) { + matchedMethods.add(method); + } + } + result = new Method[matchedMethods.size()]; + for (int j = 0; j < matchedMethods.size(); ++j) { + result[j] = matchedMethods.elementAt(j); + } + return result; + } + + void setReadMethod(Class beanClass, String getterName) { + boolean result = false; + Method[] getters = findMethods(beanClass, getterName); + for (Method element : getters) { + try { + setReadMethod(element); + result = true; + } catch (IntrospectionException ie) { + } + if (result) { + break; + } + } + } + + void setWriteMethod(Class beanClass, String setterName) throws IntrospectionException { + boolean result = false; + Method[] setters = findMethods(beanClass, setterName); + for (Method element : setters) { + try { + setWriteMethod(element); + result = true; + } catch (IntrospectionException ie) { + } + if (result) { + break; + } + } + } + + public PropertyEditor createPropertyEditor(Object bean) { + PropertyEditor editor; + if (propertyEditorClass == null) { + return null; + } + if (!PropertyEditor.class.isAssignableFrom(propertyEditorClass)) { + // beans.48=Property editor is not assignable from the + // PropertyEditor interface + throw new ClassCastException(Messages.getString("beans.48")); //$NON-NLS-1$ + } + try { + Constructor constr; + try { + // try to look for the constructor with single Object argument + constr = propertyEditorClass.getConstructor(Object.class); + editor = (PropertyEditor) constr.newInstance(bean); + } catch (NoSuchMethodException e) { + // try no-argument constructor + constr = propertyEditorClass.getConstructor(); + editor = (PropertyEditor) constr.newInstance(); + } + } catch (Exception e) { + // beans.47=Unable to instantiate property editor + RuntimeException re = new RuntimeException(Messages.getString("beans.47"), e); //$NON-NLS-1$ + throw re; + } + return editor; + } +} diff --git a/app/src/main/java/java/beans/PropertyEditor.java b/app/src/main/java/java/beans/PropertyEditor.java new file mode 100644 index 000000000..65bedea1e --- /dev/null +++ b/app/src/main/java/java/beans/PropertyEditor.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package java.beans; + +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Rectangle; + +public interface PropertyEditor { + + public void paintValue(Graphics gfx, Rectangle box); + + public void setAsText(String text) throws IllegalArgumentException; + + public String[] getTags(); + + public String getJavaInitializationString(); + + public String getAsText(); + + public void setValue(Object value); + + public Object getValue(); + + public void removePropertyChangeListener(PropertyChangeListener listener); + + public void addPropertyChangeListener(PropertyChangeListener listener); + + public Component getCustomEditor(); + + public boolean supportsCustomEditor(); + + public boolean isPaintable(); +} diff --git a/app/src/main/java/java/beans/PropertyEditorManager.java b/app/src/main/java/java/beans/PropertyEditorManager.java new file mode 100644 index 000000000..ed5582992 --- /dev/null +++ b/app/src/main/java/java/beans/PropertyEditorManager.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package java.beans; + +import java.util.HashMap; +import java.util.Map; + +public class PropertyEditorManager { + + private static String[] path = { "org.apache.harmony.beans.editors" }; //$NON-NLS-1$ + + private static final Map, Class> registeredEditors = new HashMap, Class>(); + + public PropertyEditorManager() { + } + + public static void registerEditor(Class targetType, Class editorClass) { + if (targetType == null) { + throw new NullPointerException(); + } + + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPropertiesAccess(); + } + if (editorClass != null) { + registeredEditors.put(targetType, editorClass); + } else { + registeredEditors.remove(targetType); + } + } + + public static synchronized PropertyEditor findEditor(Class targetType) { + if (targetType == null) { + throw new NullPointerException(); + } + + Class editorClass = null; + PropertyEditor editor = null; + + editorClass = registeredEditors.get(targetType); + + if (editorClass == null) { + String editorClassName = targetType.getName() + "Editor"; //$NON-NLS-1$ + ClassLoader loader = targetType.getClassLoader(); + + if (loader == null) { + loader = Thread.currentThread().getContextClassLoader(); + } + + try { + editorClass = Class.forName(editorClassName, true, loader); + } catch (ClassNotFoundException cnfe) { + String shortEditorClassName = editorClassName + .substring(editorClassName.lastIndexOf(".") + 1); //$NON-NLS-1$ + + if (targetType.isPrimitive()) { + shortEditorClassName = shortEditorClassName.substring(0, 1) + .toUpperCase() + + shortEditorClassName.substring(1); + } + + for (String element : path) { + editorClassName = element + "." + shortEditorClassName; //$NON-NLS-1$ + + try { + editorClass = Class.forName(editorClassName, true, + loader); + break; + } catch (Exception e) { + } + } + } catch (Exception e) { + } + } + + if (editorClass != null) { + try { + editor = (PropertyEditor) editorClass.newInstance(); + } catch (Exception e) { + } + } + + return editor; + } + + public static synchronized void setEditorSearchPath(String[] apath) { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPropertiesAccess(); + } + + path = apath; + } + + public static synchronized String[] getEditorSearchPath() { + return path; + } +} diff --git a/app/src/main/java/java/beans/PropertyEditorSupport.java b/app/src/main/java/java/beans/PropertyEditorSupport.java new file mode 100644 index 000000000..c3929a181 --- /dev/null +++ b/app/src/main/java/java/beans/PropertyEditorSupport.java @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package java.beans; + +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.harmony.beans.internal.nls.Messages; + +public class PropertyEditorSupport implements PropertyEditor { + + Object source = null; + + List listeners = new ArrayList(); + + Object oldValue = null; + + Object newValue = null; + + public PropertyEditorSupport(Object source) { + if (source == null) { + throw new NullPointerException(Messages.getString("beans.0C")); //$NON-NLS-1$ + } + this.source = source; + } + + public PropertyEditorSupport() { + source = this; + } + + public void paintValue(Graphics gfx, Rectangle box) { + } + + public void setAsText(String text) throws IllegalArgumentException { + if (newValue instanceof String) { + setValue(text); + } else { + throw new IllegalArgumentException(text); + } + } + + public String[] getTags() { + return null; + } + + public String getJavaInitializationString() { + return "???"; //$NON-NLS-1$ + } + + public String getAsText() { + return newValue == null ? "null" : newValue.toString(); //$NON-NLS-1$ + } + + public void setValue(Object value) { + this.oldValue = this.newValue; + this.newValue = value; + firePropertyChange(); + } + + public Object getValue() { + return newValue; + } + + public void setSource(Object source) { + if (source == null) { + throw new NullPointerException(Messages.getString("beans.0C")); //$NON-NLS-1$ + } + this.source = source; + } + + public Object getSource() { + return source; + } + + public synchronized void removePropertyChangeListener( + PropertyChangeListener listener) { + if (listeners != null) { + listeners.remove(listener); + } + } + + public synchronized void addPropertyChangeListener( + PropertyChangeListener listener) { + listeners.add(listener); + } + + public Component getCustomEditor() { + return null; + } + + public boolean supportsCustomEditor() { + return false; + } + + public boolean isPaintable() { + return false; + } + + public void firePropertyChange() { + if (listeners.size() > 0) { + PropertyChangeEvent event = new PropertyChangeEvent(source, null, + oldValue, newValue); + Iterator iterator = listeners.iterator(); + + while (iterator.hasNext()) { + PropertyChangeListener listener = iterator.next(); + listener.propertyChange(event); + } + } + } +} diff --git a/app/src/main/java/java/beans/PropertyVetoException.java b/app/src/main/java/java/beans/PropertyVetoException.java new file mode 100644 index 000000000..c7f092af9 --- /dev/null +++ b/app/src/main/java/java/beans/PropertyVetoException.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package java.beans; + +/** + * Indicates that a proposed property change is unacceptable. + */ +public class PropertyVetoException extends Exception { + + private static final long serialVersionUID = 129596057694162164L; + + private final PropertyChangeEvent evt; + + /** + *

+ * Constructs an instance with a message and the change event. + *

+ * + * @param message + * A description of the veto. + * @param event + * The event that was vetoed. + */ + public PropertyVetoException(String message, PropertyChangeEvent event) { + super(message); + this.evt = event; + } + + /** + *

+ * Gets the property change event. + *

+ * + * @return An instance of {@link PropertyChangeEvent} + */ + public PropertyChangeEvent getPropertyChangeEvent() { + return evt; + } +}