android-sdk: Adds the possibility of having global objects

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1822 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2011-08-22 08:49:24 +00:00
parent a311002a2b
commit cdc7a41075
3 changed files with 118 additions and 61 deletions

View File

@ -119,8 +119,8 @@
<UnitName Value="android_sdk_bindings_gen"/> <UnitName Value="android_sdk_bindings_gen"/>
<EditorIndex Value="3"/> <EditorIndex Value="3"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="476"/> <TopLine Value="401"/>
<CursorPos X="1" Y="497"/> <CursorPos X="36" Y="432"/>
<UsageCount Value="42"/> <UsageCount Value="42"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit8> </Unit8>
@ -200,8 +200,8 @@
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="sdk_level_7/android_all.txt"/>
<EditorIndex Value="4"/> <EditorIndex Value="4"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="59"/> <TopLine Value="1"/>
<CursorPos X="1" Y="81"/> <CursorPos X="14" Y="7"/>
<UsageCount Value="14"/> <UsageCount Value="14"/>
<Loaded Value="True"/> <Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="None"/> <DefaultSyntaxHighlighter Value="None"/>
@ -246,8 +246,8 @@
<IsVisibleTab Value="True"/> <IsVisibleTab Value="True"/>
<EditorIndex Value="5"/> <EditorIndex Value="5"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="132"/> <TopLine Value="467"/>
<CursorPos X="23" Y="147"/> <CursorPos X="3" Y="467"/>
<UsageCount Value="14"/> <UsageCount Value="14"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit23> </Unit23>
@ -273,123 +273,123 @@
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="582" Column="99" TopLine="507"/> <Caret Line="539" Column="1" TopLine="507"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="524" Column="1" TopLine="507"/> <Caret Line="541" Column="1" TopLine="507"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="525" Column="1" TopLine="507"/> <Caret Line="542" Column="36" TopLine="526"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="528" Column="1" TopLine="507"/> <Caret Line="145" Column="23" TopLine="99"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="529" Column="1" TopLine="507"/> <Caret Line="1" Column="1" TopLine="1"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="532" Column="1" TopLine="507"/> <Caret Line="143" Column="21" TopLine="99"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="535" Column="1" TopLine="507"/> <Caret Line="145" Column="23" TopLine="99"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="539" Column="1" TopLine="507"/> <Caret Line="42" Column="20" TopLine="3"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="../../../lazarus/lcl/interfaces/android/android_all.pas"/>
<Caret Line="541" Column="1" TopLine="507"/> <Caret Line="666" Column="17" TopLine="653"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="542" Column="36" TopLine="526"/> <Caret Line="864" Column="22" TopLine="858"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="145" Column="23" TopLine="99"/> <Caret Line="150" Column="1" TopLine="103"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="1" Column="1" TopLine="1"/> <Caret Line="42" Column="1" TopLine="1"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="143" Column="21" TopLine="99"/> <Caret Line="151" Column="1" TopLine="108"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="145" Column="23" TopLine="99"/> <Caret Line="1" Column="1" TopLine="1"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="42" Column="20" TopLine="3"/> <Caret Line="37" Column="1" TopLine="14"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="../../../lazarus/lcl/interfaces/android/android_all.pas"/> <Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="666" Column="17" TopLine="653"/> <Caret Line="267" Column="1" TopLine="220"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="864" Column="22" TopLine="858"/> <Caret Line="797" Column="48" TopLine="781"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="150" Column="1" TopLine="103"/> <Caret Line="1" Column="1" TopLine="1"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="42" Column="1" TopLine="1"/> <Caret Line="33" Column="29" TopLine="1"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="151" Column="1" TopLine="108"/> <Caret Line="410" Column="23" TopLine="396"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="1" Column="1" TopLine="1"/> <Caret Line="552" Column="23" TopLine="512"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="mainform.pas"/>
<Caret Line="37" Column="1" TopLine="14"/> <Caret Line="15" Column="80" TopLine="6"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="sdk_level_7/android_all.txt"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="267" Column="1" TopLine="220"/> <Caret Line="486" Column="65" TopLine="468"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="797" Column="48" TopLine="781"/> <Caret Line="847" Column="64" TopLine="832"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="1" Column="1" TopLine="1"/> <Caret Line="38" Column="66" TopLine="38"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="33" Column="29" TopLine="1"/> <Caret Line="506" Column="11" TopLine="476"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="410" Column="23" TopLine="396"/> <Caret Line="38" Column="45" TopLine="1"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="552" Column="23" TopLine="512"/> <Caret Line="760" Column="1" TopLine="727"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="mainform.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="15" Column="80" TopLine="6"/> <Caret Line="26" Column="75" TopLine="1"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="android_sdk_bindings_gen.pas"/> <Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="486" Column="65" TopLine="468"/> <Caret Line="306" Column="94" TopLine="293"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
</ProjectOptions> </ProjectOptions>

