diff --git a/uilayer-android/AndroidManifest.xml b/uilayer-android/AndroidManifest.xml index e88bfe3..b1f2ddf 100644 --- a/uilayer-android/AndroidManifest.xml +++ b/uilayer-android/AndroidManifest.xml @@ -15,7 +15,7 @@ - + \ No newline at end of file diff --git a/uilayer-android/src/net/avh4/framework/uilayer/DemoGameActivity.java b/uilayer-android/src/net/avh4/framework/uilayer/DemoGameActivity.java index 755735e..5cfae3b 100644 --- a/uilayer-android/src/net/avh4/framework/uilayer/DemoGameActivity.java +++ b/uilayer-android/src/net/avh4/framework/uilayer/DemoGameActivity.java @@ -1,9 +1,9 @@ package net.avh4.framework.uilayer; import net.avh4.demo.uilayer.DemoGame; -import net.avh4.framework.uilayer.android.UILayerActivity; +import net.avh4.framework.uilayer.android.AndroidSceneRendererActivity; -public class DemoGameActivity extends UILayerActivity { +public class DemoGameActivity extends AndroidSceneRendererActivity { public DemoGameActivity() { super(new DemoGame()); diff --git a/uilayer-android/src/net/avh4/framework/uilayer/android/UILayerView.java b/uilayer-android/src/net/avh4/framework/uilayer/android/AndroidSceneRenderer.java similarity index 90% rename from uilayer-android/src/net/avh4/framework/uilayer/android/UILayerView.java rename to uilayer-android/src/net/avh4/framework/uilayer/android/AndroidSceneRenderer.java index 0270a89..b3cf1d4 100644 --- a/uilayer-android/src/net/avh4/framework/uilayer/android/UILayerView.java +++ b/uilayer-android/src/net/avh4/framework/uilayer/android/AndroidSceneRenderer.java @@ -9,11 +9,11 @@ import android.graphics.Paint; import android.view.View; -public class UILayerView extends View { +public class AndroidSceneRenderer extends View { private final UI mUi; - public UILayerView(final Context context, final UI ui) { + public AndroidSceneRenderer(final Context context, final UI ui) { super(context); if (ui == null) { throw new RuntimeException("UI must not be null"); diff --git a/uilayer-android/src/net/avh4/framework/uilayer/android/UILayerActivity.java b/uilayer-android/src/net/avh4/framework/uilayer/android/AndroidSceneRendererActivity.java similarity index 74% rename from uilayer-android/src/net/avh4/framework/uilayer/android/UILayerActivity.java rename to uilayer-android/src/net/avh4/framework/uilayer/android/AndroidSceneRendererActivity.java index 965bf65..8df7cdb 100644 --- a/uilayer-android/src/net/avh4/framework/uilayer/android/UILayerActivity.java +++ b/uilayer-android/src/net/avh4/framework/uilayer/android/AndroidSceneRendererActivity.java @@ -7,15 +7,15 @@ import android.view.Window; import android.widget.ImageView; -public class UILayerActivity extends Activity { +public class AndroidSceneRendererActivity extends Activity { private UI mUi; - public UILayerActivity() { + public AndroidSceneRendererActivity() { mUi = null; } - public UILayerActivity(final UI ui) { + public AndroidSceneRendererActivity(final UI ui) { mUi = ui; } @@ -33,10 +33,10 @@ public void setUI(final UI ui) { @Override public void run() { if (mUi != null) { - setContentView(new UILayerView(UILayerActivity.this, mUi)); + setContentView(new AndroidSceneRenderer(AndroidSceneRendererActivity.this, mUi)); } else { final ImageView placeholder = new ImageView( - UILayerActivity.this); + AndroidSceneRendererActivity.this); placeholder.setImageResource(R.drawable.icon); setContentView(placeholder); } diff --git a/uilayer-android/tests/src/net/avh4/framework/uilayer/test/AndroidSceneRendererTest.java b/uilayer-android/tests/src/net/avh4/framework/uilayer/test/AndroidSceneRendererTest.java index f7d46e5..289f431 100644 --- a/uilayer-android/tests/src/net/avh4/framework/uilayer/test/AndroidSceneRendererTest.java +++ b/uilayer-android/tests/src/net/avh4/framework/uilayer/test/AndroidSceneRendererTest.java @@ -3,7 +3,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import net.avh4.framework.uilayer.UI; import net.avh4.framework.uilayer.UILayer; -import net.avh4.framework.uilayer.android.UILayerActivity; +import net.avh4.framework.uilayer.android.AndroidSceneRendererActivity; import net.avh4.framework.uilayer.scene.Scene; import org.hamcrest.Matcher; @@ -11,14 +11,14 @@ import android.test.ActivityInstrumentationTestCase2; public class AndroidSceneRendererTest extends - ActivityInstrumentationTestCase2 { + ActivityInstrumentationTestCase2 { private static final int STATUS_BAR_HEIGHT = 50; private UI mUi; private Scene mScene; public AndroidSceneRendererTest() { - super(UILayerActivity.class); + super(AndroidSceneRendererActivity.class); } @Override @@ -53,7 +53,7 @@ public void testRenderPlaceholders() throws Exception { assertThat(getActivity(), isApproved()); } - private Matcher isApproved() { + private Matcher isApproved() { return net.avh4.util.imagecomparison.android.Matchers .isApproved(getInstrumentation().getContext()); } diff --git a/uilayer-core/pom.xml b/uilayer-core/pom.xml index 36c4260..6224f86 100644 --- a/uilayer-core/pom.xml +++ b/uilayer-core/pom.xml @@ -8,7 +8,7 @@ net.avh4.framework uilayer-core - 0.0.3 + 0.0.4-SNAPSHOT jar uilayer-core diff --git a/uilayer-core/src/main/java/net/avh4/framework/uilayer/UILayer.java b/uilayer-core/src/main/java/net/avh4/framework/uilayer/UILayer.java index e29fdc7..6328d7f 100644 --- a/uilayer-core/src/main/java/net/avh4/framework/uilayer/UILayer.java +++ b/uilayer-core/src/main/java/net/avh4/framework/uilayer/UILayer.java @@ -6,7 +6,12 @@ public class UILayer { private static final String SWING_SERVICE = "net.avh4.framework.uilayer.swing.SwingUILayerService"; private static final String ANDROID_SERVICE = "net.avh4.framework.uilayer.android.AndroidUILayerService"; + @SuppressWarnings("unused") + private static final String IOS_SERVICE = "net.avh4.framework.uilayer.ios.IOSUILayerService"; + // IOS_SERVICE is not added here because xmlvm does not implement + // ClassLoader for iOS. Therefore we must replace this entire class in + // uilayer-ios-xmlvm and not rely on dynamic loading. private static final String[] KNOWN_SERVICES = new String[] { SWING_SERVICE, ANDROID_SERVICE }; @@ -52,7 +57,7 @@ public static Scene newScene(final String title) { public static void main(final SceneCreator game, final ClickReceiver receiver, final KeyReceiver keyReceiver) { - service.main(game, receiver, keyReceiver); + service.run(game, receiver, keyReceiver); } } diff --git a/uilayer-core/src/main/java/net/avh4/framework/uilayer/UILayerService.java b/uilayer-core/src/main/java/net/avh4/framework/uilayer/UILayerService.java index 1bec828..6eb46ca 100644 --- a/uilayer-core/src/main/java/net/avh4/framework/uilayer/UILayerService.java +++ b/uilayer-core/src/main/java/net/avh4/framework/uilayer/UILayerService.java @@ -4,7 +4,7 @@ public interface UILayerService { - void main(SceneCreator game, ClickReceiver receiver, KeyReceiver keyReceiver); + void run(SceneCreator game, ClickReceiver receiver, KeyReceiver keyReceiver); Scene newScene(String title); diff --git a/uilayer-ios-xmlvm/nbproject/build-Xcode.xml b/uilayer-ios-xmlvm/nbproject/build-Xcode.xml index 9323a1b..e61ef58 100644 --- a/uilayer-ios-xmlvm/nbproject/build-Xcode.xml +++ b/uilayer-ios-xmlvm/nbproject/build-Xcode.xml @@ -55,6 +55,8 @@ + + diff --git a/uilayer-ios-xmlvm/nbproject/project.properties b/uilayer-ios-xmlvm/nbproject/project.properties index 2669c45..f089148 100644 --- a/uilayer-ios-xmlvm/nbproject/project.properties +++ b/uilayer-ios-xmlvm/nbproject/project.properties @@ -2,6 +2,7 @@ annotation.processing.enabled=true annotation.processing.enabled.in.editor=false annotation.processing.run.all.processors=true endorsed.classpath= +file.reference.uilayer-core-0.0.4-SNAPSHOT.jar=/Users/avh4/.m2/repository/net/avh4/framework/uilayer-core/0.0.4-SNAPSHOT/uilayer-core-0.0.4-SNAPSHOT.jar javac.processorpath=\ ${javac.classpath} mkdist.disabled=false @@ -45,7 +46,9 @@ dist.javadoc.dir=${dist.dir}/javadoc excludes= includes=** jar.compress=true -javac.classpath=${xmlvm.sdk.jar} +javac.classpath=\ + ${xmlvm.sdk.jar}:\ + ${file.reference.uilayer-core-0.0.4-SNAPSHOT.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false @@ -65,7 +68,7 @@ javadoc.splitindex=true javadoc.use=true javadoc.version=false javadoc.windowtitle= -main.class=my.hellothere.Main +main.class=net.avh4.demo.uilayer.DemoGame manifest.file=manifest.mf meta.inf.dir=${src.java.dir}/META-INF platform.active=default_platform diff --git a/uilayer-ios-xmlvm/pom.xml b/uilayer-ios-xmlvm/pom.xml index b8398ed..d312a7c 100644 --- a/uilayer-ios-xmlvm/pom.xml +++ b/uilayer-ios-xmlvm/pom.xml @@ -64,5 +64,10 @@ 0.0.2 test + + net.avh4.framework + uilayer-core + 0.0.4-SNAPSHOT + diff --git a/uilayer-ios-xmlvm/src/main/java/net/avh4/demo/uilayer/DemoGame.java b/uilayer-ios-xmlvm/src/main/java/net/avh4/demo/uilayer/DemoGame.java new file mode 100644 index 0000000..243055a --- /dev/null +++ b/uilayer-ios-xmlvm/src/main/java/net/avh4/demo/uilayer/DemoGame.java @@ -0,0 +1,40 @@ +package net.avh4.demo.uilayer; + +import net.avh4.framework.uilayer.UI; +import net.avh4.framework.uilayer.UILayer; +import net.avh4.framework.uilayer.scene.Scene; + +public class DemoGame implements UI { + + public static void main(final String[] args) { + final DemoGame game = new DemoGame(); + UILayer.run(game); + } + + private Scene s; + + public DemoGame() { + s = UILayer.newScene("UILayer Demo Game"); + s.addImage(0, 0, 640, 960, "background.jpg"); + click(100, 100); + } + + @Override + public Scene getScene() { + return s; + } + + @Override + public void click(final int x, final int y) { + s.addPlaceholder("Box", x, y, 50, 50); + } + + @Override + public void key(final int keyCode) { + // if (keyCode == KeyEvent.VK_SPACE) { + s = UILayer.newScene("UILayer Demo Game"); + s.addImage(0, 0, 640, 960, "background.jpg"); + // } + } + +} diff --git a/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/UILayer.java b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/UILayer.java new file mode 100644 index 0000000..e68da6c --- /dev/null +++ b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/UILayer.java @@ -0,0 +1,32 @@ +package net.avh4.framework.uilayer; + +import net.avh4.framework.uilayer.ios.IOSUILayerService; +import net.avh4.framework.uilayer.scene.Scene; + +/** + * This class replaces the version in uilayer-core when compiling for xmlvm + * because the uilayer-core version uses ClassLoader, which is not implemented + * for iOS with xmlvm. + */ +public class UILayer { + + public static final UILayerService service = loadService(); + + public static void run(final UI game) { + UILayer.run(game, game, game); + } + + private static UILayerService loadService() { + return new IOSUILayerService(); + } + + public static Scene newScene(final String title) { + return service.newScene(title); + } + + public static void run(final SceneCreator game, + final ClickReceiver receiver, final KeyReceiver keyReceiver) { + service.run(game, receiver, keyReceiver); + } + +} diff --git a/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSPlaceholder.java b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSPlaceholder.java new file mode 100644 index 0000000..b16ee7b --- /dev/null +++ b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSPlaceholder.java @@ -0,0 +1,36 @@ +package net.avh4.framework.uilayer.ios; + +import net.avh4.framework.uilayer.scene.SceneObject; + +import org.xmlvm.iphone.CGContext; +import org.xmlvm.iphone.CGRect; +import org.xmlvm.iphone.UIGraphics; + +public class IOSPlaceholder extends SceneObject { + + private static final int MARGIN = 5; + private final String name; + private final float[] color = new float[] { .2f, .2f, .2f, 1 }; + private final float[] textColor = new float[] { 1, 1, 1, 1 }; + + public IOSPlaceholder(final String name, final int x, final int y, + final int width, final int height) { + super(x, y, width, height); + this.name = name; + } + + @Override + public void draw(final CGRect rect) { + final CGContext g = UIGraphics.getCurrentContext(); + g.setFillColor(color); + g.fillRect(new CGRect(x, y, width, height)); + g.setStrokeColor(new float[] { 0, 0, 0, 1 }); + g.strokeRect(new CGRect(x, y, width, height)); + + g.selectFont("Helvetica", 10); + g.setTextDrawingMode(CGContext.kCGTextFill); + g.setFillColor(textColor); + g.showTextAtPoint(x + MARGIN, y + height - MARGIN, name); + } + +} diff --git a/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSScene.java b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSScene.java new file mode 100644 index 0000000..2a4c853 --- /dev/null +++ b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSScene.java @@ -0,0 +1,68 @@ +package net.avh4.framework.uilayer.ios; + +import java.util.ArrayList; +import java.util.Iterator; + +import net.avh4.framework.uilayer.scene.Scene; +import net.avh4.framework.uilayer.scene.SceneImage; +import net.avh4.framework.uilayer.scene.SceneObject; + +import org.xmlvm.iphone.CGRect; + +public class IOSScene implements Scene, Iterable> { + + private final ArrayList> children = new ArrayList>(); + private final String title; + + public IOSScene(final String title) { + this.title = title; + } + + @Override + public Iterator> iterator() { + return children.iterator(); + } + + @Override + public String getTitle() { + return title; + } + + @Override + public int getWidth() { + return 640; + } + + @Override + public int getHeight() { + return 960; + } + + @Override + public void addText(final String text, final int x, final int y, + final int width, final String customFontResource, final int fontSize) { + addPlaceholder(text, x, y, width, 10); + } + + @Override + public void addPlaceholder(final String name, final int x, final int y, + final int width, final int height) { + children.add(new IOSPlaceholder(name, x, y, width, height)); + } + + @Override + public SceneImage addImage(final int x, final int y, final int width, + final int height, final String imageName, final int clipX, + final int clipY, final int clipWidth, final int clipHeight) { + addPlaceholder(imageName, x, y, width, height); + return null; + } + + @Override + public SceneImage addImage(final int x, final int y, final int width, + final int height, final String imageName) { + addPlaceholder(imageName, x, y, width, height); + return null; + } + +} diff --git a/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSSceneRenderer.java b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSSceneRenderer.java new file mode 100644 index 0000000..84050b7 --- /dev/null +++ b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSSceneRenderer.java @@ -0,0 +1,34 @@ +package net.avh4.framework.uilayer.ios; + +import net.avh4.framework.uilayer.UI; +import net.avh4.framework.uilayer.scene.SceneObject; + +import org.xmlvm.iphone.CGContext; +import org.xmlvm.iphone.CGRect; +import org.xmlvm.iphone.UIGraphics; +import org.xmlvm.iphone.UIView; + +public class IOSSceneRenderer extends UIView { + + private final UI ui; + + public IOSSceneRenderer(final UI ui) { + super(new CGRect(0, 0, 640, 960)); + this.ui = ui; + } + + @Override + public void drawRect(final CGRect rect) { + final IOSScene s = (IOSScene) ui.getScene(); + + final CGContext g = UIGraphics.getCurrentContext(); + final float[] black = new float[] { 0, 0, 0, 1 }; + g.setFillColor(black); + g.fillRect(new CGRect(0, 0, 640, 960)); + + for (final SceneObject object : s) { + object.draw(rect); + } + } + +} diff --git a/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSUILayerService.java b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSUILayerService.java new file mode 100644 index 0000000..934a693 --- /dev/null +++ b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/IOSUILayerService.java @@ -0,0 +1,26 @@ +package net.avh4.framework.uilayer.ios; + +import net.avh4.framework.uilayer.ClickReceiver; +import net.avh4.framework.uilayer.KeyReceiver; +import net.avh4.framework.uilayer.SceneCreator; +import net.avh4.framework.uilayer.UI; +import net.avh4.framework.uilayer.UILayerService; +import net.avh4.framework.uilayer.scene.Scene; + +import org.xmlvm.iphone.UIApplication; + +public class IOSUILayerService implements UILayerService { + + @Override + public void run(final SceneCreator game, final ClickReceiver receiver, + final KeyReceiver keyReceiver) { + UILayerAppDelegate.setNextUi((UI) game); + UIApplication.main(null, null, UILayerAppDelegate.class); + } + + @Override + public Scene newScene(final String title) { + return new IOSScene(title); + } + +} diff --git a/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/Main.java b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/Main.java deleted file mode 100644 index 8638e9d..0000000 --- a/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/Main.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * XMLVM demo template of Hello World application - */ -package net.avh4.framework.uilayer.ios; - -import org.xmlvm.iphone.CGRect; -import org.xmlvm.iphone.UIApplication; -import org.xmlvm.iphone.UIApplicationDelegate; -import org.xmlvm.iphone.UIColor; -import org.xmlvm.iphone.UIImage; -import org.xmlvm.iphone.UIImageView; -import org.xmlvm.iphone.UILabel; -import org.xmlvm.iphone.UIScreen; -import org.xmlvm.iphone.UITextAlignment; -import org.xmlvm.iphone.UIView; -import org.xmlvm.iphone.UIWindow; - -public class Main extends UIApplicationDelegate { - - @Override - public void applicationDidFinishLaunching(final UIApplication app) { - final UIWindow window = new UIWindow(UIScreen.mainScreen().getBounds()); - - final UIView mainView = new UIView(window.getFrame()); - mainView.setBackgroundColor(UIColor.whiteColor); - window.addSubview(mainView); - - final UILabel title = new UILabel(new CGRect(0, 150, 320, 40)); - title.setText("Hello"); - title.setTextAlignment(UITextAlignment.Center); - - final UIImageView img = new UIImageView(new CGRect(60, 200, 200, 140)); - img.setImage(UIImage.imageNamed("demo.png")); - - mainView.addSubview(title); - mainView.addSubview(img); - - window.makeKeyAndVisible(); - } - - public static void main(final String[] args) { - UIApplication.main(args, null, Main.class); - } -} diff --git a/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/UILayerAppDelegate.java b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/UILayerAppDelegate.java new file mode 100644 index 0000000..11f970d --- /dev/null +++ b/uilayer-ios-xmlvm/src/main/java/net/avh4/framework/uilayer/ios/UILayerAppDelegate.java @@ -0,0 +1,35 @@ +package net.avh4.framework.uilayer.ios; + +import net.avh4.framework.uilayer.UI; + +import org.xmlvm.iphone.UIApplication; +import org.xmlvm.iphone.UIApplicationDelegate; +import org.xmlvm.iphone.UIScreen; +import org.xmlvm.iphone.UIWindow; + +public class UILayerAppDelegate extends UIApplicationDelegate { + + private static UI nextUi; + private final UI ui; + + public static void setNextUi(final UI ui) { + nextUi = ui; + } + + public UILayerAppDelegate() { + ui = nextUi; + } + + @Override + public void applicationDidFinishLaunching(final UIApplication app) { + final UIWindow window = new UIWindow(UIScreen.mainScreen().getBounds()); + + // final UIView mainView = new UIView(window.getFrame()); + + final IOSSceneRenderer view = new IOSSceneRenderer(ui); + + window.addSubview(view); + + window.makeKeyAndVisible(); + } +}