Qt: added one way selection clipboard (native qt control or another app -> lcl, doesn't work yet from eg. synedit -> qt, datasize is 0 for some reason).

git-svn-id: trunk@25666 -
This commit is contained in:
zeljko 2010-05-26 16:41:58 +00:00
parent 564049643d
commit 444245d7dc

View File

@ -516,7 +516,7 @@ type
{$ENDIF} {$ENDIF}
FClipChanged: Boolean; FClipChanged: Boolean;
FClipBoardFormats: TStringList; FClipBoardFormats: TStringList;
FOnClipBoardRequest: TClipboardRequestEvent; FOnClipBoardRequest: Array[TClipBoardType] of TClipboardRequestEvent;
function IsClipboardChanged: Boolean; function IsClipboardChanged: Boolean;
public public
constructor Create; override; constructor Create; override;
@ -3262,10 +3262,13 @@ end;
{ TQtClipboard } { TQtClipboard }
constructor TQtClipboard.Create; constructor TQtClipboard.Create;
var
ClipboardType: TClipboardType;
begin begin
inherited Create; inherited Create;
FLockClip := False; FLockClip := False;
FOnClipBoardRequest := nil; for ClipboardType := Low(TClipBoardType) to High(TClipBoardType) do
FOnClipBoardRequest[ClipBoardType] := nil;
FClipBoardFormats := TStringList.Create; FClipBoardFormats := TStringList.Create;
FClipBoardFormats.Add('foo'); // 0 is reserved FClipBoardFormats.Add('foo'); // 0 is reserved
TheObject := QApplication_clipBoard; TheObject := QApplication_clipBoard;
@ -3301,10 +3304,30 @@ end;
{$IFDEF HASX11} {$IFDEF HASX11}
procedure TQtClipboard.signalSelectionChanged; cdecl; procedure TQtClipboard.signalSelectionChanged; cdecl;
var
TempMimeData: QMimeDataH;
WStr: WideString;
MimeType: WideString;
Clip: TClipBoard;
begin begin
{$IFDEF VERBOSE_QT_CLIPBOARD} {$IFDEF VERBOSE_QT_CLIPBOARD}
writeln('signalSelectionChanged()'); writeln('signalSelectionChanged() OWNER?=', QClipboard_ownsSelection(Self.clipboard),
' FOnClipBoardRequest ? ',FOnClipBoardRequest[ctPrimarySelection] <> nil);
{$ENDIF} {$ENDIF}
TempMimeData := getMimeData(QClipboardSelection);
if (TempMimeData <> nil) and
(QMimeData_hasText(TempMimeData) or QMimeData_hasHtml(TempMimeData) or
QMimeData_hasURLS(TempMimeData)) then
begin
QMimeData_text(TempMimeData, @WStr);
WStr := UTF16ToUTF8(WStr);
// TODO: We don't get any data when copying to clip
// so must set it like this , so at least copying from
// another app here works correct.Later signalSelectionChanged
// can be removed
// if QClipboard_ownsSelection(Self.Clipboard) then
ClipBrd.PrimarySelection.AsText := WStr;
end;
end; end;
{$ENDIF} {$ENDIF}
@ -3466,20 +3489,18 @@ function TQtClipboard.GetOwnerShip(ClipboardType: TClipboardType;
begin begin
MimeData := QMimeData_create(); MimeData := QMimeData_create();
DataStream := TMemoryStream.Create; DataStream := TMemoryStream.Create;
for I := 0 to FormatCount - 1 do for I := 0 to FormatCount - 1 do
begin begin
DataStream.Size := 0; DataStream.Size := 0;
DataStream.Position := 0; DataStream.Position := 0;
MimeType := FormatToMimeType(Formats[I]); MimeType := FormatToMimeType(Formats[I]);
FOnClipBoardRequest(Formats[I], DataStream); FOnClipBoardRequest[ClipboardType](Formats[I], DataStream);
Data := QByteArray_create(PAnsiChar(DataStream.Memory), DataStream.Size); Data := QByteArray_create(PAnsiChar(DataStream.Memory), DataStream.Size);
if (QByteArray_length(Data) > 1) and QByteArray_endsWith(Data, #0) then if (QByteArray_length(Data) > 1) and QByteArray_endsWith(Data, #0) then
QByteArray_chop(Data, 1); QByteArray_chop(Data, 1);
QMimeData_setData(MimeData, @MimeType, Data); QMimeData_setData(MimeData, @MimeType, Data);
QByteArray_destroy(Data); QByteArray_destroy(Data);
end; end;
DataStream.Free; DataStream.Free;
setMimeData(MimeData, ClipbBoardTypeToQtClipboard[ClipBoardType]); setMimeData(MimeData, ClipbBoardTypeToQtClipboard[ClipBoardType]);
// do not destroy MimeData!!! // do not destroy MimeData!!!
@ -3490,7 +3511,7 @@ begin
begin begin
{ The LCL indicates it doesn't have the clipboard data anymore { The LCL indicates it doesn't have the clipboard data anymore
and the interface can't use the OnRequestProc anymore.} and the interface can't use the OnRequestProc anymore.}
FOnClipBoardRequest := nil; FOnClipBoardRequest[ClipboardType] := nil;
Result := True; Result := True;
end else end else
begin begin
@ -3501,8 +3522,8 @@ begin
try try
{ clear OnClipBoardRequest to prevent destroying the LCL clipboard, { clear OnClipBoardRequest to prevent destroying the LCL clipboard,
when emptying the clipboard} when emptying the clipboard}
FOnClipBoardRequest := nil; FOnClipBoardRequest[ClipBoardType] := nil;
FOnClipBoardRequest := OnRequestProc; FOnClipBoardRequest[ClipBoardType] := OnRequestProc;
PutOnClipBoard; PutOnClipBoard;
Result := True; Result := True;
finally finally