From 8608497d12eb85cceb5c4ba249083b6eb42ee790 Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Thu, 14 Jul 2011 09:44:35 +0000 Subject: [PATCH] android-sdk: Adds more classes and support for constants, for ; and for ignoring method modifiers git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1742 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../android_bindings_generator.lpi | 76 ++++++++-------- .../android-sdk/android_sdk_bindings_gen.pas | 80 ++++++++++++++--- bindings/android-sdk/mainform.lfm | 6 +- .../android-sdk/sdk_level_7/android_all.txt | 90 ++++++++++++++++++- 4 files changed, 198 insertions(+), 54 deletions(-) diff --git a/bindings/android-sdk/android_bindings_generator.lpi b/bindings/android-sdk/android_bindings_generator.lpi index 45f13eaa1..17e9b4795 100644 --- a/bindings/android-sdk/android_bindings_generator.lpi +++ b/bindings/android-sdk/android_bindings_generator.lpi @@ -48,7 +48,7 @@ - + @@ -60,8 +60,8 @@ - - + + @@ -130,9 +130,9 @@ - - - + + + @@ -175,123 +175,123 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - + - + - + diff --git a/bindings/android-sdk/android_sdk_bindings_gen.pas b/bindings/android-sdk/android_sdk_bindings_gen.pas index e61a6bb14..2eedbf9d8 100644 --- a/bindings/android-sdk/android_sdk_bindings_gen.pas +++ b/bindings/android-sdk/android_sdk_bindings_gen.pas @@ -13,7 +13,7 @@ type TAndroidSDKBindingsGen = class private - FSourceFile, FPasOutputClasses, FPasOutputIDs, FPasOutputImpl: TStringList; + FSourceFile, FPasOutputClasses, FPasOutputConsts, FPasOutputIDs, FPasOutputImpl: TStringList; FJavaOutputIDs, FJavaOutputMethods: TStringList; FClassName, FClassNamePas: string; // Class name of the class currently being parsed FClassNum, FMethodNum: Integer; @@ -22,10 +22,14 @@ type procedure ProcessModelClass(ASourceLine: string); procedure ProcessModelMethod(ASourceLine: string); procedure ProcessModelConstructor(ASourceLine: string); + procedure ProcessModelConst(ASourceLine: string); function GetNextWord(ALine: string; var AStartPos: Integer): string; function GetPascalTypeName(ABaseName: string): string; + function PassByReference(ABaseName: string): Boolean; function GetJavaResultFunction(AReturnType: string): string; function GetJavaTypeReader(AType: string): string; + function GetIDString(AMethodName: string): string; + procedure AddOutputIDs(AIDString: string); public constructor Create; destructor Destroy; override; @@ -60,7 +64,7 @@ begin end; // Now save the Pascal file - lPasOutputFile.Add('unit ;'); + lPasOutputFile.Add(Format('unit %s;', [ChangeFileExt(ExtractFileName(ASourceFile), '')])); lPasOutputFile.Add(''); lPasOutputFile.Add('interface'); lPasOutputFile.Add(''); @@ -71,6 +75,8 @@ begin lPasOutputFile.Add('implementation'); lPasOutputFile.Add(''); lPasOutputFile.Add('const'); + lPasOutputFile.AddStrings(FPasOutputConsts); + lPasOutputFile.Add(''); lPasOutputFile.AddStrings(FPasOutputIDs); lPasOutputFile.Add(''); lPasOutputFile.AddStrings(FPasOutputImpl); @@ -124,6 +130,13 @@ begin ProcessModelConstructor(ASourceLine); Exit; end; + + // Constants + if lCurWord = 'const' then + begin + ProcessModelConst(ASourceLine); + Exit; + end; end; procedure TAndroidSDKBindingsGen.ProcessModelClass(ASourceLine: string); @@ -153,6 +166,7 @@ begin FPasOutputIDs.Add(' // ' + FClassNamePas); FJavaOutputIDs.Add(' // ' + FClassName); + FPasOutputConsts.Add(' { ' + FClassNamePas + ' }'); end; procedure TAndroidSDKBindingsGen.ProcessModelMethod( @@ -180,7 +194,7 @@ begin // Beginning of the implementation part FPasOutputImplCurLine := FPasOutputImpl.Count; - lIDString := 'amkUI_' + FClassNamePas + '_' + lMethodName; + lIDString := GetIDString(lMethodName); FPasOutputImpl.Add('begin'); FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));'); @@ -197,16 +211,22 @@ begin FJavaOutputMethods.Add(' // params'); // Lists of constants for the IDs - FPasOutputIDs.Add(' ' + lIDString + ' = $' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';'); - FJavaOutputIDs.Add(' static final int ' + lIDString + ' = 0x' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';'); + AddOutputIDs(lIDString); // Add all parameters TmpStr := lMethodName + '('; repeat lParamType := GetNextWord(ASourceLine, lReaderPos); + + // Method modifiers + if (lParamType = 'virtual') or (lParamType = 'override') then Continue; + lParamTypePas := GetPascalTypeName(lParamType); - lParamName := GetNextWord(ASourceLine, lReaderPos); + if PassByReference(lParamType) then + lParamName := 'var ' + GetNextWord(ASourceLine, lReaderPos) + else + lParamName := GetNextWord(ASourceLine, lReaderPos); if lParamName = '' then Break; @@ -277,7 +297,7 @@ begin // Method type and name lMethodName := GetNextWord(ASourceLine, lReaderPos); - lIDString := 'amkUI_' + FClassNamePas + '_' + lMethodName; + lIDString := GetIDString(lMethodName); FPasOutputClasses.Add(' constructor ' + lMethodName + '();'); @@ -288,8 +308,7 @@ begin FPasOutputImpl.Add(' Index := vAndroidPipesComm.WaitForIntReturn();'); FPasOutputImpl.Add('end;'); - FPasOutputIDs.Add(' ' + lIDString + ' = $' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';'); - FJavaOutputIDs.Add(' static final int ' + lIDString + ' = 0x' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';'); + AddOutputIDs(lIDString); FJavaOutputMethods.Add(' case ' + lIDString + ':'); FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");'); @@ -300,12 +319,29 @@ begin Inc(FMethodNum); end; +procedure TAndroidSDKBindingsGen.ProcessModelConst(ASourceLine: string); +var + lReaderPos: Integer = 1; + lCurWord: string; + lConstName, lConstValue: string; +begin + if ASourceLine = '' then Exit; + + lConstName := GetNextWord(ASourceLine, lReaderPos); + lConstName := GetNextWord(ASourceLine, lReaderPos); + lConstValue := GetNextWord(ASourceLine, lReaderPos); + lConstValue := GetNextWord(ASourceLine, lReaderPos); + + // Method type and name + FPasOutputConsts.Add(Format(' %s = %s;', [lConstName, lConstValue])); +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]; + WordSeparators = [' ','(',')','[',']',',',';',#9{TAB}]; var lState: Integer = 0; begin @@ -343,12 +379,23 @@ begin if ABaseName = 'int' then Result := 'Integer' else if ABaseName = 'boolean' then Result := 'Boolean' + else if ABaseName = 'float' then Result := 'Single' else if ABaseName = 'void' then Result := ABaseName else if ABaseName = 'CharSequence' then Result := 'string' else if ABaseName = 'TJavaObject' then Result := ABaseName else Result := 'T' + ABaseName; end; +function TAndroidSDKBindingsGen.PassByReference(ABaseName: string): Boolean; +begin + if ABaseName = '' then Exit(False); + + if ABaseName = 'int' then Result := False + else if ABaseName = 'boolean' then Result := False + else if ABaseName = 'float' then Result := False + else Result := True; +end; + function TAndroidSDKBindingsGen.GetJavaResultFunction(AReturnType: string ): string; begin @@ -362,6 +409,17 @@ begin else Exit('GetInt'); end; +function TAndroidSDKBindingsGen.GetIDString(AMethodName: string): string; +begin + Result := 'amkUI_' + FClassNamePas + '_' + AMethodName;; +end; + +procedure TAndroidSDKBindingsGen.AddOutputIDs(AIDString: string); +begin + FPasOutputIDs.Add(' ' + AIDString + ' = $' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';'); + FJavaOutputIDs.Add(' static final int ' + AIDString + ' = 0x' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';'); +end; + constructor TAndroidSDKBindingsGen.Create; begin FSourceFile := TStringList.Create; @@ -369,6 +427,7 @@ begin FPasOutputImpl := TStringList.Create; FPasOutputIDs := TStringList.Create; + FPasOutputConsts := TStringList.Create; FJavaOutputIDs := TStringList.Create; FJavaOutputMethods := TStringList.Create; @@ -382,6 +441,7 @@ begin FPasOutputImpl.Free; FPasOutputIDs.Free; + FPasOutputConsts.Free; FJavaOutputIDs.Free; FJavaOutputMethods.Free; diff --git a/bindings/android-sdk/mainform.lfm b/bindings/android-sdk/mainform.lfm index a24be5e8d..07dcc19c8 100644 --- a/bindings/android-sdk/mainform.lfm +++ b/bindings/android-sdk/mainform.lfm @@ -16,7 +16,7 @@ object Form1: TForm1 ParentColor = False end object editInputPath: TDirectoryEdit - Left = 64 + Left = 88 Height = 25 Top = 72 Width = 312 @@ -31,8 +31,8 @@ object Form1: TForm1 Left = 7 Height = 18 Top = 73 - Width = 43 - Caption = 'Label2' + Width = 69 + Caption = 'Input Path:' ParentColor = False end object Button1: TButton diff --git a/bindings/android-sdk/sdk_level_7/android_all.txt b/bindings/android-sdk/sdk_level_7/android_all.txt index 7363fd943..4daeaddfe 100644 --- a/bindings/android-sdk/sdk_level_7/android_all.txt +++ b/bindings/android-sdk/sdk_level_7/android_all.txt @@ -5,13 +5,97 @@ #[Menu] TJavaObject #method MenuItem add(int groupId, int itemId, int order, CharSequence title) -[CompoundButton] Button 110 +# +# android.util.* +# +[DisplayMetrics] TJavaObject +constructor Create() +method float density() +method int densityDpi() +method int heightPixels() +method float scaledDensity() +method int widthPixels() +method float xdpi() +method float ydpi() + +# +# android.app.* +# +[Display] TJavaObject +method void getMetrics(DisplayMetrics outMetrics) + +[WindowManager] TJavaObject +method Display getDefaultDisplay() + +# +# android.view +# +[LayoutParams] TJavaObject +constructor Create(int width, int height); +const FILL_PARENT = $FFFFFFFF; + +[View] TJavaObject +method void setLayoutParams(LayoutParams params); +method void setVisibility(int visibility); +const VISIBLE = 0; +const INVISIBLE = 4; +const GONE = 8; + +[ViewGroup] View +procedure addView(View child, LayoutParams params); +procedure addView(View child); + +[LinearLayout] TViewGroup +constructor Create(); +procedure setOrientation(int orientation); +const HORIZONTAL = 0; +const VERTICAL = 1; + +[AbsoluteLayout] TViewGroup +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(); +method void setTextSize(int unit_; float size); + +[EditText] TextView +constructor Create(); override; +method void setText(CharSequence AText); override; + +[Button] TextView +constructor Create(); override; +method void setText(CharSequence AText); override; + +[FrameLayout] ViewGroup + +[TimePicker] FrameLayout +constructor Create(); +method int getCurrentHour(); +method void setCurrentHour(int currentHour); +method int getCurrentMinute: Integer; +method void setCurrentMinute(int currentMinute); +method boolean is24HourView: Boolean; +method void setIs24HourView(boolean AIs24HourView); + +[ScrollView] FrameLayout +constructor Create(); + +[CompoundButton] Button method boolean isChecked() method boolean performClick() method void setChecked(boolean checked) #method void setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener) method void toggle() -[CheckBox] CompoundButton 111 -constructor Create +[CheckBox] CompoundButton +constructor Create()