Adds support for String and interfaces

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1811 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2011-08-19 10:56:52 +00:00
parent 5eaf24e651
commit f782a492bf
3 changed files with 191 additions and 69 deletions

View File

@ -39,7 +39,7 @@
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="23">
<Units Count="26">
<Unit0>
<Filename Value="android_bindings_generator.pas"/>
<IsPartOfProject Value="True"/>
@ -48,7 +48,7 @@
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="15" Y="14"/>
<UsageCount Value="35"/>
<UsageCount Value="38"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
@ -60,8 +60,8 @@
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="6"/>
<CursorPos X="1" Y="51"/>
<UsageCount Value="35"/>
<CursorPos X="80" Y="15"/>
<UsageCount Value="38"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
@ -117,12 +117,11 @@
<Filename Value="android_sdk_bindings_gen.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="android_sdk_bindings_gen"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="563"/>
<CursorPos X="16" Y="600"/>
<UsageCount Value="35"/>
<TopLine Value="162"/>
<CursorPos X="32" Y="176"/>
<UsageCount Value="38"/>
<Loaded Value="True"/>
</Unit8>
<Unit9>
@ -201,9 +200,9 @@
<Filename Value="sdk_level_7/android_all.txt"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="27"/>
<CursorPos X="1" Y="38"/>
<UsageCount Value="10"/>
<TopLine Value="99"/>
<CursorPos X="25" Y="145"/>
<UsageCount Value="12"/>
<Loaded Value="True"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit18>
@ -230,7 +229,7 @@
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="26" Y="9"/>
<UsageCount Value="10"/>
<UsageCount Value="12"/>
<Loaded Value="True"/>
</Unit21>
<Unit22>
@ -241,124 +240,157 @@
<UsageCount Value="10"/>
<DefaultSyntaxHighlighter Value="Java"/>
</Unit22>
<Unit23>
<Filename Value="../../../lazarus/lcl/interfaces/android/android_all.pas"/>
<UnitName Value="android_all"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="5"/>
<WindowIndex Value="0"/>
<TopLine Value="654"/>
<CursorPos X="1" Y="682"/>
<UsageCount Value="12"/>
<Loaded Value="True"/>
</Unit23>
<Unit24>
<Filename Value="../../../lazarus/lcl/interfaces/android/androidpipescomm.pas"/>
<UnitName Value="androidpipescomm"/>
<EditorIndex Value="6"/>
<WindowIndex Value="0"/>
<TopLine Value="222"/>
<CursorPos X="10" Y="139"/>
<UsageCount Value="12"/>
<Loaded Value="True"/>
</Unit24>
<Unit25>
<Filename Value="../../../lazarus/lcl/interfaces/android/androidapp.pas"/>
<UnitName Value="androidapp"/>
<WindowIndex Value="0"/>
<TopLine Value="74"/>
<CursorPos X="1" Y="1"/>
<UsageCount Value="10"/>
</Unit25>
</Units>
<JumpHistory Count="29" HistoryIndex="28">
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="22" Column="29" TopLine="1"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position1>
<Position2>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="23" Column="15" TopLine="1"/>
<Caret Line="777" Column="49" TopLine="737"/>
</Position2>
<Position3>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="106" Column="72" TopLine="106"/>
<Caret Line="826" Column="47" TopLine="786"/>
</Position3>
<Position4>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="212" Column="35" TopLine="184"/>
<Caret Line="835" Column="67" TopLine="795"/>
</Position4>
<Position5>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="375" Column="65" TopLine="351"/>
<Caret Line="2" Column="5" TopLine="1"/>
</Position5>
<Position6>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="374" Column="50" TopLine="351"/>
<Caret Line="57" Column="25" TopLine="17"/>
</Position6>
<Position7>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="36" Column="19" TopLine="3"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position7>
<Position8>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="689" Column="24" TopLine="664"/>
<Caret Line="40" Column="36" TopLine="8"/>
</Position8>
<Position9>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="375" Column="1" TopLine="352"/>
<Caret Line="836" Column="33" TopLine="835"/>
</Position9>
<Position10>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="40" Column="18" TopLine="3"/>
<Caret Line="40" Column="48" TopLine="40"/>
</Position10>
<Position11>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="713" Column="13" TopLine="689"/>
<Caret Line="41" Column="58" TopLine="3"/>
</Position11>
<Position12>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="41" Column="53" TopLine="3"/>
<Caret Line="321" Column="29" TopLine="304"/>
</Position12>
<Position13>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="677" Column="1" TopLine="673"/>
<Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="76" Column="28" TopLine="41"/>
</Position13>
<Position14>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="153" Column="40" TopLine="134"/>
<Caret Line="582" Column="99" TopLine="507"/>
</Position14>
<Position15>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="171" Column="31" TopLine="134"/>
<Caret Line="524" Column="1" TopLine="507"/>
</Position15>
<Position16>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="385" Column="1" TopLine="370"/>
<Caret Line="525" Column="1" TopLine="507"/>
</Position16>
<Position17>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="325" Column="22" TopLine="309"/>
<Caret Line="528" Column="1" TopLine="507"/>
</Position17>
<Position18>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="727" Column="32" TopLine="722"/>
<Caret Line="529" Column="1" TopLine="507"/>
</Position18>
<Position19>
<Filename Value="mainform.pas"/>
<Caret Line="38" Column="34" TopLine="1"/>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="532" Column="1" TopLine="507"/>
</Position19>
<Position20>
<Filename Value="mainform.pas"/>
<Caret Line="40" Column="32" TopLine="2"/>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="535" Column="1" TopLine="507"/>
</Position20>
<Position21>
<Filename Value="mainform.pas"/>
<Caret Line="48" Column="62" TopLine="2"/>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="539" Column="1" TopLine="507"/>
</Position21>
<Position22>
<Filename Value="mainform.pas"/>
<Caret Line="49" Column="15" TopLine="5"/>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="541" Column="1" TopLine="507"/>
</Position22>
<Position23>
<Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="63" Column="42" TopLine="51"/>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="542" Column="36" TopLine="526"/>
</Position23>
<Position24>
<Filename Value="../../../lazarus/lcl/interfaces/lcl.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
<Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="145" Column="23" TopLine="99"/>
</Position24>
<Position25>
<Filename Value="../../../lazarus/lcl/interfaces/lcl.pas"/>
<Caret Line="10" Column="1" TopLine="1"/>
<Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position25>
<Position26>
<Filename Value="../../../lazarus/lcl/interfaces/lcl.pas"/>
<Caret Line="20" Column="81" TopLine="1"/>
<Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="143" Column="21" TopLine="99"/>
</Position26>
<Position27>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="789" Column="1" TopLine="760"/>
<Filename Value="sdk_level_7/android_all.txt"/>
<Caret Line="145" Column="23" TopLine="99"/>
</Position27>
<Position28>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="623" Column="3" TopLine="593"/>
<Caret Line="42" Column="20" TopLine="3"/>
</Position28>
<Position29>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="667" Column="1" TopLine="644"/>
<Filename Value="../../../lazarus/lcl/interfaces/android/android_all.pas"/>
<Caret Line="666" Column="17" TopLine="653"/>
</Position29>
<Position30>
<Filename Value="android_sdk_bindings_gen.pas"/>
<Caret Line="864" Column="22" TopLine="858"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>

