• 沒有找到結果。

7.2 未來研究方向

7.2.4 其他的研究方向

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

85

EWDL 導引精靈目前尚無法以 MoDWiz3 實現,原因是因為此精靈必須使用到目前 MoDWiz3 不支援的迭代功能。

7.2.3 導引精靈平台的擴充

未來也希望擴充 MoDWiz3 的適用導引精靈平台至其他主流手機平板系統。除 Android 系統外,手機平板系統的其他主流,如 Apple 的 iOS 與微軟的 Windows Phone 顯然亦有 導引精靈之需求。因此我們未來的方向之一是計畫將這些將導引精靈平台延伸至這些手 機主流平台。除此外,我們也計畫擴充原先的 Web 應用平台,使 Web 的人機介面由原 先的 HTML4 改為功能更強,介面項目更多的 HTML5。

7.2.4 其他的研究方向

其他的研究方向還包括:擴展 MoDWiz3 使其不僅具有條件分支功能,更還具有重複迭 代(Iteration)功能。目前的精靈架構,不具重複使用功能。然而有許多應用,需要具有此 種重複功能。舉例而言,用餐顧客顯然需要同時點好幾道餐飲,因此點菜導引精靈必須 提供可不斷重複的點菜導引子精靈,以供循序輸入多道餐飲。此部分的擴充目前正在進 行之中。

另外我們還計畫將導引精靈開發的輸入由 EWDL 提升至一般資料模型敘述。換言 之,精靈開發者,不再需要依其資料需求,利用 EWDL 自訂對應導引精靈規格;相對 的,我們希望直接以其需求的資料模型為輸入,系統即能自動產生對應的 EWDL 導引 精靈描述,緊接著再循 MoDWiz3 工具鏈操作,即能產生對應導引精靈。最後的未來發 展項目則是將 MoDWiz3 應用到真實的導引精靈的開發,以彰顯利用 MoDWiz3 以 MDA 架構開發精靈程式的便利與快捷。

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

86

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

87

參考文獻

【1】 D. Schmidt, "Model-Driven Engineering," IEEE Computer, vol. 39, pp. 25-32, 2006.

【2】 David Gallardo, Ed Burnette, and Robert McGovern, Eclipse IN ACTION, Manning Publications, 2003.

【3】 E. Afgan and P. Bangalore, "Application Specification Language (ASL) – A Language for Describing Applications in Grid Computing," 4th International Conference on Grid Services Engineering and Management (GSEM), Leipzig, Germany, 2007.

【4】 Eclipse Modeling Framework, 2011. http://www.eclipse.org/modeling/emf/

【5】 Eclipse Modeling Project, 2011. http://www.eclipse.org/modeling/

【6】 Eclipse.org, 2011. http://www.eclipse.org/.

【7】 Enis Afgan, Jeff Gray, and Purushotham Bangalore, "Using Domain-Specific Modeling to Generate User Interfaces for Wizards", Proceedings of the MoDELS'07 Workshop on Model Driven Development of Advanced User Interfaces Nashville, Tennessee, USA, 2007.

【8】 Unified Modeling Language, 1997-2011. http://www.uml.org

【9】 Meta Object Facility Specification, 1997-2011. http://www.omg.org/mof/

【10】Frank Budinsky, David Steinberg, Ed Merks, Raymond Ellersick, and Timothy J.

Grose, Eclipse Modeling Framework, Addison-Wesley, 2003.

【11】Jeff Frisen, Open source Java projects: The Wizard API, 2008.

http://www.javaworld.com/javaworld/jw-04-2008/jw-04-opensourcejava-wizard-api.html

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

88

【12】K. Balasubramanian, A. Gokhale, G. Karsai, J. Sztipanovits, and S. Neema,

"Developing Applications using Model-Driven Design Environments," IEEE Computer, vol. 39, pp. 33-40, 2006.

【13】Kuo Chien-Hung, "Apply Model-Driven Architecture to the Development of Multi-Platform Wizards", 2012.

【14】Language Workbench Competition 2011 Xtext Submission, 2011.

http://code.google.com/a/eclipselabs.org/p/lwc11-xtext/

【15】Lars Vogel, Extending Eclipse - Plug-in Development Tutorial, 2012.

http://www.vogella.com/articles/EclipsePlugIn/article.html

【16】Meta Object Facility Specification, 1997-2011. http://www.omg.org/mof/

