LCL-CustomDrawn-Android: Improves the combobox selection further, fixing the case where the item index didnt change but the text did. Starts implementing Clipboard text setting

git-svn-id: trunk@37223 -
This commit is contained in:
sekelsenmat 2012-05-08 17:04:49 +00:00
parent 81d61cbfd7
commit 2b25ebf0b3
3 changed files with 63 additions and 20 deletions

View File

@ -934,6 +934,7 @@ end;
procedure TCDComboBox.SetItemIndex(AValue: Integer);
var
lValue: Integer;
lText: String;
begin
lValue := AValue;
@ -941,9 +942,14 @@ begin
if lValue > FItems.Count then lValue := FItems.Count;
if lValue < -1 then lValue := -1;
if FItemIndex=lValue then Exit;
// Check if the text changed too, because it might differ from the choosen item
FItemIndex:=lValue;
if lValue >= 0 then Text := FItems.Strings[lValue];
if lValue >= 0 then
begin
lText := FItems.Strings[lValue];
if Lines.Text = lText then Exit;
Text := lText;
end;
Invalidate;
end;

View File

@ -47,7 +47,7 @@
// ==================
// Android options
// ==================
{$define VerboseCDShowSelectItemDialog}
{.$define VerboseCDShowSelectItemDialog}
// ==================
// X11 options
@ -81,7 +81,7 @@
{.$define VerboseCDX11WinAPI}
{.$define VerboseCDEvents}
{.$define VerboseCDAccessibility}
{$define VerboseCDClipboard}
{.$define VerboseCDClipboard}
{.$define VerboseCDFocus}
{.$define VerboseCDKeyInput}

View File

@ -218,9 +218,11 @@ begin
begin
lChar := lNativeString[i];
Stream.WriteByte(Byte(lChar));
{$ifdef VerboseCDClipboard}
DebugLn(Format(':[TCDWidgetSet.ClipboardGetData] Writing char %d="%s"', [Byte(lChar), string(lChar)]));
{$endif}
Inc(i);
end;
Stream.WriteByte(0);
javaEnvRef^^.ReleaseStringUTFChars(javaEnvRef, lJavaString, lNativeString);
{$ifdef VerboseCDClipboard}
DebugLn(Format(':<[TCDWidgetSet.ClipboardGetData] lNativeString=%s lJavaString=%x', [StrPas(lNativeString), PtrInt(lJavaString)]));
@ -246,31 +248,66 @@ end;
with the invalid FormatID 0 to notify the old owner of the lost of ownership.
------------------------------------------------------------------------------}
function TCDWidgetSet.ClipboardGetOwnerShip(ClipboardType: TClipboardType;
OnRequestProc: TClipboardRequestEvent; FormatCount: integer;
OnRequestProc: TClipboardRequestEvent; FormatCount: integer;
Formats: PClipboardFormat): boolean;
var
// Java IDs
javaAndroidTextClipboardManagerClass: JClass;
javaMethod_ClipboardManager_setText: jmethodid = nil;
// Java Object instances
lJavaString: jstring;
lClipboardManagerObject: JObject;
javaString_CLIPBOARD_SERVICE: JString;
// array for the parameters
lParams: array[0..0] of JValue;
//
lStringStream: TStringStream;
lTextFormatIndex: TClipboardFormat;
lTextFormatFound: Boolean = False;
i: Integer;
const
javaConstant_CLIPBOARD_SERVICE = 'clipboard';
begin
{$ifdef VerboseCDClipboard}
DebugLn('[TCDWidgetSet.ClipboardGetOwnerShip]');
DebugLn(Format('[TCDWidgetSet.ClipboardGetOwnerShip] OnRequestProc=%x', [PtrInt(OnRequestProc)]));
{$endif}
Result := True;
Result := True; // Result always true, so that we can at least use internally the clipboard
// abstract void setText(CharSequence text)
if (javaEnvRef = nil) then Exit;
if OnRequestProc = nil then Exit;
{// Prepare the input
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, Str);
javaEnvRef^^.SetObjectField(javaEnvRef, javaActivityObject, JavaField_lcltext, lJavaString);
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lJavaString);
javaEnvRef^^.SetIntField(javaEnvRef, javaActivityObject, javaField_lcltextsize, lFontSize);
// Check if there is text in the list. If there isn't, give up
lTextFormatIndex := Self.ClipboardRegisterFormat('text/plain');
for i := 0 to FormatCount-1 do
begin
if Formats[i] = lTextFormatIndex then
begin
lTextFormatFound := True;
Break;
end;
end;
// With API level 8 we can only have text support
if not lTextFormatFound then
begin
Exit;
DebugLn(':<[TCDWidgetSet.ClipboardGetOwnerShip] Exiting because non-textual formats are not supported');
end;
// Call the method to measure the text
javaEnvRef^^.CallObjectMethod(javaEnvRef, javaActivityObject, javaMethod_LCLDoGetTextBounds);
}
{// Call the method to draw the text
lParams[0].i := FPColorToAndroidColor(lDestCanvas.Font.FPColor);
javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaActivityObject, javaMethod_LCLDoDrawText, @lParams[0]);}
// First IDs
javaAndroidTextClipboardManagerClass := javaEnvRef^^.FindClass(javaEnvRef,'android/text/ClipboardManager');
javaMethod_ClipboardManager_setText := javaEnvRef^^.GetMethodID(javaEnvRef, javaAndroidTextClipboardManagerClass, 'setText', '(Ljava/lang/CharSequence;)V');
// Gets a handle to the Clipboard Manager
//ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
javaString_CLIPBOARD_SERVICE := javaEnvRef^^.NewStringUTF(javaEnvRef, pchar(javaConstant_CLIPBOARD_SERVICE));
lParams[0].l := javaString_CLIPBOARD_SERVICE;
lClipboardManagerObject := javaEnvRef^^.CallObjectMethodA(javaEnvRef, javaActivityObject, javaMethod_getSystemService, @lParams[0]);
// clipboard.setText
OnRequestProc(lTextFormatIndex, lStringStream);
lJavaString := javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(lStringStream.DataString));
lParams[0].l := lJavaString;
javaEnvRef^^.CallVoidMethodA(javaEnvRef, lClipboardManagerObject, javaMethod_ClipboardManager_setText, @lParams[0]);
end;
(*{------------------------------------------------------------------------------