diff options
author | Araq <rumpf_a@web.de> | 2012-09-08 15:39:37 -0700 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2012-09-08 15:39:37 -0700 |
commit | 9c63d12cef05709c79ce6d0f6b0cffd0f2243fe7 (patch) | |
tree | 5403ed6c16295dca3cd6f60971e0e40583e64af7 | |
parent | 4cd795b3eefce8fad3a933848455e677b2e2c67b (diff) | |
parent | f6e7aebbd9a7185b3c45f2734636090c0efd2b2b (diff) | |
download | Nim-9c63d12cef05709c79ce6d0f6b0cffd0f2243fe7.tar.gz |
Merge pull request #199 from gradha/implement_cross_platform_example
Implement cross platform example
35 files changed, 1714 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore index b741535df..af25077dc 100755 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,25 @@ compiler/nimrod* build/[0-9]_[0-9] bin/nimrod +# iOS specific wildcards. +*.mode1v3 +*.pbxuser +*.perspective +*.perspectivev3 +*.swp +.DS_Store +project.xcworkspace/ +xcuserdata/ + +# iOS specific absolute paths +examples/cross_calculator/ios/resources/ui/*.m +examples/cross_calculator/ios/tags + +# Android specific absolute paths. +examples/cross_calculator/android/bin/ +examples/cross_calculator/android/gen/ +examples/cross_calculator/android/jni/backend-jni.h +examples/cross_calculator/android/libs/ +examples/cross_calculator/android/local.properties +examples/cross_calculator/android/obj/ +examples/cross_calculator/android/tags diff --git a/examples/cross_calculator/android/AndroidManifest.xml b/examples/cross_calculator/android/AndroidManifest.xml new file mode 100644 index 000000000..05b96fb50 --- /dev/null +++ b/examples/cross_calculator/android/AndroidManifest.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.github.nimrod.crosscalculator" + android:versionCode="1" + android:versionName="1.0"> + + <uses-sdk android:minSdkVersion="3" /> + + <application android:label="@string/app_name" android:debuggable="true"> + <activity android:name=".CrossCalculator" + android:label="@string/app_name"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/examples/cross_calculator/android/build.xml b/examples/cross_calculator/android/build.xml new file mode 100644 index 000000000..d7c88432a --- /dev/null +++ b/examples/cross_calculator/android/build.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="CrossCalculator" default="help"> + + <!-- The local.properties file is created and updated by the 'android' tool. + It contains the path to the SDK. It should *NOT* be checked into + Version Control Systems. --> + <property file="local.properties" /> + + <!-- The ant.properties file can be created by you. It is only edited by the + 'android' tool to add properties to it. + This is the place to change some Ant specific build properties. + Here are some properties you may want to change/update: + + source.dir + The name of the source directory. Default is 'src'. + out.dir + The name of the output directory. Default is 'bin'. + + For other overridable properties, look at the beginning of the rules + files in the SDK, at tools/ant/build.xml + + Properties related to the SDK location or the project target should + be updated using the 'android' tool with the 'update' action. + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. + + --> + <property file="ant.properties" /> + + <!-- if sdk.dir was not set from one of the property file, then + get it from the ANDROID_HOME env var. + This must be done before we load project.properties since + the proguard config can use sdk.dir --> + <property environment="env" /> + <condition property="sdk.dir" value="${env.ANDROID_HOME}"> + <isset property="env.ANDROID_HOME" /> + </condition> + + <!-- The project.properties file is created and updated by the 'android' + tool, as well as ADT. + + This contains project specific properties such as project target, and library + dependencies. Lower level build properties are stored in ant.properties + (or in .classpath for Eclipse projects). + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. --> + <loadproperties srcFile="project.properties" /> + + <!-- quick check on sdk.dir --> + <fail + message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." + unless="sdk.dir" + /> + + <!-- + Import per project custom build rules if present at the root of the project. + This is the place to put custom intermediary targets such as: + -pre-build + -pre-compile + -post-compile (This is typically used for code obfuscation. + Compiled code location: ${out.classes.absolute.dir} + If this is not done in place, override ${out.dex.input.absolute.dir}) + -post-package + -post-build + -pre-clean + --> + <import file="custom_rules.xml" optional="true" /> + + <!-- Import the actual build file. + + To customize existing targets, there are two options: + - Customize only one target: + - copy/paste the target into this file, *before* the + <import> task. + - customize it to your needs. + - Customize the whole content of build.xml + - copy/paste the content of the rules files (minus the top node) + into this file, replacing the <import> task. + - customize to your needs. + + *********************** + ****** IMPORTANT ****** + *********************** + In all cases you must update the value of version-tag below to read 'custom' instead of an integer, + in order to avoid having your file be overridden by tools such as "android update project" + --> + <!-- version-tag: 1 --> + <import file="${sdk.dir}/tools/ant/build.xml" /> + +</project> diff --git a/examples/cross_calculator/android/custom_rules.xml b/examples/cross_calculator/android/custom_rules.xml new file mode 100644 index 000000000..91783a50e --- /dev/null +++ b/examples/cross_calculator/android/custom_rules.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="custom_rules" default="debug"> + <target name="nim"> + <exec executable="scripts/nimbuild.sh" failonerror="true"> + </exec> + </target> + <target name="jni"> + <exec executable="scripts/jnibuild.sh" failonerror="true"> + </exec> + </target> + <target name="ndk"> + <exec executable="ndk-build" failonerror="true"> + </exec> + </target> + <target name="-post-compile" depends="nim, jni, ndk"> + </target> +</project> diff --git a/examples/cross_calculator/android/jni/Android.mk b/examples/cross_calculator/android/jni/Android.mk new file mode 100644 index 000000000..c1a0feac3 --- /dev/null +++ b/examples/cross_calculator/android/jni/Android.mk @@ -0,0 +1,32 @@ +# Copyright (C) 2009 The Android Open Source Project +# +# Licensed 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. +# +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := nimrod +LOCAL_SRC_FILES := nimcache/backend.c nimcache/system.c +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/nimcache + +include $(BUILD_STATIC_LIBRARY) + +include $(CLEAR_VARS) + +LOCAL_MODULE := backend-jni +LOCAL_SRC_FILES := backend-jni.c +LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog +LOCAL_STATIC_LIBRARIES := nimrod + +include $(BUILD_SHARED_LIBRARY) diff --git a/examples/cross_calculator/android/jni/backend-jni.c b/examples/cross_calculator/android/jni/backend-jni.c new file mode 100644 index 000000000..3d65458ec --- /dev/null +++ b/examples/cross_calculator/android/jni/backend-jni.c @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed 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. + * + */ +#include <android/log.h> +#include <string.h> +#include "backend-jni.h" +#include "backend.h" + +#define TAG "backend-jni.c" + +jint JNICALL Java_com_github_nimrod_crosscalculator_CrossCalculator_myAdd + (JNIEnv *env, jobject thiz, jint a, jint b) +{ + char buf[256]; + const jint ret = myAdd(a, b); + // Using logging from inside the native bridge to log-debug. + sprintf(buf, "a %d + b %d = ret %d", a, b, ret); + __android_log_write(ANDROID_LOG_DEBUG, TAG, buf); + return ret; +} + +void JNICALL Java_com_github_nimrod_crosscalculator_CrossCalculator_initNimMain + (JNIEnv *env, jclass thiz) +{ + NimMain(); + __android_log_write(ANDROID_LOG_DEBUG, TAG, "Nimrod initialised"); +} + +// vim:tabstop=2 shiftwidth=2 syntax=c diff --git a/examples/cross_calculator/android/project.properties b/examples/cross_calculator/android/project.properties new file mode 100644 index 000000000..9fb894d9b --- /dev/null +++ b/examples/cross_calculator/android/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-3 diff --git a/examples/cross_calculator/android/readme.txt b/examples/cross_calculator/android/readme.txt new file mode 100644 index 000000000..f8b16d4fc --- /dev/null +++ b/examples/cross_calculator/android/readme.txt @@ -0,0 +1,30 @@ +In this directory you will find the Android platform cross-calculator sample. + +Due to the nature of Android being java and nimrod generating C code, the build +process is slightly more complex because jni code has to be written to bridge +both languages. In a distant future it may be possible for nimrod to generate +the whole jni bridge, but for the moment this is manual work. + +For the jni bridge to work first the java code is compiled with the nimrod code +just declared as a native method which will be resolved at runtime. The scripts +nimbuild.sh and jnibuild.sh are in charge of building the nimrod code and +generating the jni bridge from the java code respectively. Finally, the +ndk-build command from the android ndk tools has to be run to build the binary +libary which will be installed along the final apk. + +All these steps are wrapped in the ant build script through the customization +of the -post-compile rule. If you have the android ndk tools installed and you +modify scripts/nimbuild.sh to point to the directory where you have nimrod +installed on your system, you can simply run "ant debug" to build everything. + +Once the apk is built you can install it on your device or emulator with the +command "adb install bin/CrossCalculator-debug.apk". + +You can use this example as a starting point for your project or look at the +history of the github project at https://github.com/gradha/nimrod-on-android. +That repository documents the individual integration steps you would take for +any Android project (note it uses Eclipse rather than ant to build and +therefore the build process requires more manual fiddling). + +This example runs against the Android level 3 API, meaning devices from +Android 1.5 and above should be able to run the generated binary. diff --git a/examples/cross_calculator/android/res/layout/cross_calculator.xml b/examples/cross_calculator/android/res/layout/cross_calculator.xml new file mode 100644 index 000000000..11531334c --- /dev/null +++ b/examples/cross_calculator/android/res/layout/cross_calculator.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/RelativeLayout1" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:orientation="vertical" > + + <TextView + android:id="@+id/title" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:layout_centerHorizontal="true" + android:text="Crossplatform Nimrod calculator" + android:textSize="20dip" > + + </TextView> + + <TextView + android:id="@+id/value_a" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/title" + android:text="Value A: " > + </TextView> + + <EditText + android:id="@+id/edit_text_a" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_below="@+id/title" + android:ems="10" + android:inputType="number" /> + + <TextView + android:id="@+id/value_b" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/edit_text_a" + android:text="Value B: " > + </TextView> + + <EditText + android:id="@+id/edit_text_b" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_below="@+id/edit_text_a" + android:ems="10" + android:inputType="number" /> + + <Button + android:id="@+id/add_button" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_below="@+id/edit_text_b" + android:scrollbarAlwaysDrawVerticalTrack="false" + android:selectAllOnFocus="false" + android:text="Add!" + android:visibility="visible" /> + + <TextView + android:id="@+id/result_text" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_below="@+id/add_button" /> + +</RelativeLayout> diff --git a/examples/cross_calculator/android/res/values/strings.xml b/examples/cross_calculator/android/res/values/strings.xml new file mode 100644 index 000000000..05cd3ac93 --- /dev/null +++ b/examples/cross_calculator/android/res/values/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="app_name">CrossCalculator</string> +</resources> diff --git a/examples/cross_calculator/android/scripts/jnibuild.sh b/examples/cross_calculator/android/scripts/jnibuild.sh new file mode 100755 index 000000000..8b61f20f7 --- /dev/null +++ b/examples/cross_calculator/android/scripts/jnibuild.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +# Force errors to fail script. +set -e + +# If we are running from inside the scripts subdir, get out. +if [ ! -d src ] +then + cd .. +fi + +# Ok, are we out now? +if [ -d src ] +then + javah -classpath bin/classes \ + -o jni/backend-jni.h \ + com.github.nimrod.crosscalculator.CrossCalculator +else + echo "Uh oh, bin/classes directory not found?" + echo "Try compiling your java code, or opening in eclipse." + exit 1 +fi diff --git a/examples/cross_calculator/android/scripts/nimbuild.sh b/examples/cross_calculator/android/scripts/nimbuild.sh new file mode 100755 index 000000000..97130b8dd --- /dev/null +++ b/examples/cross_calculator/android/scripts/nimbuild.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +# Set this to the local or full path of your nimrod compiler +PATH_TO_NIMROD=~/project/nimrod/bin/nimrod +# Set this to the location of the nimbase.h file so +# the script can update it if it changes. +PATH_TO_NIMBASE=~/project/nimrod/lib/nimbase.h + +# Force errors to fail script. +set -e + +# If we are running from inside the scripts subdir, get out. +if [ ! -d src ] +then + cd .. +fi + +DEST_NIMBASE=jni/nimcache/nimbase.h + +# Ok, are we out now? +if [ -d src ] +then + $PATH_TO_NIMROD c --noMain --app:lib \ + --nimcache:jni/nimcache --cpu:arm --os:linux \ + --compileOnly --header ../nimrod_backend/*.nim + if [ "${PATH_TO_NIMBASE}" -nt "${DEST_NIMBASE}" ] + then + echo "Updating nimbase.h" + cp "${PATH_TO_NIMBASE}" "${DEST_NIMBASE}" + fi +else + echo "Uh oh, src directory not found?" + exit 1 +fi diff --git a/examples/cross_calculator/android/scripts/tags.sh b/examples/cross_calculator/android/scripts/tags.sh new file mode 100755 index 000000000..95507064f --- /dev/null +++ b/examples/cross_calculator/android/scripts/tags.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +if [ ! -d src ] +then + cd .. +fi + +if [ -d src ] +then + ~/bin/objctags -R \ + jni \ + src +fi diff --git a/examples/cross_calculator/android/src/com/github/nimrod/crosscalculator/CrossCalculator.java b/examples/cross_calculator/android/src/com/github/nimrod/crosscalculator/CrossCalculator.java new file mode 100644 index 000000000..df2eed5ea --- /dev/null +++ b/examples/cross_calculator/android/src/com/github/nimrod/crosscalculator/CrossCalculator.java @@ -0,0 +1,80 @@ +package com.github.nimrod.crosscalculator; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +public class CrossCalculator extends Activity +{ + private static final String TAG = "CrossCalculator"; + private TextView result_text; + private EditText edit_text_a, edit_text_b; + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.cross_calculator); + + final Button button = (Button)findViewById(R.id.add_button); + button.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { addButtonClicked(); } }); + + result_text = (TextView)findViewById(R.id.result_text); + edit_text_a = (EditText)findViewById(R.id.edit_text_a); + edit_text_b = (EditText)findViewById(R.id.edit_text_b); + } + + /** Handles clicks on the addition button. + * Reads the values form the input fields and performs the calculation. + */ + private void addButtonClicked() + { + int a = 0, b = 0; + String errors = ""; + final String a_text = edit_text_a.getText().toString(); + final String b_text = edit_text_b.getText().toString(); + try { + a = Integer.valueOf(a_text, 10); + } catch (NumberFormatException e) { + errors += "Can't parse a value '" + a_text + "'. "; + } + try { + b = Integer.valueOf(b_text, 10); + } catch (NumberFormatException e) { + errors += "Can't parse b value '" + b_text + "'"; + } + final int c = myAdd(a, b); + result_text.setText("myAdd(" + a + ", " + b + ") = " + c); + + if (errors.length() > 0) { + Log.e(TAG, errors); + Toast.makeText(this, errors, Toast.LENGTH_SHORT).show(); + } + } + + /* A native method that is implemented by the + * 'backend-jni' native library, which is packaged + * with this application. Adds to integers. + */ + public native int myAdd(int a, int b); + + /* A native method used to initialise Nimrod. + */ + static public native void initNimMain(); + + /* this is used to load the 'backend-jni' library on application + * startup. The library has already been unpacked into + * /data/data/com.github.nimrod.backendjni/lib/libbackend-jni.so at + * installation time by the package manager. + */ + static { + System.loadLibrary("backend-jni"); + initNimMain(); + } +} diff --git a/examples/cross_calculator/ios/cross-calculator.xcodeproj/project.pbxproj b/examples/cross_calculator/ios/cross-calculator.xcodeproj/project.pbxproj new file mode 100644 index 000000000..36b43d31b --- /dev/null +++ b/examples/cross_calculator/ios/cross-calculator.xcodeproj/project.pbxproj @@ -0,0 +1,345 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + D531422A15BC8611005EFF20 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D531422915BC8611005EFF20 /* UIKit.framework */; }; + D531422C15BC8611005EFF20 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D531422B15BC8611005EFF20 /* Foundation.framework */; }; + D531422E15BC8611005EFF20 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D531422D15BC8611005EFF20 /* CoreGraphics.framework */; }; + D531424D15BC87B6005EFF20 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D531424A15BC87B6005EFF20 /* AppDelegate.m */; }; + D531424E15BC87B6005EFF20 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D531424B15BC87B6005EFF20 /* main.m */; }; + D531427215BC94B1005EFF20 /* backend.m in Sources */ = {isa = PBXBuildFile; fileRef = D531426F15BC94B1005EFF20 /* backend.m */; }; + D531427415BC94B1005EFF20 /* system.m in Sources */ = {isa = PBXBuildFile; fileRef = D531427115BC94B1005EFF20 /* system.m */; }; + D5B6F94815FA8D4C0084A85B /* NRViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5B6F94615FA8D4C0084A85B /* NRViewController.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D531422515BC8611005EFF20 /* cross-calculator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "cross-calculator.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + D531422915BC8611005EFF20 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + D531422B15BC8611005EFF20 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + D531422D15BC8611005EFF20 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + D531424715BC87A5005EFF20 /* cross-calculator-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "cross-calculator-Info.plist"; path = "resources/plist/cross-calculator-Info.plist"; sourceTree = "<group>"; }; + D531424915BC87B6005EFF20 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = src/AppDelegate.h; sourceTree = "<group>"; }; + D531424A15BC87B6005EFF20 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = src/AppDelegate.m; sourceTree = "<group>"; }; + D531424B15BC87B6005EFF20 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = src/main.m; sourceTree = "<group>"; }; + D531424C15BC87B6005EFF20 /* cross-calculator-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "cross-calculator-Prefix.pch"; path = "src/cross-calculator-Prefix.pch"; sourceTree = "<group>"; }; + D531426715BC91EF005EFF20 /* tags.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = tags.sh; path = scripts/tags.sh; sourceTree = "<group>"; }; + D531426815BC91EF005EFF20 /* xcode_prebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = xcode_prebuild.sh; path = scripts/xcode_prebuild.sh; sourceTree = "<group>"; }; + D531426F15BC94B1005EFF20 /* backend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = backend.m; path = build/nimcache/backend.m; sourceTree = "<group>"; }; + D531427115BC94B1005EFF20 /* system.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = system.m; path = build/nimcache/system.m; sourceTree = "<group>"; }; + D592E19015C7120F005258EA /* backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = backend.h; path = build/nimcache/backend.h; sourceTree = "<group>"; }; + D592E19115C71415005258EA /* nimbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nimbase.h; path = build/nimcache/nimbase.h; sourceTree = "<group>"; }; + D5B6F94515FA8D4C0084A85B /* NRViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NRViewController.h; path = src/NRViewController.h; sourceTree = "<group>"; }; + D5B6F94615FA8D4C0084A85B /* NRViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NRViewController.m; path = src/NRViewController.m; sourceTree = "<group>"; }; + D5B6F96315FB448D0084A85B /* NRViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = NRViewController.xib; path = resources/ui/NRViewController.xib; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D531422215BC8610005EFF20 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D531422A15BC8611005EFF20 /* UIKit.framework in Frameworks */, + D531422C15BC8611005EFF20 /* Foundation.framework in Frameworks */, + D531422E15BC8611005EFF20 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D531421A15BC8610005EFF20 = { + isa = PBXGroup; + children = ( + D531426A15BC93D5005EFF20 /* build */, + D531424515BC874E005EFF20 /* resources */, + D531426615BC91E1005EFF20 /* scripts */, + D531424815BC87AD005EFF20 /* src */, + D531422815BC8611005EFF20 /* Frameworks */, + D531422615BC8611005EFF20 /* Products */, + ); + sourceTree = "<group>"; + }; + D531422615BC8611005EFF20 /* Products */ = { + isa = PBXGroup; + children = ( + D531422515BC8611005EFF20 /* cross-calculator.app */, + ); + name = Products; + sourceTree = "<group>"; + }; + D531422815BC8611005EFF20 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D531422915BC8611005EFF20 /* UIKit.framework */, + D531422B15BC8611005EFF20 /* Foundation.framework */, + D531422D15BC8611005EFF20 /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; + D531424515BC874E005EFF20 /* resources */ = { + isa = PBXGroup; + children = ( + D531424615BC8756005EFF20 /* plist */, + D5B6F96115FB447C0084A85B /* ui */, + ); + name = resources; + sourceTree = "<group>"; + }; + D531424615BC8756005EFF20 /* plist */ = { + isa = PBXGroup; + children = ( + D531424715BC87A5005EFF20 /* cross-calculator-Info.plist */, + ); + name = plist; + sourceTree = "<group>"; + }; + D531424815BC87AD005EFF20 /* src */ = { + isa = PBXGroup; + children = ( + D531424915BC87B6005EFF20 /* AppDelegate.h */, + D531424A15BC87B6005EFF20 /* AppDelegate.m */, + D531424C15BC87B6005EFF20 /* cross-calculator-Prefix.pch */, + D531424B15BC87B6005EFF20 /* main.m */, + D5B6F94515FA8D4C0084A85B /* NRViewController.h */, + D5B6F94615FA8D4C0084A85B /* NRViewController.m */, + ); + name = src; + sourceTree = "<group>"; + }; + D531426615BC91E1005EFF20 /* scripts */ = { + isa = PBXGroup; + children = ( + D531426715BC91EF005EFF20 /* tags.sh */, + D531426815BC91EF005EFF20 /* xcode_prebuild.sh */, + ); + name = scripts; + sourceTree = "<group>"; + }; + D531426A15BC93D5005EFF20 /* build */ = { + isa = PBXGroup; + children = ( + D531426E15BC94A6005EFF20 /* nimrod */, + ); + name = build; + sourceTree = "<group>"; + }; + D531426E15BC94A6005EFF20 /* nimrod */ = { + isa = PBXGroup; + children = ( + D592E19015C7120F005258EA /* backend.h */, + D531426F15BC94B1005EFF20 /* backend.m */, + D592E19115C71415005258EA /* nimbase.h */, + D531427115BC94B1005EFF20 /* system.m */, + ); + name = nimrod; + sourceTree = "<group>"; + }; + D5B6F96115FB447C0084A85B /* ui */ = { + isa = PBXGroup; + children = ( + D5B6F96315FB448D0084A85B /* NRViewController.xib */, + ); + name = ui; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + D531422415BC8610005EFF20 /* cross-calculator */ = { + isa = PBXNativeTarget; + buildConfigurationList = D531423D15BC8611005EFF20 /* Build configuration list for PBXNativeTarget "cross-calculator" */; + buildPhases = ( + D531426915BC926C005EFF20 /* ShellScript */, + D531422115BC8610005EFF20 /* Sources */, + D531422215BC8610005EFF20 /* Frameworks */, + D531422315BC8610005EFF20 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "cross-calculator"; + productName = "cross-calculator"; + productReference = D531422515BC8611005EFF20 /* cross-calculator.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D531421C15BC8610005EFF20 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + ORGANIZATIONNAME = "Electric Hands Software"; + }; + buildConfigurationList = D531421F15BC8610005EFF20 /* Build configuration list for PBXProject "cross-calculator" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D531421A15BC8610005EFF20; + productRefGroup = D531422615BC8611005EFF20 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D531422415BC8610005EFF20 /* cross-calculator */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D531422315BC8610005EFF20 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + D531426915BC926C005EFF20 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = scripts/xcode_prebuild.sh; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D531422115BC8610005EFF20 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D531424D15BC87B6005EFF20 /* AppDelegate.m in Sources */, + D531424E15BC87B6005EFF20 /* main.m in Sources */, + D531427215BC94B1005EFF20 /* backend.m in Sources */, + D531427415BC94B1005EFF20 /* system.m in Sources */, + D5B6F94815FA8D4C0084A85B /* NRViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + D531423B15BC8611005EFF20 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + armv7, + armv6, + ); + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = ""; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + OTHER_LDFLAGS = ( + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + D531423C15BC8611005EFF20 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + armv7, + armv6, + ); + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = ""; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + OTHER_LDFLAGS = ( + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + D531423E15BC8611005EFF20 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "src/cross-calculator-Prefix.pch"; + INFOPLIST_FILE = "resources/plist/cross-calculator-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + D531423F15BC8611005EFF20 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "src/cross-calculator-Prefix.pch"; + INFOPLIST_FILE = "resources/plist/cross-calculator-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D531421F15BC8610005EFF20 /* Build configuration list for PBXProject "cross-calculator" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D531423B15BC8611005EFF20 /* Debug */, + D531423C15BC8611005EFF20 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D531423D15BC8611005EFF20 /* Build configuration list for PBXNativeTarget "cross-calculator" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D531423E15BC8611005EFF20 /* Debug */, + D531423F15BC8611005EFF20 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D531421C15BC8610005EFF20 /* Project object */; +} diff --git a/examples/cross_calculator/ios/readme.txt b/examples/cross_calculator/ios/readme.txt new file mode 100644 index 000000000..e75db72bf --- /dev/null +++ b/examples/cross_calculator/ios/readme.txt @@ -0,0 +1,17 @@ +In this directory you will find the iOS platform cross-calculator sample. + +The iOS version of the code builds a view controller in charge of displaying +the interface to the user. The nimrod backend code is compiled into C code and +put into build/nimrod as a pre-build phase of the project. + +When the calculate button is used the view controller calls the nimrod code to +delegate the logic of the operation and puts the result in a label for display. +All interface error checks are implemented in the view controller. + +You can use this as a starting point for your project or look at the history of +the github project at https://github.com/gradha/nimrod-on-ios. That repository +documents the individual integration steps you would take for any iOS project. + +This version of the iOS project is known to work with Xcode 4.2 and Xcode +4.4.1. The final binary can be deployed on iOS 3.x to 5.x supporting all iOS +platforms and versions available at the moment. diff --git a/examples/cross_calculator/ios/resources/plist/cross-calculator-Info.plist b/examples/cross_calculator/ios/resources/plist/cross-calculator-Info.plist new file mode 100644 index 000000000..758f20e38 --- /dev/null +++ b/examples/cross_calculator/ios/resources/plist/cross-calculator-Info.plist @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>en</string> + <key>CFBundleDisplayName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFiles</key> + <array/> + <key>CFBundleIdentifier</key> + <string>com.github.nimrod.${PRODUCT_NAME:rfc1034identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>UIApplicationExitsOnSuspend</key> + <true/> +</dict> +</plist> diff --git a/examples/cross_calculator/ios/resources/ui/NRViewController.xib b/examples/cross_calculator/ios/resources/ui/NRViewController.xib new file mode 100644 index 000000000..b260db2af --- /dev/null +++ b/examples/cross_calculator/ios/resources/ui/NRViewController.xib @@ -0,0 +1,479 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00"> + <data> + <int key="IBDocument.SystemTarget">0</int> + <string key="IBDocument.SystemVersion">11E53</string> + <string key="IBDocument.InterfaceBuilderVersion">2549</string> + <string key="IBDocument.AppKitVersion">1138.47</string> + <string key="IBDocument.HIToolboxVersion">569.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="NS.object.0">1498</string> + </object> + <array key="IBDocument.IntegratedClassDependencies"> + <string>IBProxyObject</string> + <string>IBUIButton</string> + <string>IBUILabel</string> + <string>IBUITextField</string> + <string>IBUIView</string> + </array> + <array key="IBDocument.PluginDependencies"> + <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + </array> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <string key="NS.key.0">PluginDependencyRecalculationVersion</string> + <integer value="1" key="NS.object.0"/> + </object> + <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000"> + <object class="IBProxyObject" id="372490531"> + <string key="IBProxiedObjectIdentifier">IBFilesOwner</string> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + </object> + <object class="IBProxyObject" id="975951072"> + <string key="IBProxiedObjectIdentifier">IBFirstResponder</string> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + </object> + <object class="IBUIView" id="191373211"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">274</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="IBUIButton" id="467453084"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">292</int> + <string key="NSFrame">{{0, -10}, {320, 480}}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <int key="IBUITag">1</int> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <int key="IBUIContentHorizontalAlignment">0</int> + <int key="IBUIContentVerticalAlignment">0</int> + <object class="NSColor" key="IBUIHighlightedTitleColor" id="95215378"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + </object> + <object class="NSColor" key="IBUINormalTitleColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes> + </object> + <object class="NSColor" key="IBUINormalTitleShadowColor" id="1056499111"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + </object> + <object class="IBUIFontDescription" key="IBUIFontDescription" id="686052398"> + <int key="type">2</int> + <double key="pointSize">15</double> + </object> + <object class="NSFont" key="IBUIFont" id="594372787"> + <string key="NSName">Helvetica-Bold</string> + <double key="NSSize">15</double> + <int key="NSfFlags">16</int> + </object> + </object> + <object class="IBUILabel" id="353054360"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">306</int> + <string key="NSFrameSize">{320, 34}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="525225214"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <bool key="IBUIClipsSubviews">YES</bool> + <int key="IBUIContentMode">7</int> + <int key="IBUITag">2</int> + <bool key="IBUIUserInteractionEnabled">NO</bool> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <string key="IBUIText">Nimrod Crossplatform Calculator</string> + <object class="NSColor" key="IBUITextColor" id="128895179"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MCAwIDAAA</bytes> + </object> + <nil key="IBUIHighlightedColor"/> + <int key="IBUIBaselineAdjustment">0</int> + <float key="IBUIMinimumFontSize">10</float> + <int key="IBUITextAlignment">1</int> + <object class="IBUIFontDescription" key="IBUIFontDescription"> + <int key="type">2</int> + <double key="pointSize">18</double> + </object> + <object class="NSFont" key="IBUIFont"> + <string key="NSName">Helvetica-Bold</string> + <double key="NSSize">18</double> + <int key="NSfFlags">16</int> + </object> + </object> + <object class="IBUILabel" id="525225214"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">294</int> + <string key="NSFrame">{{20, 42}, {165, 31}}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="1040444341"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <bool key="IBUIClipsSubviews">YES</bool> + <int key="IBUIContentMode">7</int> + <int key="IBUITag">3</int> + <bool key="IBUIUserInteractionEnabled">NO</bool> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <string key="IBUIText">Value A:</string> + <reference key="IBUITextColor" ref="128895179"/> + <nil key="IBUIHighlightedColor"/> + <int key="IBUIBaselineAdjustment">0</int> + <float key="IBUIMinimumFontSize">10</float> + <object class="IBUIFontDescription" key="IBUIFontDescription" id="768572949"> + <int key="type">1</int> + <double key="pointSize">17</double> + </object> + <object class="NSFont" key="IBUIFont" id="972319481"> + <string key="NSName">Helvetica</string> + <double key="NSSize">17</double> + <int key="NSfFlags">16</int> + </object> + </object> + <object class="IBUILabel" id="904781109"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">294</int> + <string key="NSFrame">{{20, 81}, {165, 31}}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="1041721572"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <bool key="IBUIClipsSubviews">YES</bool> + <int key="IBUIContentMode">7</int> + <int key="IBUITag">4</int> + <bool key="IBUIUserInteractionEnabled">NO</bool> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <string key="IBUIText">Value B:</string> + <reference key="IBUITextColor" ref="128895179"/> + <nil key="IBUIHighlightedColor"/> + <int key="IBUIBaselineAdjustment">0</int> + <float key="IBUIMinimumFontSize">10</float> + <reference key="IBUIFontDescription" ref="768572949"/> + <reference key="IBUIFont" ref="972319481"/> + </object> + <object class="IBUIButton" id="557594991"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">291</int> + <string key="NSFrame">{{193, 124}, {107, 37}}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <int key="IBUITag">5</int> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <int key="IBUIContentHorizontalAlignment">0</int> + <int key="IBUIContentVerticalAlignment">0</int> + <int key="IBUIButtonType">1</int> + <string key="IBUINormalTitle">Add!</string> + <reference key="IBUIHighlightedTitleColor" ref="95215378"/> + <object class="NSColor" key="IBUINormalTitleColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes> + </object> + <reference key="IBUINormalTitleShadowColor" ref="1056499111"/> + <reference key="IBUIFontDescription" ref="686052398"/> + <reference key="IBUIFont" ref="594372787"/> + </object> + <object class="IBUILabel" id="360864196"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">292</int> + <string key="NSFrame">{{20, 124}, {60, 37}}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="521073831"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <bool key="IBUIClipsSubviews">YES</bool> + <int key="IBUIContentMode">7</int> + <int key="IBUITag">6</int> + <bool key="IBUIUserInteractionEnabled">NO</bool> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <string key="IBUIText">Result:</string> + <reference key="IBUITextColor" ref="128895179"/> + <nil key="IBUIHighlightedColor"/> + <int key="IBUIBaselineAdjustment">0</int> + <float key="IBUIMinimumFontSize">10</float> + <reference key="IBUIFontDescription" ref="768572949"/> + <reference key="IBUIFont" ref="972319481"/> + </object> + <object class="IBUILabel" id="521073831"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">294</int> + <string key="NSFrame">{{88, 124}, {97, 37}}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="557594991"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <bool key="IBUIClipsSubviews">YES</bool> + <int key="IBUIContentMode">7</int> + <int key="IBUITag">7</int> + <bool key="IBUIUserInteractionEnabled">NO</bool> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <string key="IBUIText"/> + <reference key="IBUITextColor" ref="128895179"/> + <nil key="IBUIHighlightedColor"/> + <int key="IBUIBaselineAdjustment">0</int> + <float key="IBUIMinimumFontSize">10</float> + <reference key="IBUIFontDescription" ref="768572949"/> + <reference key="IBUIFont" ref="972319481"/> + </object> + <object class="IBUITextField" id="1040444341"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">291</int> + <string key="NSFrame">{{193, 42}, {107, 31}}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="904781109"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <bool key="IBUIClipsSubviews">YES</bool> + <int key="IBUITag">8</int> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <int key="IBUIContentVerticalAlignment">0</int> + <string key="IBUIText"/> + <int key="IBUIBorderStyle">3</int> + <string key="IBUIPlaceholder">Integer</string> + <object class="NSColor" key="IBUITextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + <object class="NSColorSpace" key="NSCustomColorSpace" id="433120901"> + <int key="NSID">2</int> + </object> + </object> + <int key="IBUITextAlignment">1</int> + <bool key="IBUIAdjustsFontSizeToFit">YES</bool> + <float key="IBUIMinimumFontSize">17</float> + <object class="IBUITextInputTraits" key="IBUITextInputTraits"> + <int key="IBUIKeyboardType">4</int> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + </object> + <int key="IBUIClearButtonMode">1</int> + <object class="IBUIFontDescription" key="IBUIFontDescription" id="836805198"> + <int key="type">1</int> + <double key="pointSize">14</double> + </object> + <object class="NSFont" key="IBUIFont" id="700927782"> + <string key="NSName">Helvetica</string> + <double key="NSSize">14</double> + <int key="NSfFlags">16</int> + </object> + </object> + <object class="IBUITextField" id="1041721572"> + <reference key="NSNextResponder" ref="191373211"/> + <int key="NSvFlags">291</int> + <string key="NSFrame">{{193, 81}, {107, 31}}</string> + <reference key="NSSuperview" ref="191373211"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="360864196"/> + <string key="NSReuseIdentifierKey">_NS:9</string> + <bool key="IBUIOpaque">NO</bool> + <bool key="IBUIClipsSubviews">YES</bool> + <int key="IBUITag">9</int> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + <int key="IBUIContentVerticalAlignment">0</int> + <string key="IBUIText"/> + <int key="IBUIBorderStyle">3</int> + <string key="IBUIPlaceholder">Integer</string> + <object class="NSColor" key="IBUITextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + <reference key="NSCustomColorSpace" ref="433120901"/> + </object> + <int key="IBUITextAlignment">1</int> + <bool key="IBUIAdjustsFontSizeToFit">YES</bool> + <float key="IBUIMinimumFontSize">17</float> + <object class="IBUITextInputTraits" key="IBUITextInputTraits"> + <int key="IBUIKeyboardType">4</int> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + </object> + <int key="IBUIClearButtonMode">1</int> + <reference key="IBUIFontDescription" ref="836805198"/> + <reference key="IBUIFont" ref="700927782"/> + </object> + </array> + <string key="NSFrame">{{0, 20}, {320, 460}}</string> + <reference key="NSSuperview"/> + <reference key="NSWindow"/> + <reference key="NSNextKeyView" ref="353054360"/> + <object class="NSColor" key="IBUIBackgroundColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + <reference key="NSCustomColorSpace" ref="433120901"/> + </object> + <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/> + <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> + </object> + </array> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <array class="NSMutableArray" key="connectionRecords"/> + <object class="IBMutableOrderedSet" key="objectRecords"> + <array key="orderedObjects"> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <array key="object" id="0"/> + <reference key="children" ref="1000"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1</int> + <reference key="object" ref="191373211"/> + <array class="NSMutableArray" key="children"> + <reference ref="353054360"/> + <reference ref="525225214"/> + <reference ref="904781109"/> + <reference ref="557594991"/> + <reference ref="360864196"/> + <reference ref="521073831"/> + <reference ref="1040444341"/> + <reference ref="1041721572"/> + <reference ref="467453084"/> + </array> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="372490531"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="975951072"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">14</int> + <reference key="object" ref="1041721572"/> + <reference key="parent" ref="191373211"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">13</int> + <reference key="object" ref="1040444341"/> + <reference key="parent" ref="191373211"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">12</int> + <reference key="object" ref="521073831"/> + <reference key="parent" ref="191373211"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">11</int> + <reference key="object" ref="360864196"/> + <reference key="parent" ref="191373211"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">10</int> + <reference key="object" ref="557594991"/> + <reference key="parent" ref="191373211"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">8</int> + <reference key="object" ref="904781109"/> + <reference key="parent" ref="191373211"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">7</int> + <reference key="object" ref="525225214"/> + <reference key="parent" ref="191373211"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4</int> + <reference key="object" ref="353054360"/> + <reference key="parent" ref="191373211"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">22</int> + <reference key="object" ref="467453084"/> + <reference key="parent" ref="191373211"/> + </object> + </array> + </object> + <dictionary class="NSMutableDictionary" key="flattenedProperties"> + <string key="-1.CustomClassName">NRViewController</string> + <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="-2.CustomClassName">UIResponder</string> + <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="10.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="11.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="12.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="13.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="14.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="22.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="4.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + <string key="8.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> + <nil key="activeLocalization"/> + <dictionary class="NSMutableDictionary" key="localizations"/> + <nil key="sourceID"/> + <int key="maxID">22</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <array class="NSMutableArray" key="referencedPartialClassDescriptions"> + <object class="IBPartialClassDescription"> + <string key="className">NRViewController</string> + <string key="superclassName">UIViewController</string> + <dictionary class="NSMutableDictionary" key="actions"> + <string key="backgroundTouched">id</string> + <string key="calculateButtonTouched">id</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="actionInfosByName"> + <object class="IBActionInfo" key="backgroundTouched"> + <string key="name">backgroundTouched</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="calculateButtonTouched"> + <string key="name">calculateButtonTouched</string> + <string key="candidateClassName">id</string> + </object> + </dictionary> + <dictionary class="NSMutableDictionary" key="outlets"> + <string key="aText">UITextField</string> + <string key="bText">UITextField</string> + <string key="calculateButton">UIButton</string> + <string key="resultLabel">UILabel</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName"> + <object class="IBToOneOutletInfo" key="aText"> + <string key="name">aText</string> + <string key="candidateClassName">UITextField</string> + </object> + <object class="IBToOneOutletInfo" key="bText"> + <string key="name">bText</string> + <string key="candidateClassName">UITextField</string> + </object> + <object class="IBToOneOutletInfo" key="calculateButton"> + <string key="name">calculateButton</string> + <string key="candidateClassName">UIButton</string> + </object> + <object class="IBToOneOutletInfo" key="resultLabel"> + <string key="name">resultLabel</string> + <string key="candidateClassName">UILabel</string> + </object> + </dictionary> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">./Classes/NRViewController.h</string> + </object> + </object> + </array> + </object> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string> + <real value="0.0" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + <string key="IBCocoaTouchPluginVersion">1498</string> + </data> +</archive> diff --git a/examples/cross_calculator/ios/scripts/tags.sh b/examples/cross_calculator/ios/scripts/tags.sh new file mode 100755 index 000000000..111e7a1c0 --- /dev/null +++ b/examples/cross_calculator/ios/scripts/tags.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +if [ ! -d src ] +then + cd .. +fi + +if [ -d src ] +then + ~/bin/objctags -R \ + build/nimcache \ + src +fi diff --git a/examples/cross_calculator/ios/scripts/xcode_prebuild.sh b/examples/cross_calculator/ios/scripts/xcode_prebuild.sh new file mode 100755 index 000000000..7626ba0b9 --- /dev/null +++ b/examples/cross_calculator/ios/scripts/xcode_prebuild.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# Set this to the full path of your nimrod compiler +# since Xcode doesn't inherit your user environment. +PATH_TO_NIMROD=~/project/nimrod/bin/nimrod +# Set this to the location of the nimbase.h file so +# the script can update it if it changes. +PATH_TO_NIMBASE=~/project/nimrod/lib/nimbase.h + +# Force errors to fail script. +set -e + +# If we are running from inside the scripts subdir, get out. +if [ ! -d src ] +then + cd .. +fi + +DEST_NIMBASE=build/nimcache/nimbase.h + +# Ok, are we out now? +if [ -d src ] +then + # You may want to use a wildcard here to compile all nimrod files. + $PATH_TO_NIMROD objc --noMain --app:lib \ + --nimcache:build/nimcache --compileOnly \ + --header --cpu:i386 ../nimrod_backend/backend.nim + if [ "${PATH_TO_NIMBASE}" -nt "${DEST_NIMBASE}" ] + then + echo "Updating nimbase.h" + cp "${PATH_TO_NIMBASE}" "${DEST_NIMBASE}" + fi +else + echo "Uh oh, src directory not found?" + exit 1 +fi diff --git a/examples/cross_calculator/ios/src/AppDelegate.h b/examples/cross_calculator/ios/src/AppDelegate.h new file mode 100644 index 000000000..a5a8b3852 --- /dev/null +++ b/examples/cross_calculator/ios/src/AppDelegate.h @@ -0,0 +1,7 @@ +#import <UIKit/UIKit.h> + +@interface AppDelegate : UIResponder <UIApplicationDelegate> + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/examples/cross_calculator/ios/src/AppDelegate.m b/examples/cross_calculator/ios/src/AppDelegate.m new file mode 100644 index 000000000..53e7f6188 --- /dev/null +++ b/examples/cross_calculator/ios/src/AppDelegate.m @@ -0,0 +1,39 @@ +#import "AppDelegate.h" + +#import "NRViewController.h" + + +@interface AppDelegate () +@property (nonatomic, retain) NRViewController *viewController; +@end + + +@implementation AppDelegate + +@synthesize viewController = _viewController; +@synthesize window = _window; + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[[UIWindow alloc] + initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; + + self.viewController = [[NRViewController new] autorelease]; + if ([self.window respondsToSelector:@selector(setRootViewController:)]) + self.window.rootViewController = self.viewController; + else + [self.window addSubview:self.viewController.view]; + [self.window makeKeyAndVisible]; + + return YES; +} + +- (void)dealloc +{ + [_window release]; + [_viewController release]; + [super dealloc]; +} + +@end diff --git a/examples/cross_calculator/ios/src/NRViewController.h b/examples/cross_calculator/ios/src/NRViewController.h new file mode 100644 index 000000000..36ba37758 --- /dev/null +++ b/examples/cross_calculator/ios/src/NRViewController.h @@ -0,0 +1,11 @@ +@interface NRViewController : UIViewController + +@property (nonatomic, retain) IBOutlet UIButton *calculateButton; +@property (nonatomic, retain) IBOutlet UITextField *aText; +@property (nonatomic, retain) IBOutlet UITextField *bText; +@property (nonatomic, retain) IBOutlet UILabel *resultLabel; + +- (IBAction)calculateButtonTouched; +- (IBAction)backgroundTouched; + +@end \ No newline at end of file diff --git a/examples/cross_calculator/ios/src/NRViewController.m b/examples/cross_calculator/ios/src/NRViewController.m new file mode 100644 index 000000000..bd0df7d6b --- /dev/null +++ b/examples/cross_calculator/ios/src/NRViewController.m @@ -0,0 +1,210 @@ +#import "NRViewController.h" + +#import "backend.h" + + +@implementation NRViewController + +@synthesize aText = _aText; +@synthesize bText = _bText; +@synthesize calculateButton = _calculateButton; +@synthesize resultLabel = _resultLabel; + +- (void)dealloc +{ + [_aText release]; + [_bText release]; + [_calculateButton release]; + [_resultLabel release]; + [super dealloc]; +} + +- (void)viewDidUnload +{ + self.calculateButton = nil; + self.aText = nil; + self.bText = nil; + self.resultLabel = nil; + [super viewDidUnload]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation: + (UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +/// User wants to calculate the inputs. Well, do it! +- (IBAction)calculateButtonTouched +{ + // Dismiss all keyboards. + [self backgroundTouched]; + + // Call nimrod code, store the result and display it. + const int a = [self.aText.text intValue]; + const int b = [self.bText.text intValue]; + const int c = myAdd(a, b); + self.resultLabel.text = [NSString stringWithFormat:@"%d + %d = %d", + a, b, c]; +} + +/// If the user touches the background, dismiss any visible keyboard. +- (IBAction)backgroundTouched +{ + [self.aText resignFirstResponder]; + [self.bText resignFirstResponder]; +} + +/** Custom loadView method for backwards compatiblity. + * Unfortunately I've been unable to coerce Xcode 4.4 to generate nib files + * which are compatible with my trusty iOS 3.0 ipod touch so in order to be + * fully compatible for all devices we have to build the interface manually in + * code rather than through the keyed archivers provided by the interface + * builder. + * + * Rather than recreating the user interface manually in code the tool nib2obj + * was used on the xib file and slightly modified to fit the original property + * names. Which means here is a lot of garbage you would never write in real + * life. Please ignore the following "wall of code" for the purposes of + * learning Nimrod, this is all just because Apple can't be bothered to + * maintain backwards compatibility properly. + */ +- (void)loadView +{ + [super loadView]; + + self.calculateButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; + self.calculateButton.autoresizesSubviews = YES; + self.calculateButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; + self.calculateButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; + self.calculateButton.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + self.calculateButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; + self.calculateButton.frame = CGRectMake(193.0, 124.0, 107.0, 37.0); + self.calculateButton.tag = 5; + [self.calculateButton setTitle:@"Add!" forState:UIControlStateNormal]; + [self.calculateButton addTarget:self + action:@selector(calculateButtonTouched) + forControlEvents:UIControlEventTouchUpInside]; + + UILabel *label11 = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 124.0, 60.0, 37.0)]; + label11.adjustsFontSizeToFitWidth = YES; + label11.autoresizesSubviews = YES; + label11.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; + label11.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + label11.frame = CGRectMake(20.0, 124.0, 60.0, 37.0); + label11.tag = 6; + label11.text = @"Result:"; + + UILabel *label4 = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 34.0)]; + label4.adjustsFontSizeToFitWidth = YES; + label4.autoresizesSubviews = YES; + label4.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin; + label4.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + label4.frame = CGRectMake(0.0, 0.0, 320.0, 34.0); + label4.tag = 2; + label4.text = @"Nimrod Crossplatform Calculator"; + label4.textAlignment = UITextAlignmentCenter; + + UIButton *background_button = [UIButton buttonWithType:UIButtonTypeCustom]; + background_button.autoresizesSubviews = YES; + background_button.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; + background_button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; + background_button.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + background_button.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; + background_button.frame = CGRectMake(0.0, -10.0, 320.0, 480.0); + background_button.tag = 1; + [background_button addTarget:self action:@selector(backgroundTouched) + forControlEvents:UIControlEventTouchDown]; + + self.resultLabel = [[[UILabel alloc] initWithFrame:CGRectMake(88.0, 124.0, 97.0, 37.0)] autorelease]; + self.resultLabel.adjustsFontSizeToFitWidth = YES; + self.resultLabel.autoresizesSubviews = YES; + self.resultLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; + self.resultLabel.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + self.resultLabel.frame = CGRectMake(88.0, 124.0, 97.0, 37.0); + self.resultLabel.tag = 7; + self.resultLabel.text = @""; + + self.aText = [[[UITextField alloc] initWithFrame:CGRectMake(193.0, 42.0, 107.0, 31.0)] autorelease]; + self.aText.adjustsFontSizeToFitWidth = YES; + self.aText.autocapitalizationType = UITextAutocapitalizationTypeNone; + self.aText.autocorrectionType = UITextAutocorrectionTypeDefault; + self.aText.autoresizesSubviews = YES; + self.aText.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; + self.aText.borderStyle = UITextBorderStyleRoundedRect; + self.aText.clearButtonMode = UITextFieldViewModeWhileEditing; + self.aText.clearsOnBeginEditing = NO; + self.aText.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + self.aText.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + self.aText.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; + self.aText.enablesReturnKeyAutomatically = NO; + self.aText.frame = CGRectMake(193.0, 42.0, 107.0, 31.0); + self.aText.keyboardAppearance = UIKeyboardAppearanceDefault; + self.aText.keyboardType = UIKeyboardTypeNumberPad; + self.aText.placeholder = @"Integer"; + self.aText.returnKeyType = UIReturnKeyDefault; + self.aText.tag = 8; + self.aText.text = @""; + self.aText.textAlignment = UITextAlignmentCenter; + + UILabel *label7 = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 42.0, 165.0, 31.0)]; + label7.adjustsFontSizeToFitWidth = YES; + label7.autoresizesSubviews = YES; + label7.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; + label7.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + label7.frame = CGRectMake(20.0, 42.0, 165.0, 31.0); + label7.tag = 3; + label7.text = @"Value A:"; + + UILabel *label8 = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 81.0, 165.0, 31.0)]; + label8.adjustsFontSizeToFitWidth = YES; + label8.autoresizesSubviews = YES; + label8.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; + label8.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + label8.frame = CGRectMake(20.0, 81.0, 165.0, 31.0); + label8.tag = 4; + label8.text = @"Value B:"; + + self.bText = [[[UITextField alloc] + initWithFrame:CGRectMake(193.0, 81.0, 107.0, 31.0)] autorelease]; + self.bText.adjustsFontSizeToFitWidth = YES; + self.bText.autocapitalizationType = UITextAutocapitalizationTypeNone; + self.bText.autocorrectionType = UITextAutocorrectionTypeDefault; + self.bText.autoresizesSubviews = YES; + self.bText.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; + self.bText.borderStyle = UITextBorderStyleRoundedRect; + self.bText.clearButtonMode = UITextFieldViewModeWhileEditing; + self.bText.clearsOnBeginEditing = NO; + self.bText.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + self.bText.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + self.bText.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; + self.bText.enablesReturnKeyAutomatically = NO; + self.bText.frame = CGRectMake(193.0, 81.0, 107.0, 31.0); + self.bText.keyboardAppearance = UIKeyboardAppearanceDefault; + self.bText.keyboardType = UIKeyboardTypeNumberPad; + self.bText.placeholder = @"Integer"; + self.bText.returnKeyType = UIReturnKeyDefault; + self.bText.tag = 9; + self.bText.text = @""; + self.bText.textAlignment = UITextAlignmentCenter; + + self.view.frame = CGRectMake(0.0, 20.0, 320.0, 460.0); + self.view.autoresizesSubviews = YES; + self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + self.view.backgroundColor = [UIColor colorWithWhite:1.000 alpha:1.000]; + self.view.contentStretch = CGRectFromString(@"{{0, 0}, {1, 1}}"); + self.view.frame = CGRectMake(0.0, 20.0, 320.0, 460.0); + self.view.tag = 0; + + [self.view addSubview:background_button]; + [self.view addSubview:label4]; + [self.view addSubview:label7]; + [self.view addSubview:label8]; + [self.view addSubview:self.calculateButton]; + [self.view addSubview:label11]; + [self.view addSubview:self.resultLabel]; + [self.view addSubview:self.aText]; + [self.view addSubview:self.bText]; +} + +@end diff --git a/examples/cross_calculator/ios/src/cross-calculator-Prefix.pch b/examples/cross_calculator/ios/src/cross-calculator-Prefix.pch new file mode 100644 index 000000000..2f331ed43 --- /dev/null +++ b/examples/cross_calculator/ios/src/cross-calculator-Prefix.pch @@ -0,0 +1,10 @@ +#import <Availability.h> + +#ifndef __IPHONE_3_0 +#warning "This project uses features only available in iOS SDK 3.0 and later." +#endif + +#ifdef __OBJC__ + #import <UIKit/UIKit.h> + #import <Foundation/Foundation.h> +#endif diff --git a/examples/cross_calculator/ios/src/main.m b/examples/cross_calculator/ios/src/main.m new file mode 100644 index 000000000..7866684fe --- /dev/null +++ b/examples/cross_calculator/ios/src/main.m @@ -0,0 +1,13 @@ +#import <UIKit/UIKit.h> + +#import "AppDelegate.h" +#import "backend.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + NimMain(); + return UIApplicationMain(argc, argv, nil, + NSStringFromClass([AppDelegate class])); + } +} diff --git a/examples/lazarus/nimlaz.lpi b/examples/cross_calculator/lazarus/nimlaz.lpi index 3b9abd129..3b9abd129 100755 --- a/examples/lazarus/nimlaz.lpi +++ b/examples/cross_calculator/lazarus/nimlaz.lpi diff --git a/examples/lazarus/nimlaz.lpr b/examples/cross_calculator/lazarus/nimlaz.lpr index 4457209d1..4457209d1 100755 --- a/examples/lazarus/nimlaz.lpr +++ b/examples/cross_calculator/lazarus/nimlaz.lpr diff --git a/examples/lazarus/nimlaz.lrs b/examples/cross_calculator/lazarus/nimlaz.lrs index 234df82bd..234df82bd 100755 --- a/examples/lazarus/nimlaz.lrs +++ b/examples/cross_calculator/lazarus/nimlaz.lrs diff --git a/examples/lazarus/nimlaz.rc b/examples/cross_calculator/lazarus/nimlaz.rc index d66bb817c..d66bb817c 100644 --- a/examples/lazarus/nimlaz.rc +++ b/examples/cross_calculator/lazarus/nimlaz.rc diff --git a/examples/lazarus/readme.txt b/examples/cross_calculator/lazarus/readme.txt index ec222a815..ec222a815 100755 --- a/examples/lazarus/readme.txt +++ b/examples/cross_calculator/lazarus/readme.txt diff --git a/examples/lazarus/unit1.lfm b/examples/cross_calculator/lazarus/unit1.lfm index bf60ff715..bf60ff715 100755 --- a/examples/lazarus/unit1.lfm +++ b/examples/cross_calculator/lazarus/unit1.lfm diff --git a/examples/lazarus/unit1.pas b/examples/cross_calculator/lazarus/unit1.pas index aa0ef6cf7..aa0ef6cf7 100755 --- a/examples/lazarus/unit1.pas +++ b/examples/cross_calculator/lazarus/unit1.pas diff --git a/examples/lazarus/backend.nim b/examples/cross_calculator/nimrod_backend/backend.nim index 64f0c5bf7..ffa4311f9 100755 --- a/examples/lazarus/backend.nim +++ b/examples/cross_calculator/nimrod_backend/backend.nim @@ -1,4 +1,4 @@ -# Backend for the Lazarus GUI +# Backend for the different user interfaces. proc myAdd*(x, y: int): int {.cdecl, exportc.} = result = x + y diff --git a/examples/cross_calculator/readme.txt b/examples/cross_calculator/readme.txt new file mode 100644 index 000000000..e59cb7e54 --- /dev/null +++ b/examples/cross_calculator/readme.txt @@ -0,0 +1,11 @@ +The cross platform calculator illustrates how to use Nimrod to create a backend +called by different native user interfaces. + +Since the purpose of the example is to show how the cross platform code +interacts with Nimrod the actual backend code is just a simple addition proc. +By keeping your program logic in Nimrod you can easily reuse it in different +platforms. + +To avoid duplication of code, the backend code lies in a separate directory and +each platform compiles it with a different custom build process, usually +generating C code in a temporary build directory. |