【17】Microsoft Component Object Model, 1998. http://www.cs.umd.edu/~pugh/com/

【18】MigLayout, 2011. http://www.miglayout.com/

【19】Model-Driven Architecture, 1997-2011. http://www.omg.org/mda/

【20】Object Constraint Language, 1997-2011. http://www.omg.org/spec/OCL/2.2/PDF/

【21】Object Management Group, Inc. 1997-2011. http://www.omg.org/

【22】Tim Boudreau, Java Wizard API, 2006.

http://weblogs.java.net/blog/timboudreau/archive/2006/09/wizard_project.html

【23】Unified Modeling Language, 1997-2011. http://www.uml.org/

【24】XML Metadata Interchange, 1997-2011. http://www.omg.org/spec/XMI/

【25】Xtend, 2011. http://www.eclipse.org/Xtext/xtend/

【26】Xtext2.0, 2011. http://www.eclipse.org/Xtext/

【27】Expert system, 2015. http://www.hrmars.com/admin/pics/261.pdf

【28】eXtensible Markup Language, 2015. http://zh.wikipedia.org/wiki/XML

【29】HyperText Markup Language, 2015. http://zh.wikipedia.org/wiki/HTML

【30】Web application, 2015. http://zh.wikipedia.org/wiki/Web_application

【31】Divide and Conquer, 2015. http://startup20.org

【32】Android’s picture forder, 2015. http://ithelp.ithome.com.tw/question/10135161

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

89

【33】Android introduced fragments in Android 3.0 (API level 11), 2015.

http://developer.android.com/guide/components/fragments.html

【34】Activities in the system are managed as an activity stack, 2015.

http://developer.android.com/reference/android/app/Activity.html

【35】Android Support Library, revision 4, 2015. http://developer.android.com/tools/support-library/index.html#overview

【36】Java Native Interface (JNI), 2015. http://en.wikipedia.org/wiki/Java_Native_Interface

【37】Android Low-Level System Architecture, 2015. https://source.android.com/devices/

【38】Bionic is C library developed by google, 2015.

http://en.wikipedia.org/wiki/Bionic_(software)

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

90

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

91

附錄 A Android 導引精靈範本

附錄 A-1 Android 導引精靈語法結構

grammar edu.nccu.cs.wta.psmandroidwizard.PsmAndroidWizard with org.eclipse.xtext.common.Terminals

generate psmAndroidWizard "http://www.nccu.edu/cs/wta/psmandroidwizard/PsmAndroidWizard"

import "http://www.eclipse.org/emf/2002/Ecore" as ecore

PsmAndroidWizard:

awiz=AWizard

;

AWizard:

"AWizard" title=STRING name=ID ("<" description=STRING ">")?

(pagedeclare+=APageName)*

(pagelist+=APageList)*

(pages+=APage)*

"end"

;

APageName:

"PageName" name=ID

;

APageList:

"PageList" rootlist=APageSeq (":" child+=[APageName] ("," child+=[APageName])+ )?

;

APageSeq:

names += [APageName] ("->" names += [APageName])*

; APage:

"APage" title=STRING name=ID "{"

("<" description=STRING ">")?

(sets+=AComponentSet)*

(branches=ABranches)?

"}"

;

ABranches:

"Branch" "{"

cases += ABranch (cases += ABranch)+

"}"

;

ABranch:

"if" (conditions+=ACondition)+ "=>" (next=[APageName])?

;

ACondition:

exp = STRING (":" lang = "ANDROID")?

;

AComponentSet:

"AComponentSet" name=ID type=STRING (components+=AComponent)*

"TextView" text=STRING

;

AEditText:

"EditText" name=ID ("format" reg=STRING)? (validate=AValidation)?

;

ACheckBox:

"CheckBox" title=STRING "," value=STRING (items+=Item)*

;

ARadioButton:

"RadioButton" title=STRING "," value=STRING (items+=Item)*

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

93

;

ASpinner:

"Spinner" title=STRING "," value=STRING (items+=Item)*

;

AFileBrowser:

"File" name=ID title=STRING

;

Item:

title=STRING "," value=STRING

;

Border:

"Border" title=STRING "{"

(subsets+=AComponentSet)*

"}"

;

AValidation :

"{" check_value=ID check_method=STRING "}"

;

package edu.nccu.cs.wta.psmandroidwizard.generator

import edu.nccu.cs.wta.psmandroidwizard.psmAndroidWizard.*

