From c6af035e88b097b833e3db5702ad8aaf44bcbb88 Mon Sep 17 00:00:00 2001 From: mimmoz81 Date: Tue, 3 Nov 2015 16:00:22 +0100 Subject: [PATCH 1/2] fix for issue https://github.com/jacek99/javabuilders/issues/5 this commit solves issue https://github.com/jacek99/javabuilders/issues/5, adding the following: - support for AbsoluteLayout tag - support for java.awt.Point as of issue #5 - support for java.awt.Rectangle to set both location and size within a single property --- .../swing/SwingJavaBuilderConfig.java | 24 +++++- .../handler/type/PointAsValueHandler.java | 79 ++++++++++++++++++ .../handler/type/RectangleAsValueHandler.java | 81 +++++++++++++++++++ .../handler/type/layout/AbsoluteLayout.java | 43 ++++++++++ .../layout/AbsoluteLayoutTypeHandler.java | 51 ++++++++++++ 5 files changed, 275 insertions(+), 3 deletions(-) create mode 100644 swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/PointAsValueHandler.java create mode 100644 swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/RectangleAsValueHandler.java create mode 100644 swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/layout/AbsoluteLayout.java create mode 100644 swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/layout/AbsoluteLayoutTypeHandler.java diff --git a/swing/swing-core/src/main/java/org/javabuilders/swing/SwingJavaBuilderConfig.java b/swing/swing-core/src/main/java/org/javabuilders/swing/SwingJavaBuilderConfig.java index a9f6f8f..9af07d6 100644 --- a/swing/swing-core/src/main/java/org/javabuilders/swing/SwingJavaBuilderConfig.java +++ b/swing/swing-core/src/main/java/org/javabuilders/swing/SwingJavaBuilderConfig.java @@ -1,6 +1,10 @@ package org.javabuilders.swing; -import static org.javabuilders.swing.SwingJavaBuilder.*; +import static org.javabuilders.swing.SwingJavaBuilder.ACCELERATOR; +import static org.javabuilders.swing.SwingJavaBuilder.LAYOUT_DATA; +import static org.javabuilders.swing.SwingJavaBuilder.TEXT; +import static org.javabuilders.swing.SwingJavaBuilder.TITLE; +import static org.javabuilders.swing.SwingJavaBuilder.TOOL_TIP_TEXT; import java.applet.Applet; import java.awt.Button; @@ -20,6 +24,8 @@ import java.awt.Label; import java.awt.LayoutManager; import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; import java.awt.ScrollPane; import java.awt.Scrollbar; import java.awt.TextArea; @@ -92,8 +98,6 @@ import javax.swing.table.TableModel; import javax.swing.text.JTextComponent; -import net.miginfocom.swing.MigLayout; - import org.javabuilders.BuildResult; import org.javabuilders.Builder; import org.javabuilders.BuilderConfig; @@ -148,8 +152,12 @@ import org.javabuilders.swing.handler.type.JSpiltPaneTypeHandler; import org.javabuilders.swing.handler.type.JTabbedPaneTypeHandler; import org.javabuilders.swing.handler.type.JTableFinishProcessor; +import org.javabuilders.swing.handler.type.PointAsValueHandler; +import org.javabuilders.swing.handler.type.RectangleAsValueHandler; import org.javabuilders.swing.handler.type.SwingActionHandler; import org.javabuilders.swing.handler.type.TableColumnTypeHandler; +import org.javabuilders.swing.handler.type.layout.AbsoluteLayout; +import org.javabuilders.swing.handler.type.layout.AbsoluteLayoutTypeHandler; import org.javabuilders.swing.handler.type.layout.CardLayoutTypeHandler; import org.javabuilders.swing.handler.type.layout.FlowLayoutTypeHandler; import org.javabuilders.swing.handler.type.layout.MigLayoutHandler; @@ -158,6 +166,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import net.miginfocom.swing.MigLayout; + public class SwingJavaBuilderConfig extends BuilderConfig implements IStringLiteralControlConfig, IBindingListenerProvider> { @@ -259,6 +269,7 @@ public SwingJavaBuilderConfig() { //define aliases for Swing layout managers addType(MigLayout.class,CardLayout.class,FlowLayout.class); + addType(AbsoluteLayout.class); addType("Action",SwingAction.class); addType(Focus.class); @@ -288,6 +299,10 @@ public SwingJavaBuilderConfig() { .children(Action.class,0,Integer.MAX_VALUE); forType(Dimension.class) .valueHandler(DimensionAsValueHandler.getInstance()); + forType(Point.class) + .valueHandler(PointAsValueHandler.getInstance()); + forType(Rectangle.class) + .valueHandler(RectangleAsValueHandler.getInstance()); forType(Font.class) .valueHandler(FontAsValueHandler.getInstance()); forType(Frame.class).localize(TITLE) @@ -426,6 +441,9 @@ public SwingJavaBuilderConfig() { forType(FlowLayout.class) .ignore(Builder.CONTENT,Builder.NAME) .finishProcessor(FlowLayoutTypeHandler.getInstance()); + forType(AbsoluteLayout.class) + .ignore(Builder.CONTENT, Builder.NAME) + .finishProcessor(AbsoluteLayoutTypeHandler.getInstance()); forType(Action.class) .valueHandler(ActionAsValueHandler.getInstance()); diff --git a/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/PointAsValueHandler.java b/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/PointAsValueHandler.java new file mode 100644 index 0000000..43b46c9 --- /dev/null +++ b/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/PointAsValueHandler.java @@ -0,0 +1,79 @@ +/** + * + */ +package org.javabuilders.swing.handler.type; + +import java.awt.Point; + +import org.javabuilders.BuildException; +import org.javabuilders.BuildProcess; +import org.javabuilders.Node; +import org.javabuilders.handler.ITypeAsValueHandler; + +/** + * Handles creating Point objects + * + * @author Luca Domenichini + */ +public final class PointAsValueHandler implements ITypeAsValueHandler +{ + + /** + * POINT_VALUE_REGEX + */ + private final static String POINT_VALUE_REGEX = "^[0-9]+;{1}[0-9]+$"; + + /** + * singleton + */ + private final static PointAsValueHandler SINGLETON = new PointAsValueHandler(); + + /** + * @return Singleton + */ + public static PointAsValueHandler getInstance() + { + return SINGLETON; + } + + public String getInputValueSample() + { + return "100;50"; + } + + /* (non-Javadoc) + * @see org.javabuilders.handler.ITypeAsValueHandler#getValue(org.javabuilders.BuildProcess, org.javabuilders.Node, java.lang.String, java.lang.Object) + */ + public Point getValue(BuildProcess process, Node node, String key, Object inputValue) throws BuildException + { + final String pointValue = (String) inputValue; + if (pointValue.matches(POINT_VALUE_REGEX)) + { + final String[] xy = pointValue.split(";"); + return new Point(Integer.valueOf(xy[0]), Integer.valueOf(xy[1])); + } + //else + throw new BuildException("\"{0}\" is not a valid point", pointValue); + } + + /** + * (non-Javadoc) + * + * @see org.javabuilders.handler.ITypeAsValueHandler#getRegex() + */ + public String getRegex() + { + return POINT_VALUE_REGEX; + } + + /** + * (non-Javadoc) + * + * @see org.javabuilders.IApplicable#getApplicableClass() + */ + public Class getApplicableClass() + { + return Point.class; + } + +} diff --git a/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/RectangleAsValueHandler.java b/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/RectangleAsValueHandler.java new file mode 100644 index 0000000..c8fa18b --- /dev/null +++ b/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/RectangleAsValueHandler.java @@ -0,0 +1,81 @@ +/** + * + */ +package org.javabuilders.swing.handler.type; + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; + +import org.javabuilders.BuildException; +import org.javabuilders.BuildProcess; +import org.javabuilders.Node; +import org.javabuilders.handler.ITypeAsValueHandler; + +/** + * Handles creating Rectangle objects. Useful for setting both location and size within a single property + * + * @author Luca Domenichini + */ +public final class RectangleAsValueHandler implements ITypeAsValueHandler +{ + + /** + * RECTANGLE_VALUE_REGEX + */ + private final static String RECTANGLE_VALUE_REGEX = "^[0-9]+x{1}[0-9]+x{1}[0-9]+x{1}[0-9]+$"; + + /** + * singleton + */ + private final static RectangleAsValueHandler SINGLETON = new RectangleAsValueHandler(); + + /** + * @return Singleton + */ + public static RectangleAsValueHandler getInstance() + { + return SINGLETON; + } + + public String getInputValueSample() + { + return "100x50x200x200"; + } + + /* (non-Javadoc) + * @see org.javabuilders.handler.ITypeAsValueHandler#getValue(org.javabuilders.BuildProcess, org.javabuilders.Node, java.lang.String, java.lang.Object) + */ + public Rectangle getValue(BuildProcess process, Node node, String key, Object inputValue) throws BuildException + { + final String rectangleValue = (String) inputValue; + if (rectangleValue.matches(RECTANGLE_VALUE_REGEX)) + { + final String[] xywh = rectangleValue.split("x"); + return new Rectangle(new Point(Integer.valueOf(xywh[0]), Integer.valueOf(xywh[1])), new Dimension(Integer.valueOf(xywh[2]), Integer.valueOf(xywh[3]))); + } + //else + throw new BuildException("\"{0}\" is not a valid rectangle", rectangleValue); + } + + /** + * (non-Javadoc) + * + * @see org.javabuilders.handler.ITypeAsValueHandler#getRegex() + */ + public String getRegex() + { + return RECTANGLE_VALUE_REGEX; + } + + /** + * (non-Javadoc) + * + * @see org.javabuilders.IApplicable#getApplicableClass() + */ + public Class getApplicableClass() + { + return Rectangle.class; + } + +} diff --git a/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/layout/AbsoluteLayout.java b/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/layout/AbsoluteLayout.java new file mode 100644 index 0000000..0c61d4d --- /dev/null +++ b/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/layout/AbsoluteLayout.java @@ -0,0 +1,43 @@ +package org.javabuilders.swing.handler.type.layout; + +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.LayoutManager; + +/** + * Marker class to indicate the absolute layout positioning. + * This class represents the tag AbsoluteLayout applicable to a Container. + * LayoutManager is implemented just for respecting the cardinalities while bulding + * the Container. All methods are no-op. + * + * @author Luca Domenichini + */ +public class AbsoluteLayout implements LayoutManager { + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return null; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + + } + +} diff --git a/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/layout/AbsoluteLayoutTypeHandler.java b/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/layout/AbsoluteLayoutTypeHandler.java new file mode 100644 index 0000000..51c5d02 --- /dev/null +++ b/swing/swing-core/src/main/java/org/javabuilders/swing/handler/type/layout/AbsoluteLayoutTypeHandler.java @@ -0,0 +1,51 @@ +package org.javabuilders.swing.handler.type.layout; + +import java.awt.Component; +import java.awt.Container; +import java.util.Map; + +import org.javabuilders.BuildException; +import org.javabuilders.BuildProcess; +import org.javabuilders.BuilderConfig; +import org.javabuilders.Node; +import org.javabuilders.handler.ITypeHandlerFinishProcessor; +import org.javabuilders.swing.SwingJavaBuilderUtils; + +/** + * AbsoluteLayoutTypeHandler for absolute layout positioning. + * Uses {@link AbsoluteLayout} marker class to indicate that the layout should be set as absolute + * through method {@link java.awt.Container#setLayout(java.awt.LayoutManager)}. + * + * @author Luca Domenichini + */ +public class AbsoluteLayoutTypeHandler implements ITypeHandlerFinishProcessor { + + private static final AbsoluteLayoutTypeHandler singleton = new AbsoluteLayoutTypeHandler(); + + public static AbsoluteLayoutTypeHandler getInstance() { + return singleton; + } + + private AbsoluteLayoutTypeHandler() { + + } + + @Override + public void finish(BuilderConfig config, BuildProcess process, Node current, String key, + Map typeDefinition) throws BuildException { + + Container container = SwingJavaBuilderUtils.getParentContainer(current); + if (container != null) { + container.setLayout(null); + + for(Node child : current.getParent().getChildNodes(Component.class)) { + Component c = (Component) child.getMainObject(); + container.add(c); + } + } else { + throw new BuildException("Unable to process AbolusteLayout since no parent JComponent was found: {0}", + typeDefinition); + } + } + +} From 4db9dee4c2e1b9b100bf1e3fccbb6f38bb337e96 Mon Sep 17 00:00:00 2001 From: mimmoz81 Date: Wed, 4 Nov 2015 10:00:34 +0100 Subject: [PATCH 2/2] Fix for https://github.com/jacek99/javabuilders/issues/4 Added null-check returning from org.javabuilders.Node.getStringProperty(String...) --- core/src/main/java/org/javabuilders/Builder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/javabuilders/Builder.java b/core/src/main/java/org/javabuilders/Builder.java index 27cf318..90d17f5 100644 --- a/core/src/main/java/org/javabuilders/Builder.java +++ b/core/src/main/java/org/javabuilders/Builder.java @@ -847,7 +847,7 @@ private static void handleProperty(BuilderConfig config, BuildProcess process, N if (asValueHandler != null) { String sValue = parent.getStringProperty(currentKey); - if (sValue.matches(asValueHandler.getRegex())) { + if (sValue != null && sValue.matches(asValueHandler.getRegex())) { //replace the value from the file with the corresponding object instance parent.getProperties().put(currentKey, asValueHandler.getValue(process, parent, currentKey, parent.getProperty(currentKey)));