View File

@ -15,10 +15,13 @@ type
private private
FSourceFile: TStringList; FSourceFile: TStringList;
FPasOutputTypes, FPasOutputClassesForward, FPasOutputClasses, FPasOutputTypes, FPasOutputClassesForward, FPasOutputClasses,
FPasOutputConsts, FPasOutputIDs, FPasOutputImpl, FPasOutputMessages: TStringList; FPasOutputConsts, FPasOutputIDs, FPasOutputImpl, FPasOutputMessages,
FPasGlobalVars, FPasInitialization: TStringList;
FJavaOutputIDs, FJavaOutputMethods: TStringList; FJavaOutputIDs, FJavaOutputMethods: TStringList;
FClassName, FClassNamePas: string; // Class name of the class currently being parsed FClassName, FClassNamePas: string; // Class name of the class currently being parsed
FClassNum, FMethodNum: Integer; FClassNum, FMethodNum: Integer;
FIsGlobalObject: Boolean;
FGlobalObject: string;
procedure GeneratePascalFile(ASourceFile: string; ADest: TStringList); procedure GeneratePascalFile(ASourceFile: string; ADest: TStringList);
procedure GenerateJavaFile(ASourceFile: string; ADest: TStringList); procedure GenerateJavaFile(ASourceFile: string; ADest: TStringList);
procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string); procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string);
@ -85,6 +88,9 @@ begin
ADest.Add(''); ADest.Add('');
ADest.Add('function HandleMessage(AFirstInt: Integer): Boolean;'); ADest.Add('function HandleMessage(AFirstInt: Integer): Boolean;');
ADest.Add(''); ADest.Add('');
ADest.Add('var');
ADest.AddStrings(FPasGlobalVars);
ADest.Add('');
ADest.Add('implementation'); ADest.Add('implementation');
ADest.Add(''); ADest.Add('');
ADest.Add('const'); ADest.Add('const');
@ -108,6 +114,10 @@ begin
ADest.Add(' end;'); ADest.Add(' end;');
ADest.Add('end;'); ADest.Add('end;');
ADest.Add(''); ADest.Add('');
ADest.Add('initialization');
ADest.Add('');
ADest.AddStrings(FPasInitialization);
ADest.Add('');
ADest.Add('end.'); ADest.Add('end.');
end; end;
@ -172,7 +182,7 @@ begin
ADest.Add(' AbsSpinner param_self_AbsSpinner;'); ADest.Add(' AbsSpinner param_self_AbsSpinner;');
ADest.Add(' ArrayAdapter<String> param_self_ArrayAdapter_String_;'); ADest.Add(' ArrayAdapter<String> param_self_ArrayAdapter_String_;');
ADest.Add(' // Params'); ADest.Add(' // Params');
ADest.Add(' ViewGroup.LayoutParams lViewGroup_LayoutParams_1, lViewGroup_LayoutParams_2;'); ADest.Add(' ViewGroup.LayoutParams lViewGroup_LayoutParams_1, lViewGroup_LayoutParams_2, lViewGroup_LayoutParams_3;');
ADest.Add(' SpinnerAdapter lSpinnerAdapter_1;'); ADest.Add(' SpinnerAdapter lSpinnerAdapter_1;');
ADest.Add(' DisplayMetrics lDisplayMetrics_1;'); ADest.Add(' DisplayMetrics lDisplayMetrics_1;');
ADest.Add(' CharSequence lCharSequence_1;'); ADest.Add(' CharSequence lCharSequence_1;');
@ -250,6 +260,15 @@ begin
// Starting a new class // Starting a new class
if ASourceLine[1] = '[' then if ASourceLine[1] = '[' then
begin begin
FIsGlobalObject := False;
ProcessModelClass(ASourceLine, False);
Exit;
end;
// Starting a new global object class
if ASourceLine[1] = '%' then
begin
FIsGlobalObject := True;
ProcessModelClass(ASourceLine, False); ProcessModelClass(ASourceLine, False);
Exit; Exit;
end; end;
@ -257,6 +276,7 @@ begin
// Starting a new interface // Starting a new interface
if ASourceLine[1] = '{' then if ASourceLine[1] = '{' then
begin begin
FIsGlobalObject := False;
ProcessModelClass(ASourceLine, True); ProcessModelClass(ASourceLine, True);
Exit; Exit;
end; end;
@ -313,6 +333,15 @@ begin
FClassNamePas := GetPascalTypeName(lCurWord); FClassNamePas := GetPascalTypeName(lCurWord);
FClassName := lCurWord; FClassName := lCurWord;
// Read the global object, if it is one
if FIsGlobalObject then
begin
FGlobalObject := GetNextWord(ASourceLine, lReaderPos);
FPasGlobalVars.Add(Format(' %s: %s;', [FGlobalObject, FClassNamePas]));
FPasInitialization.Add(Format(' %s := %s.Create;', [FGlobalObject, FClassNamePas]));
end;
lTmpParent := GetNextWord(ASourceLine, lReaderPos); lTmpParent := GetNextWord(ASourceLine, lReaderPos);
lParentClassName := GetPascalTypeName(lTmpParent); lParentClassName := GetPascalTypeName(lTmpParent);
@ -365,6 +394,8 @@ var
HasStringParam: Boolean = False; HasStringParam: Boolean = False;
StringParamCount: Integer = 0; StringParamCount: Integer = 0;
i: Integer; i: Integer;
//
lPascalMethodModifiers: string = '';
begin begin
if ASourceLine = '' then Exit; if ASourceLine = '' then Exit;
@ -385,15 +416,21 @@ begin
FPasOutputImpl.Add('begin'); FPasOutputImpl.Add('begin');
FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));'); FPasOutputImpl.Add(' vAndroidPipesComm.SendByte(ShortInt(amkUICommand));');
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');'); FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');');
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Pointer'); if not FIsGlobalObject then
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Pointer');
lJavaParamSelf := 'param_self_' + JavaRemoveGeneric(FClassName); lJavaParamSelf := 'param_self_' + JavaRemoveGeneric(FClassName);
FJavaOutputMethods.Add(' // ' + ASourceLine); FJavaOutputMethods.Add(' // ' + ASourceLine);
FJavaOutputMethods.Add(' case ' + lIDString + ':'); FJavaOutputMethods.Add(' case ' + lIDString + ':');
FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");'); FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");');
FJavaOutputMethods.Add(' // Self'); if not FIsGlobalObject then
FJavaOutputMethods.Add(' lInt = MyAndroidPipesComm.GetInt();'); begin
FJavaOutputMethods.Add(' ' + lJavaParamSelf + ' = (' + FClassName + ') ViewElements.get(lInt);'); FJavaOutputMethods.Add(' // Self');
FJavaOutputMethods.Add(' lInt = MyAndroidPipesComm.GetInt();');
FJavaOutputMethods.Add(' ' + lJavaParamSelf + ' = (' + FClassName + ') ViewElements.get(lInt);');
end
else
lJavaParamSelf := FGlobalObject;
FJavaOutputMethods.Add(' // params'); FJavaOutputMethods.Add(' // params');
// Lists of constants for the IDs // Lists of constants for the IDs
@ -407,6 +444,11 @@ begin
// Method modifiers // Method modifiers
if (lParamType = 'virtual') or (lParamType = 'override') then Continue; if (lParamType = 'virtual') or (lParamType = 'override') then Continue;
if (lParamType = 'overload') then
begin
lPascalMethodModifiers := ' overload;';
Continue;
end;
lParamTypePas := GetPascalTypeName(lParamType); lParamTypePas := GetPascalTypeName(lParamType);
lParamName := GetNextWord(ASourceLine, lReaderPos); lParamName := GetNextWord(ASourceLine, lReaderPos);
@ -465,7 +507,7 @@ begin
end; end;
// Insert the start // Insert the start
FPasOutputClasses.Add(' ' + DeclarationBase + TmpStr); FPasOutputClasses.Add(' ' + DeclarationBase + TmpStr + lPascalMethodModifiers);
FPasOutputImpl.Insert(FPasOutputImplCurLine, DeclarationBase + FClassNamePas + '.' + TmpStr); FPasOutputImpl.Insert(FPasOutputImplCurLine, DeclarationBase + FClassNamePas + '.' + TmpStr);
if HasStringParam then if HasStringParam then
begin begin
@ -751,7 +793,7 @@ end;
function TAndroidSDKBindingsGen.GetNextWord(ALine: string; function TAndroidSDKBindingsGen.GetNextWord(ALine: string;
var AStartPos: Integer): string; var AStartPos: Integer): string;
const const
WordSeparators = [' ','(',')','[',']','{','}',',',';',':',#9{TAB}]; WordSeparators = [' ','(',')','[',']','{','}','%',',',';',':',#9{TAB}];
var var
lState: Integer = 0; lState: Integer = 0;
begin begin
@ -844,9 +886,10 @@ begin
else Result := Format('(%s) ViewElements.get(lInt)', [AType]); else Result := Format('(%s) ViewElements.get(lInt)', [AType]);
end; end;
// We add the method num too for overloaded routines
function TAndroidSDKBindingsGen.GetIDString(AMethodName: string): string; function TAndroidSDKBindingsGen.GetIDString(AMethodName: string): string;
begin begin
Result := 'amkUI_' + FClassNamePas + '_' + AMethodName;; Result := Format('amkUI_%s_%s_%d', [FClassNamePas, AMethodName, FMethodNum]);
Result := ConvertJavaSpecialCharsToUnderline(Result); Result := ConvertJavaSpecialCharsToUnderline(Result);
end; end;
@ -890,6 +933,8 @@ begin
FPasOutputIDs := TStringList.Create; FPasOutputIDs := TStringList.Create;
FPasOutputConsts := TStringList.Create; FPasOutputConsts := TStringList.Create;
FPasOutputMessages := TStringList.Create; FPasOutputMessages := TStringList.Create;
FPasGlobalVars := TStringList.Create;
FPasInitialization := TStringList.Create;
FJavaOutputIDs := TStringList.Create; FJavaOutputIDs := TStringList.Create;
FJavaOutputMethods := TStringList.Create; FJavaOutputMethods := TStringList.Create;
@ -908,6 +953,8 @@ begin
FPasOutputIDs.Free; FPasOutputIDs.Free;
FPasOutputConsts.Free; FPasOutputConsts.Free;
FPasOutputMessages.Free; FPasOutputMessages.Free;
FPasGlobalVars.Free;
FPasInitialization.Free;
FJavaOutputIDs.Free; FJavaOutputIDs.Free;
FJavaOutputMethods.Free; FJavaOutputMethods.Free;

View File

@ -3,6 +3,9 @@
# [ClassName] Parent Interface1 Interface2 # [ClassName] Parent Interface1 Interface2
# declarations of fields, contructors, methods, consts, etc # declarations of fields, contructors, methods, consts, etc
# #
# For Classes which are only used through a global object:
# %ClassName%ObjectName% Parent Interface1 Interface2
#
# For Interfaces: # For Interfaces:
# {InterfaceName} Parent1 Parent2 Parent3 # {InterfaceName} Parent1 Parent2 Parent3
# #
@ -30,6 +33,10 @@ field float ydpi
# #
# android.app.* # android.app.*
# #
%Activity%activity% TJavaObject
method void setTitle(CharSequence title)
method CharSequence getTitle()
[Display] TJavaObject [Display] TJavaObject
method void getMetrics(DisplayMetrics outMetrics) method void getMetrics(DisplayMetrics outMetrics)
@ -53,8 +60,11 @@ const INVISIBLE = 4;
const GONE = 8; const GONE = 8;
[ViewGroup] View [ViewGroup] View
method void addView(View child, ViewGroup.LayoutParams params); method void addView(View child, int aindex, ViewGroup.LayoutParams params); overload;
# method void addView(View child); method void addView(View child, ViewGroup.LayoutParams params); overload;
method void addView(View child, int aindex); overload;
method void addView(View child); overload;
method void addView(View child, int width, int height); overload;
[LinearLayout] ViewGroup [LinearLayout] ViewGroup
constructor Create(Activity); constructor Create(Activity);