import java.util.*

class AWizardLayoutCompile {

def awizardLayoutCompile(AWizard aw, APage awp) { '''

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

style="@style/WizardPageContainer">

<TextView style="@style/WizardPageTitle" />

«IF awp.description != null»

<TextView

«var int componentvalue=0»

«FOR componentset:awp.sets»

«layoutCompile(componentset,componentvalue)»

<!--- «componentvalue = componentvalue+1» -->

«ENDFOR»

</LinearLayout>

</ScrollView>

<LinearLayout style="@style/WizardLayoutStyle">

<TextView

style="@style/WizardFormLabel"

android:id="@+id/«awp.name»helpmessage"

android:textColor="#0000ff"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

def layoutCompile(AComponentSet componentset,int componentvalue) {

'''

«IF componentset.type == "TextField"»

<!--- Textfield Components -->

<LinearLayout style="@style/WizardLayoutStyle">

<TextView

style="@style/WizardFormLabel"

android:text="«(componentset.components.get(0) as ATextView).text»"/>

«IF componentset.components.get(1) instanceof AEditText»

<EditText

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:singleLine="true"

android:id="@+id/«"your_"+(componentset.components.get(1) as AEditText).name»"/>

«ENDIF»

</LinearLayout>

«ELSEIF componentset.type == "TextArea"»

<!--- TextArea Components -->

<LinearLayout style="@style/WizardLayoutStyle">

<TextView

style="@style/WizardFormLabel"

android:text="«(componentset.components.get(0) as ATextView).text»"/>

«IF componentset.components.get(1) instanceof AEditText»

<EditText

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:singleLine="false"

android:id="@+id/«"your_"+(componentset.components.get(1) as AEditText).name»"/>

«ENDIF»

</LinearLayout>

«ELSEIF componentset.type == "RadioButton"»

<!--- Radiobutton Components -->

<LinearLayout style="@style/WizardLayoutStyle">

<TextView

style="@style/WizardFormLabel"

android:text="«(componentset.components.get(0) as ATextView).text»"/>

<RadioGroup

android:id="@+id/«componentset.name»"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

«FOR multicomponent:componentset.components»

«IF (multicomponent instanceof ARadioButton) && (multicomponent as ARadioButton).title != null»

<RadioButton

android:id="@+id/«(multicomponent as ARadioButton).value»«componentvalue»"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="«(multicomponent as ARadioButton).title»"/>

«ENDIF»

«ENDFOR»

</RadioGroup>

</LinearLayout>

«ELSEIF componentset.type == "CheckBox"»

<!--- Checkbox Components -->

<LinearLayout style="@style/WizardLayoutStyle">

<TextView

style="@style/WizardFormLabel"

android:text="«(componentset.components.get(0) as ATextView).text»"

android:id="@+id/«componentset.name»"/> ACheckBox).title != null»

<CheckBox

«ELSEIF componentset.type == "FileBrowser"»

<!--- Filebrowser Components -->

<LinearLayout style="@style/WizardLayoutStyle">

<Button

android:id="@+id/btn«componentset.name»"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="«(componentset.components.get(0) as ATextView).text»"/>

<ImageView

android:id= "@+id/iv«componentset.name»"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

</LinearLayout>

«ELSEIF componentset.type == "DropDownMenu"»

<!--- DropDownMenu Components -->

<LinearLayout style="@style/WizardLayoutStyle">

<TextView

style="@style/WizardFormLabel"

android:text="«(componentset.components.get(0) as ATextView).text»"/>

<Spinner

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/«componentset.name»"/>

</LinearLayout>

«ELSEIF componentset.type == "GroupQuestion"»

<!--- Borders Components -->

<TextView

style="@style/WizardFormLabel"

android:text="«(componentset.components.get(0) as ATextView).text»" />

<LinearLayout

style="@style/WizardLayoutStyle"

android:background="@drawable/borders">

«FOR subset:(componentset.components.get(1) as Border).subsets»

«layoutCompile(subset,componentvalue)»

«ENDFOR»

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

98

附錄 A-3 Android 導引精靈使用者介面元件與程式實作

導引精靈超模型 圖形使用者介面

程式範本 TexiView

-text : string ATextView

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/«(aw.pages.get(0).sets.get(0).components.get(0) as ATextView).name»" />

if(componentset.type == "TextField"){

var stringbuffer = new StringBuffer() stringbuffer.append("//TextField\n")

stringbuffer.append((componentset.components.get(1) as AEditText).name+

"View = (TextView) rootView.findViewById(R.id.your_"+

(componentset.components.get(1) as AEditText).name+");\n")

stringbuffer.append((componentset.components.get(1) as AEditText).name+

"View.setText(mPage.getData().getString("+awp.name+"."+

(componentset.components.get(1) as AEditText).name+"_DATA_KEY));\n") return stringbuffer.toString()

}

EditText

-name : string -validate : string -reg : string

AEditText

-name : string -title : string -value : string

ARadioButton -text : string

ATextView -title : string

-value : string Item

-items 0..* 1

< RadioButton

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text ="«(multicomponent as ARadioButton).title»"/>

if(componentset.type == "RadioButton"){

var stringbuffer = new StringBuffer() stringbuffer.append("//RadioButton\n")

stringbuffer.append("m"+componentset.name+" =

(RadioGroup) rootView.findViewById(R.id."+componentset.name+");\n") stringbuffer.append("m"+componentset.name+

".setOnCheckedChangeListener(m"+componentset.name+"listener);\n") for(multicomponent:componentset.components){

if((multicomponent instanceof ARadioButton) && (multicomponent as ARadioButton).title != null)

stringbuffer.append("m"+(multicomponent as ARadioButton).value+

componentvalue+" = (RadioButton) rootView.findViewById(R.id."+

(multicomponent as ARadioButton).value+componentvalue+");\n") if( awp.branches != null){

var int k =0

for(cases : awp.branches.cases){

for(condition : cases.conditions){

if(condition.lang == "ANDROID" && cases.next != null && k==0){

stringbuffer.append("if( "+condition.exp+"){\n")

}else if(condition.lang == "ANDROID" && cases.next != null && k>0){

stringbuffer.append("else if( "+condition.exp+"){\n")

stringbuffer.append("mPage.getData().putString("+awp.name+"."+

componentset.name+"branch,\""+(k=k+1)+"\");}\n") }

} }

stringbuffer.append("else mPage.getData().putString("+

awp.name+"."+componentset.name+"branch,\""+(k=k+1)+"\");\n") }

}

return stringbuffer.toString() }

CheckBox

-name : string -title : string -value : string

AChekBox -text : string

ATextView -title : string

-value : string Item

-items 0..* 1

< CheckBox

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text ="«(multicomponent as ACheckBox).title»"/>

if(componentset.type == "CheckBox"){

var stringbuffer = new StringBuffer() stringbuffer.append("//CheckBox\n")

for(multicomponent:componentset.components){

if((multicomponent instanceof ACheckBox) && (multicomponent as ACheckBox).title != null){

stringbuffer.append("m"+(multicomponent as ACheckBox).value+

componentvalue+" = (CheckBox) rootView.findViewById(R.id."+

(multicomponent as ACheckBox).value+componentvalue+");\n") stringbuffer.append("m"+(multicomponent as ACheckBox).value+

}if( awp.branches != null){

var int k =0

for(cases : awp.branches.cases){

for(condition : cases.conditions){

if(condition.lang == "ANDROID" && cases.next != null && k==0){

stringbuffer.append("if( "+condition.exp+"){\n")

stringbuffer.append("mPage.getData().putString("+awp.name+"."+

componentset.name+"branch,\""+(k=k+1)+"\");}\n")

}else if(condition.lang == "ANDROID" && cases.next != null && k>0){

stringbuffer.append("else if( "+condition.exp+"){\n")

stringbuffer.append("mPage.getData().putString("+awp.name+"."+

componentset.name+"branch,\""+(k=k+1)+"\");}\n") }

} }

stringbuffer.append("else mPage.getData().putString("+awp.name+"."+

componentset.name+"branch,\""+(k=k+1)+"\");\n") }

}

return stringbuffer.toString() }

Border

<TextView

android:text="«(componentset.components.get(0) as ATextView).text»"/>

<LinearLayout

«IF componentset.type == "GroupQuestion"»

«FOR subset:(componentset.components.get(1) as Border).subsets»

-name : string -title : string -value : string

ASpinner -text : string

ATextView -title : string

-value : string Item

-items 0..* 1

<TextView

android:text="«(componentset.components.get(0) as ATextView).text»"/>

<Spinner

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/«componentset.name»"/>

if(componentset.type == "DropDownMenu"){

var stringbuffer = new StringBuffer() stringbuffer.append("//Spinner\n")

stringbuffer.append("final Spinner "+componentset.name +"=

(Spinner) rootView.findViewById(R.id."+componentset.name+");\n") stringbuffer.append("ArrayAdapter<CharSequence>"+componentset.name+

"_adapter = ArrayAdapter.createFromResource(this.getActivity(),

R.array."+componentset.name+"_array, android.R.layout.simple_spinner_item);\n") stringbuffer.append(componentset.name+"_adapter.setDropDownViewResource(

android.R.layout.simple_spinner_dropdown_item);\n") stringbuffer.append(componentset.name+".setAdapter("+

componentset.name+"_adapter);\n")

stringbuffer.append("if(mPage.getData().getString("+awp.name+".show"+

componentset.name+"_DATA_KEY+\"_index\")!= null){\n")

stringbuffer.append(componentset.name+".setSelection(Integer.parseInt(

mPage.getData().getString("+awp.name+".show"+componentset.name+

"_DATA_KEY+\"_index\")));}\n")

stringbuffer.append(componentset.name+".setOnItemSelectedListener( \n") stringbuffer.append("new OnItemSelectedListener(){\n")

stringbuffer.append("@Override\n")

stringbuffer.append("public void onItemSelected(AdapterView<?> parent, View view,int position, long id) {\n")

name+"_DATA_KEY, "+componentset.name+".getSelectedItem().toString());\n") stringbuffer.append("mPage.getData().putString("+awp.name+".show"+componentset.

name+"_DATA_KEY+\"_index\",

String.valueOf("+componentset.name+".getSelectedItemPosition()));\n") if(awp.branches != null){

var int k =0

for(cases : awp.branches.cases){

for(condition : cases.conditions){

if(condition.lang == "ANDROID" && cases.next != null && k==0){

stringbuffer.append("if( "+condition.exp+"){\n")

stringbuffer.append("mPage.getData().putString("+awp.name+"."+

componentset.name+"branch,\""+(k=k+1)+"\");}\n")

}else if(condition.lang == "ANDROID" && cases.next != null && k>0){

stringbuffer.append("else if( "+condition.exp+"){\n")

stringbuffer.append("mPage.getData().putString("+awp.name+"."+

componentset.name+"branch,\""+(k=k+1)+"\");}\n") }

} }

stringbuffer.append("else mPage.getData().putString("+awp.name+"."+

componentset.name+"branch,\""+(k=k+1)+"\");\n") }

stringbuffer.append("mPage.notifyDataChanged();\n}\n") stringbuffer.append("@Override\n")

stringbuffer.append("public void onNothingSelected(AdapterView<?> parent) {}\n});\n")

return stringbuffer.toString() }

FileBrowser

-name : string -title : string

AFileBrowser

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

104

<Button android:id="@+id/btn«componentset.name»"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="«(componentset.components.get(0) as ATextView).text»"/>

<ImageView

android:id="@+id/iv«componentset.name»"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

if(componentset.type == "FileBrowser"){

var stringbuffer = new StringBuffer() stringbuffer.append("//FileBrowser\n")

stringbuffer.append("mIv"+componentset.name+" =

(ImageView) rootView.findViewById(R.id.iv"+componentset.name+");\n") stringbuffer.append("mBtn"+componentset.name+" =

(Button) rootView.findViewById(R.id.btn"+componentset.name+");\n") stringbuffer.append("mBtn"+componentset.name+".setOnClickListener(

btn"+componentset.name+"OnClickLis);\n") return stringbuffer.toString()

}

Wizard Register "Register"

<"It's free and always will be.">

Page Page1;

Page Page2;

Page Page3Male;

Page Page3Female;

Page Page4Male;

Page Page4Female;

Page Page5Single;

Page Page5Married;

PageList Page1 -> Page2 : Page3Female, Page3Male;

PageList Page3Male -> Page4Male;

PageList Page3Female -> Page4Female : Page5Single, Page5Married;

PageList Page5Single;

PageList Page5Married;

Page Page1 "Basic Information" {

<"It's free and always will be.">

Question first "First Name:" use textfield format "[A-Z][a-z]+"

Question last "Last Name:" use textfield format "[A-Z][a-z]+"

Question email "Your Email:" use textfield format "^[_a-z0-9-]+([._a-z0-9-]+)*@[a-z0-9-]+([.a-z0-9-]+)*$"

Question re_email "Re-enter Email:" use textfield format "^[_a-z0-9-]+([._a-z0-9-]+)*@[a-z0-9-]+([.a-z0-9-]+)*$"

Validate {

re_email "re_email == email"

Error "re_email != email"

}

Question password "New Password:(input 6~8 characters or numbers)"

use textfield format "[a-zA-Z0-9]{6,8}"

}

Page Page2 "Sex Information" {

<"It's free and always will be.">

Question sex "I am:" use dropdown { i. "Female" "female"

i. "Male" "male"

}

Branch {

if "Page.mData.getString(\"showsex\").equals(\"Female\")"

:ANDROID => Page3Female

if "Page.mData.getString(\"showsex\").equals(\"Male\")"

:ANDROID => Page3Male

Page Page3Male "Male Information" {

<"this information will help you find your friends on Facebook">

Group birthday "Birthday" {

Question month "Month:" use dropdown { i. "Jan" "january"

i. "Feb" "february"

i. "Mar" "march"

i. "Apr" "april"

i. "May" "may"

i. "Jun" "june"

i. "Jul" "july"

i. "Aug" "august"

i. "Sep" "september"

i. "Oct" "october"

i. "Nov" "november"

i. "Dec" "december"

}

Question day "Days:" use dropdown { i. "1" "1"

i. "10" "10"

i. "11" "11"

i. "12" "12"

i. "13" "13"

i. "14" "14"

i. "15" "15"

i. "16" "16"

i. "17" "17"

i. "18" "18"

i. "19" "19"

i. "20" "20"

i. "21" "21"

i. "22" "22"

i. "23" "23"

i. "24" "24"

i. "25" "25"

i. "26" "26"

i. "27" "27"

i. "28" "28"

i. "29" "29"

i. "30" "30"

i. "31" "31"

}

Question year "Year:" use dropdown { i. "2012" "2012"

i. "2011" "2011"

i. "2010" "2010"

i. "2009" "2009"

i. "2008" "2008"

i. "2007" "2007"

i. "2006" "2006"

i. "2005" "2005"

i. "2004" "2004"

i. "2003" "2003"

i. "2002" "2002"

i. "2001" "2001"

i. "2000" "2000"

i. "1999" "1999"

i. "1998" "1998"

i. "1997" "1997"

i. "1996" "1996"

i. "1995" "1995"

i. "1994" "1994"

i. "1993" "1993"

i. "1992" "1992"

i. "1991" "1991"

i. "1990" "1990"

i. "1989" "1989"

i. "1988" "1988"

i. "1987" "1987"

i. "1986" "1986"

i. "1985" "1985"

i. "1984" "1984"

i. "1983" "1983"

i. "1982" "1982"

i. "1981" "1981"

i. "1980" "1980"

i. "1979" "1979"

i. "1978" "1978"

i. "1977" "1977"

i. "1976" "1976"

i. "1975" "1975"

i. "1974" "1974"

i. "1973" "1973"

i. "1972" "1972"

i. "1971" "1971"

i. "1970" "1970"

} }

Question high_school "High School:" use textfield

Question university "College/University:" use textfield

Question employer "Employer:" use textfield }

Page Page3Female "Profile Information" {

<"this information will help you find your friends on Facebook">

Question language "Mother language:" use radio {

i. "Mandarin" "mandarin"

i. "Endlish" "english"

}

Question travel "I love:" use check {

i. "Taiwan" "taiwan"

i. "China" "china"

i. "Japan" "japan"

i. "Eurpoe" "europe"

i. "America" "america"

} }

Page Page4Female "Female Information" {

<"this information will help you find your friends on Facebook">

Question marriage "Marriage State" use dropdown{

i. "Single" "single"

i. "Married" "married"

}

Branch {

if "Page.mData.getString(\"showmarriage\").equals(\"Single\")"

:ANDROID => Page5Single

if "Page.mData.getString(\"showmarriage\").equals(\"Married\")"

:ANDROID => Page5Married }

}

Page Page4Male "Male Picture" {

<"Set your profile picture">

Question male_picture "Upload your Photo:" use filebrowser }

Page Page5Single "Female Single Picture" {

<"Set your profile picture">

Question Singl_picture "Upload your Photo:" use filebrowser }

Page Page5Married "Female Married Picture" {

<"Set your profile picture">

Question Married_picture "Upload your Photo:" use filebrowser }

end