View File

@ -23,7 +23,7 @@ type
procedure GenerateJavaFile(ASourceFile: string; ADest: TStringList);
procedure ProcessModelFile(ASourceFile, APasOutputFile, AJavaOutputFile: string);
procedure ProcessModelLine(ASourceLine: string);
procedure ProcessModelClass(ASourceLine: string);
procedure ProcessModelClass(ASourceLine: string; AIsInterface: Boolean);
procedure ProcessModelMethod(ASourceLine: string; AIsField: Boolean);
procedure ProcessModelConstructor(ASourceLine: string);
procedure ProcessModelConst(ASourceLine: string);
@ -37,7 +37,9 @@ type
function GetJavaTypeConverter(AType: string): string;
function GetIDString(AMethodName: string): string;
procedure AddOutputIDs(AIDString: string);
function ConvertJavaSpecialCharsToUnderline(AStr: string): string;
function ConvertPointToUnderline(AStr: string): string;
function JavaRemoveGeneric(AStr: string): string;
function IsBasicJavaType(AStr: string): Boolean;
public
constructor Create;
@ -164,10 +166,14 @@ begin
ADest.Add(' DisplayMetrics param_self_DisplayMetrics;');
ADest.Add(' CompoundButton param_self_CompoundButton;');
ADest.Add(' WindowManager param_self_WindowManager;');
ADest.Add(' AbsSpinner param_self_AbsSpinner;');
ADest.Add(' ArrayAdapter<String> param_self_ArrayAdapter_String_;');
ADest.Add(' // Params');
ADest.Add(' ViewGroup.LayoutParams lViewGroup_LayoutParams_1, lViewGroup_LayoutParams_2;');
ADest.Add(' SpinnerAdapter lSpinnerAdapter_1;');
ADest.Add(' DisplayMetrics lDisplayMetrics_1;');
ADest.Add(' CharSequence lCharSequence_1;');
ADest.Add(' String lString_1;');
ADest.Add(' View lView_1;');
ADest.Add(' int lint_1, lint_2, lint_3, lint_4;');
ADest.Add(' float lfloat_1, lfloat_2;');
@ -240,7 +246,14 @@ begin
// Starting a new class
if ASourceLine[1] = '[' then
begin
ProcessModelClass(ASourceLine);
ProcessModelClass(ASourceLine, False);
Exit;
end;
// Starting a new interface
if ASourceLine[1] = '{' then
begin
ProcessModelClass(ASourceLine, True);
Exit;
end;
@ -279,10 +292,10 @@ begin
end;
end;
procedure TAndroidSDKBindingsGen.ProcessModelClass(ASourceLine: string);
procedure TAndroidSDKBindingsGen.ProcessModelClass(ASourceLine: string; AIsInterface: Boolean);
var
lReaderPos: Integer = 1;
lCurWord, lParentClassName: string;
lCurWord, lParentClassName, lTmpParent: string;
begin
if ASourceLine = '' then Exit;
@ -296,10 +309,31 @@ begin
FClassNamePas := GetPascalTypeName(lCurWord);
FClassName := lCurWord;
lParentClassName := GetNextWord(ASourceLine, lReaderPos);
lParentClassName := GetPascalTypeName(lParentClassName);
FPasOutputClasses.Add(Format(' %s = class(%s)', [FClassNamePas, lParentClassName]));
FPasOutputClasses.Add(' public');
lTmpParent := GetNextWord(ASourceLine, lReaderPos);
lParentClassName := GetPascalTypeName(lTmpParent);
// Read all parents
while lTmpParent <> '' do
begin
lTmpParent := GetNextWord(ASourceLine, lReaderPos);
if lTmpParent <> '' then
lParentClassName := lParentClassName + ', ' + GetPascalTypeName(lTmpParent);
end;
// Java classes can implement interfaces, so based on a safe ground
if lParentClassName = '' then
if AIsInterface then
lParentClassName := 'IJavaInterface'
else
lParentClassName := 'TInterfacedObject';
if AIsInterface then
FPasOutputClasses.Add(Format(' %s = interface(%s)', [FClassNamePas, lParentClassName]))
else
begin
FPasOutputClasses.Add(Format(' %s = class(%s)', [FClassNamePas, lParentClassName]));
FPasOutputClasses.Add(' public');
end;
lCurWord := GetNextWord(ASourceLine, lReaderPos);
Inc(FClassNum);
FMethodNum := 0;
@ -307,7 +341,10 @@ begin
FPasOutputIDs.Add(' // ' + FClassNamePas);
FJavaOutputIDs.Add(' // ' + FClassName);
FPasOutputConsts.Add(' { ' + FClassNamePas + ' }');
FPasOutputClassesForward.Add(' ' + FClassNamePas + ' = class;')
if AIsInterface then
FPasOutputClassesForward.Add(' ' + FClassNamePas + ' = interface;')
else
FPasOutputClassesForward.Add(' ' + FClassNamePas + ' = class;')
end;
procedure TAndroidSDKBindingsGen.ProcessModelMethod(
@ -346,7 +383,7 @@ begin
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(' + lIDString + ');');
FPasOutputImpl.Add(' vAndroidPipesComm.SendInt(Index); // Self, Java Pointer');
lJavaParamSelf := 'param_self_' + FClassName;
lJavaParamSelf := 'param_self_' + JavaRemoveGeneric(FClassName);
FJavaOutputMethods.Add(' // ' + ASourceLine);
FJavaOutputMethods.Add(' case ' + lIDString + ':');
FJavaOutputMethods.Add(' DebugOut("' + lIDString + '");');
@ -505,6 +542,7 @@ begin
if (lParamType = 'Activity') then
begin
HasActivityParam := True;
lParamName := 'ReturnToRepeat';
Continue;
end;
@ -704,7 +742,7 @@ end;
function TAndroidSDKBindingsGen.GetNextWord(ALine: string;
var AStartPos: Integer): string;
const
WordSeparators = [' ','(',')','[',']',',',';',':',#9{TAB}];
WordSeparators = [' ','(',')','[',']','{','}',',',';',':',#9{TAB}];
var
lState: Integer = 0;
begin
@ -744,12 +782,12 @@ begin
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 = 'CharSequence') or (ABaseName = 'String') then Result := 'string'
else if ABaseName = 'TJavaObject' then Result := ABaseName
else
begin
Result := 'T' + ABaseName;
Result := StringReplace(Result, '.', '_', [rfReplaceAll]);
Result := ConvertJavaSpecialCharsToUnderline(Result);
end;
end;
@ -790,7 +828,7 @@ begin
if AType = 'boolean' then Exit('lBool')
else if AType = 'int' then Exit('lInt')
else if AType = 'float' then Exit('lFloat')
else if AType = 'CharSequence' then
else if (AType = 'CharSequence') or (AType = 'String') then
Result := Format('(%s) MyJavaLang.LangElements.get(lInt)', [AType])
else Result := Format('(%s) ViewElements.get(lInt)', [AType]);
end;
@ -798,7 +836,7 @@ end;
function TAndroidSDKBindingsGen.GetIDString(AMethodName: string): string;
begin
Result := 'amkUI_' + FClassNamePas + '_' + AMethodName;;
Result := StringReplace(Result, '.', '_', [rfReplaceAll]);
Result := ConvertJavaSpecialCharsToUnderline(Result);
end;
procedure TAndroidSDKBindingsGen.AddOutputIDs(AIDString: string);
@ -807,9 +845,22 @@ begin
FJavaOutputIDs.Add(' static final int ' + AIDString + ' = 0x' + IntToHex(FClassNum*$1000+FMethodNum, 8) + ';');
end;
function TAndroidSDKBindingsGen.ConvertJavaSpecialCharsToUnderline(AStr: string): string;
begin
Result := StringReplace(AStr, '.', '_', [rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(Result, '<', '_', [rfReplaceAll]);
Result := StringReplace(Result, '>', '_', [rfReplaceAll]);
end;
function TAndroidSDKBindingsGen.ConvertPointToUnderline(AStr: string): string;
begin
Result := SysUtils.StringReplace(AStr, '.', '_', [rfReplaceAll, rfIgnoreCase]);
Result := StringReplace(AStr, '.', '_', [rfReplaceAll, rfIgnoreCase]);
end;
function TAndroidSDKBindingsGen.JavaRemoveGeneric(AStr: string): string;
begin
Result := StringReplace(AStr, '<', '_', [rfReplaceAll]);
Result := StringReplace(Result, '>', '_', [rfReplaceAll]);
end;
function TAndroidSDKBindingsGen.IsBasicJavaType(AStr: string): Boolean;

View File

@ -1,3 +1,12 @@
#
# Declaration of classes:
# [ClassName] Parent Interface1 Interface2
# declarations of fields, contructors, methods, consts, etc
#
# For Interfaces:
# {InterfaceName} Parent1 Parent2 Parent3
#
#[MenuItem] TJavaObject
#classcallback MenuItem.OnMenuItemClickListener boolean onMenuItemClick (MenuItem item)
#method MenuItem setOnMenuItemClickListener (MenuItem.OnMenuItemClickListener menuItemClickListener)
@ -101,7 +110,37 @@ constructor Create(Activity)
[AdapterView] ViewGroup
[AbsSpinner] AdapterView
# SpinnerAdapter getAdapter()
method int getCount()
# View getSelectedView()
# void onRestoreInstanceState(Parcelable state)
# Parcelable onSaveInstanceState()
# int pointToPosition(int x, int y)
# void requestLayout()
method void setAdapter(SpinnerAdapter adapter)
# void setSelection(int position, boolean animate)
# void setSelection(int position)
[Spinner] AbsSpinner
constructor Create(Activity);
#
# For info about the Adapter of a spinner see:
# http://stackoverflow.com/questions/2784081/android-create-spinner-programmatically-from-array
#
{Filterable}
{Adapter}
{ListAdapter} Adapter
{SpinnerAdapter} Adapter
# android.widget.BaseAdapter
[BaseAdapter] TJavaObject ListAdapter SpinnerAdapter
# android.widget.ArrayAdapter<T>
[ArrayAdapter<String>] BaseAdapter Filterable
constructor Create(Activity, int textViewResourceId)
method void add(String aobject)