diff --git a/bindings/android-sdk/android_bindings_generator.lpi b/bindings/android-sdk/android_bindings_generator.lpi index 17e9b4795..23a940fc2 100644 --- a/bindings/android-sdk/android_bindings_generator.lpi +++ b/bindings/android-sdk/android_bindings_generator.lpi @@ -39,7 +39,7 @@ - + @@ -48,7 +48,7 @@ - + @@ -61,49 +61,41 @@ - + - - - + - - - + - - - - - + + + - - - + @@ -111,15 +103,15 @@ - + - + - - - + + + @@ -127,23 +119,20 @@ - - - - + + + - - - - + + @@ -151,147 +140,174 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - - + + - + - + - + - + diff --git a/bindings/android-sdk/android_sdk_bindings_gen.pas b/bindings/android-sdk/android_sdk_bindings_gen.pas index 2eedbf9d8..c77388126 100644 --- a/bindings/android-sdk/android_sdk_bindings_gen.pas +++ b/bindings/android-sdk/android_sdk_bindings_gen.pas @@ -13,7 +13,9 @@ type TAndroidSDKBindingsGen = class private - FSourceFile, FPasOutputClasses, FPasOutputConsts, FPasOutputIDs, FPasOutputImpl: TStringList; + FSourceFile: TStringList; + FPasOutputTypes, FPasOutputClassesForward, FPasOutputClasses, + FPasOutputConsts, FPasOutputIDs, FPasOutputImpl, FPasOutputMessages: TStringList; FJavaOutputIDs, FJavaOutputMethods: TStringList; FClassName, FClassNamePas: string; // Class name of the class currently being parsed FClassNum, FMethodNum: Integer; @@ -23,6 +25,7 @@ type procedure ProcessModelMethod(ASourceLine: string); procedure ProcessModelConstructor(ASourceLine: string); procedure ProcessModelConst(ASourceLine: string); + procedure ProcessModelCallbackSetterCaller(ASourceLine: string); function GetNextWord(ALine: string; var AStartPos: Integer): string; function GetPascalTypeName(ABaseName: string): string; function PassByReference(ABaseName: string): Boolean; @@ -68,19 +71,52 @@ begin lPasOutputFile.Add(''); lPasOutputFile.Add('interface'); lPasOutputFile.Add(''); + lPasOutputFile.Add('uses javalang, androidpipescomm;'); + lPasOutputFile.Add(''); lPasOutputFile.Add('type'); + lPasOutputFile.Add(''); + lPasOutputFile.Add(' { Forward declaration of classes }'); + lPasOutputFile.Add(''); + lPasOutputFile.AddStrings(FPasOutputClassesForward); + lPasOutputFile.Add(''); + lPasOutputFile.Add(' { Types }'); + lPasOutputFile.Add(''); + lPasOutputFile.AddStrings(FPasOutputTypes); + lPasOutputFile.Add(''); + lPasOutputFile.Add(' { Classes }'); + lPasOutputFile.Add(''); lPasOutputFile.AddStrings(FPasOutputClasses); lPasOutputFile.Add(' end;'); lPasOutputFile.Add(''); + lPasOutputFile.Add('function HandleMessage(AFirstInt: Integer): Boolean;'); + lPasOutputFile.Add(''); lPasOutputFile.Add('implementation'); lPasOutputFile.Add(''); lPasOutputFile.Add('const'); + lPasOutputFile.Add(' { Constants }'); + lPasOutputFile.Add(''); lPasOutputFile.AddStrings(FPasOutputConsts); lPasOutputFile.Add(''); + lPasOutputFile.Add(' { IDs }'); + lPasOutputFile.Add(''); lPasOutputFile.AddStrings(FPasOutputIDs); lPasOutputFile.Add(''); + lPasOutputFile.Add('{ Implementation of Classes }'); + lPasOutputFile.Add(''); lPasOutputFile.AddStrings(FPasOutputImpl); lPasOutputFile.Add(''); + lPasOutputFile.Add('{ Message Handling }'); + lPasOutputFile.Add(''); + lPasOutputFile.Add('function HandleMessage(AFirstInt: Integer): Boolean;'); + lPasOutputFile.Add('var'); + lPasOutputFile.Add(' lInt: Integer;'); + lPasOutputFile.Add(' lPascalPointer: PtrInt = -1;'); + lPasOutputFile.Add('begin'); + lPasOutputFile.Add(' case AFirstInt of'); + lPasOutputFile.AddStrings(FPasOutputMessages); + lPasOutputFile.Add(' end;'); + lPasOutputFile.Add('end;'); + lPasOutputFile.Add(''); lPasOutputFile.Add('end.'); lPasOutputFile.SaveToFile(APasOutputFile); @@ -137,6 +173,13 @@ begin ProcessModelConst(ASourceLine); Exit; end; + + // Callbacks + if lCurWord = 'callbacksettercaller' then + begin + ProcessModelCallbackSetterCaller(ASourceLine); + Exit; + end; end; procedure TAndroidSDKBindingsGen.ProcessModelClass(ASourceLine: string); @@ -167,6 +210,7 @@ begin FPasOutputIDs.Add(' // ' + FClassNamePas); FJavaOutputIDs.Add(' // ' + FClassName); FPasOutputConsts.Add(' { ' + FClassNamePas + ' }'); + FPasOutputClassesForward.Add(' ' + FClassNamePas + ' = class;') end; procedure TAndroidSDKBindingsGen.ProcessModelMethod( @@ -175,7 +219,7 @@ var lReaderPos: Integer = 1; lParamNum: Integer = 1; lCurWord, lParentClassName: string; - lMethodReturn, lMethodReturnPas, lMethodName, lParamType, lParamTypePas, lParamName: string; + lMethodReturn, lMethodReturnPas, lMethodName, lParamType, lParamTypePas, lParamName, lParamPrefix: string; DeclarationBase, TmpStr, lIDString: string; FPasOutputImplCurLine: Integer; lJavaParamVar, lJavaParams, lJavaParamSelf: string; @@ -223,14 +267,13 @@ begin if (lParamType = 'virtual') or (lParamType = 'override') then Continue; lParamTypePas := GetPascalTypeName(lParamType); - if PassByReference(lParamType) then - lParamName := 'var ' + GetNextWord(ASourceLine, lReaderPos) - else - lParamName := GetNextWord(ASourceLine, lReaderPos); + lParamName := GetNextWord(ASourceLine, lReaderPos); + if PassByReference(lParamType) then lParamPrefix := 'var ' + else lParamPrefix := ''; if lParamName = '' then Break; - TmpStr := TmpStr + lParamName + ': ' + lParamTypePas + '; '; + TmpStr := TmpStr + lParamPrefix + lParamName + ': ' + lParamTypePas + '; '; // Pascal parameter sending FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Integer(' + lParamName + '));'); @@ -257,7 +300,7 @@ begin else begin TmpStr := TmpStr + '): ' + lMethodReturnPas + ';'; - FPasOutputImpl.Add(' Result := Boolean(vAndroidPipesComm.WaitForIntReturn());'); + FPasOutputImpl.Add(' Result := ' + lMethodReturnPas + '(vAndroidPipesComm.WaitForIntReturn());'); end; FPasOutputClasses.Add(' ' + DeclarationBase + TmpStr); @@ -336,12 +379,78 @@ begin FPasOutputConsts.Add(Format(' %s = %s;', [lConstName, lConstValue])); end; +// callbacksettercaller setOnClickListener callOnClickListener OnClickCallback = procedure (v: TView) of object; +procedure TAndroidSDKBindingsGen.ProcessModelCallbackSetterCaller(ASourceLine: string); +var + lReaderPos: Integer = 1; + lCurWord: string; + lSetterName, lCallerName, lCallbackName, lCallbackDeclaration: string; + lIDSetter, lIDStart, lIDFinished: String; +begin + if ASourceLine = '' then Exit; + + lSetterName := GetNextWord(ASourceLine, lReaderPos); + lSetterName := GetNextWord(ASourceLine, lReaderPos); + lCallerName := GetNextWord(ASourceLine, lReaderPos); + lCallbackDeclaration := Copy(ASourceLine, lReaderPos, Length(ASourceLine)); + lCallbackDeclaration := Trim(lCallbackDeclaration); + lCallbackName := GetNextWord(ASourceLine, lReaderPos); + + lIDSetter := GetIDString(lSetterName); + AddOutputIDs(lIDSetter); + lIDStart := GetIDString(lCallbackName + '_Start'); + AddOutputIDs(lIDStart); + lIDFinished := GetIDString(lCallbackName + '_Finished'); + AddOutputIDs(lIDFinished); + + FPasOutputTypes.Add(' T' + lCallbackDeclaration); + + FPasOutputClasses.Add(' public'); + FPasOutputClasses.Add(' ' + lCallbackName + ': T' + lCallbackName + ';'); + FPasOutputClasses.Add(' procedure ' + lSetterName + '(ACallback: T' + lCallbackName + ');'); + FPasOutputClasses.Add(' procedure ' + lCallerName + '();'); + FPasOutputClasses.Add(' public'); + + FPasOutputImpl.Add('procedure ' + FClassNamePas + '.' + lSetterName + '(ACallback: T' + lCallbackName + ');'); + FPasOutputImpl.Add('begin'); + FPasOutputImpl.Add(' OnClickListener := ACallback;'); + FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));'); + FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDSetter + ');'); + FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Index'); + FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(PtrInt(Self)); // Self, Pascal pointer'); + FPasOutputImpl.Add(' vAndroidPipesComm.WaitForReturn();'); + FPasOutputImpl.Add('end;'); + FPasOutputImpl.Add(''); + FPasOutputImpl.Add('procedure ' + FClassNamePas + '.' + lCallerName + '();'); + FPasOutputImpl.Add('begin'); + FPasOutputImpl.Add(' if Assigned(OnClickListener) then OnClickListener(Self);'); + FPasOutputImpl.Add('end;'); + + // Method type and name + FPasOutputMessages.Add(' ' + lIDStart + ':'); + FPasOutputMessages.Add(' begin'); + FPasOutputMessages.Add(' lPascalPointer := vAndroidPipesComm.ReadInt();'); + FPasOutputMessages.Add(' TTextView(lPascalPointer).callOnClickListener();'); + FPasOutputMessages.Add(' vAndroidPipesComm.SendMessage(amkUICommand, ' + lIDFinished + ');'); + FPasOutputMessages.Add(' end;'); +{ amkUI_MenuItem_setOnMenuItemClickListener_Start: + begin + lInt := ReadInt(); + lMenuItem := TMenuItem(FindItemIdInList(MenuItems, lInt)); + if lMenuItem <> nil then + lInt := lMenuItem.callOnMenuItemClickListener(); + vAndroidPipesComm.SendMessage(amkUICommand, amkUI_MenuItem_setOnMenuItemClickListener_Finished); + vAndroidPipesComm.SendInt(lInt); + end; + end;} +end; + { Reads one word in a string, starting at AStartPos (1-based index) and going up to a space or comma or ( or ) or another separator } function TAndroidSDKBindingsGen.GetNextWord(ALine: string; var AStartPos: Integer): string; const - WordSeparators = [' ','(',')','[',']',',',';',#9{TAB}]; + WordSeparators = [' ','(',')','[',']',',',';',':',#9{TAB}]; var lState: Integer = 0; begin @@ -423,11 +532,15 @@ end; constructor TAndroidSDKBindingsGen.Create; begin FSourceFile := TStringList.Create; + + FPasOutputTypes := TStringList.Create; + FPasOutputClassesForward := TStringList.Create; FPasOutputClasses := TStringList.Create; FPasOutputImpl := TStringList.Create; FPasOutputIDs := TStringList.Create; - FPasOutputConsts := TStringList.Create; + FPasOutputMessages := TStringList.Create; + FJavaOutputIDs := TStringList.Create; FJavaOutputMethods := TStringList.Create; @@ -437,11 +550,15 @@ end; destructor TAndroidSDKBindingsGen.Destroy; begin FSourceFile.Free; + + FPasOutputTypes.Free; + FPasOutputClassesForward.Free; FPasOutputClasses.Free; FPasOutputImpl.Free; FPasOutputIDs.Free; - FPasOutputConsts.Free; + FPasOutputMessages.Free; + FJavaOutputIDs.Free; FJavaOutputMethods.Free; diff --git a/bindings/android-sdk/sdk_level_7/android_all.txt b/bindings/android-sdk/sdk_level_7/android_all.txt index 4daeaddfe..5cb4dfab2 100644 --- a/bindings/android-sdk/sdk_level_7/android_all.txt +++ b/bindings/android-sdk/sdk_level_7/android_all.txt @@ -45,26 +45,22 @@ const GONE = 8; procedure addView(View child, LayoutParams params); procedure addView(View child); -[LinearLayout] TViewGroup +[LinearLayout] ViewGroup constructor Create(); procedure setOrientation(int orientation); const HORIZONTAL = 0; const VERTICAL = 1; -[AbsoluteLayout] TViewGroup +[AbsoluteLayout] ViewGroup constructor Create(); [AbsoluteLayout_LayoutParams] LayoutParams constructor Create(int param_width, int param_height, int param_x, int param_y); -# TOnClickCallback = procedure (v: TView) of object; [TextView] View -# protected -# OnClickListener: TOnClickCallback; constructor Create(); virtual; method void setText(CharSequence AText); virtual; -# procedure setOnClickListener(ACallback: TOnClickCallback); -# procedure callOnClickListener(); +callbacksettercaller setOnClickListener callOnClickListener OnClickListener = procedure (v: TView) of object; method void setTextSize(int unit_; float size); [EditText] TextView @@ -81,9 +77,9 @@ method void setText(CharSequence AText); override; constructor Create(); method int getCurrentHour(); method void setCurrentHour(int currentHour); -method int getCurrentMinute: Integer; +method int getCurrentMinute; method void setCurrentMinute(int currentMinute); -method boolean is24HourView: Boolean; +method boolean is24HourView; method void setIs24HourView(boolean AIs24HourView); [ScrollView] FrameLayout