From 0d3d586ef936dbf4b6d7584452f81d1fc34bc2bd Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 26 Jul 2007 10:28:53 +0000 Subject: [PATCH] (Qt): begining of clipboard functions git-svn-id: trunk@11636 - --- lcl/interfaces/qt/qtint.pp | 2 + lcl/interfaces/qt/qtobject.inc | 6 ++ lcl/interfaces/qt/qtwinapi.inc | 187 ++++++++++++--------------------- 3 files changed, 73 insertions(+), 122 deletions(-) diff --git a/lcl/interfaces/qt/qtint.pp b/lcl/interfaces/qt/qtint.pp index f1e851ffdc..cbc80a6813 100644 --- a/lcl/interfaces/qt/qtint.pp +++ b/lcl/interfaces/qt/qtint.pp @@ -55,6 +55,7 @@ type private App: QApplicationH; SavedDCList: TList; + FClipBoardFormats: TStringList; protected function CreateThemeServices: TThemeServices; override; public @@ -113,6 +114,7 @@ const var QtWidgetSet: TQtWidgetSet; + OnClipBoardRequest: TClipboardRequestEvent; implementation diff --git a/lcl/interfaces/qt/qtobject.inc b/lcl/interfaces/qt/qtobject.inc index 637d822b9b..4e0ee7c214 100644 --- a/lcl/interfaces/qt/qtobject.inc +++ b/lcl/interfaces/qt/qtobject.inc @@ -27,6 +27,10 @@ begin inherited Create; QtWidgetSet := Self; + OnClipBoardRequest := nil; + + FClipBoardFormats := TStringList.Create; + FClipBoardFormats.Add('foo'); // 0 is reserved end; {------------------------------------------------------------------------------ @@ -44,6 +48,8 @@ begin if SavedDCList<>nil then SavedDCList.Free; + + FClipBoardFormats.Free; inherited Destroy; diff --git a/lcl/interfaces/qt/qtwinapi.inc b/lcl/interfaces/qt/qtwinapi.inc index ba614a273d..bc91993722 100644 --- a/lcl/interfaces/qt/qtwinapi.inc +++ b/lcl/interfaces/qt/qtwinapi.inc @@ -28,6 +28,14 @@ ***************************************************************************** } +const + ClipbBoardTypeToQtClipboard: array[TClipboardType] of QClipboardMode = + ( +{ctPrimarySelection } QClipboardSelection, +{ctSecondarySelection} QClipboardSelection, +{ctClipboard } QClipboardClipboard + ); + //##apiwiz##sps## // Do not remove, no wizard declaration before this line {------------------------------------------------------------------------------ @@ -167,43 +175,9 @@ end; function TQtWidgetSet.ClipboardFormatToMimeType(FormatID: TClipboardFormat): string; -var - QtClipBoard: QClipBoardH; - QtMimeData: QMimeDataH; - QtList: QStringListH; - i: Integer; - Str: WideString; begin - {$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION} - // WriteLn('***** [WinAPI TQtWidgetSet.ClipboardFormatToMimeType] missing implementation '); - {$endif} - QtClipBoard := QApplication_clipBoard; - QtMimeData := QClipboard_mimeData(QtClipBoard); - QtList := QStringList_create; - try - QMimeData_formats(QtMimeData, QtList); - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('DEBUG TQtWidgetSet.ClipboardFormatToMimeType() FormatID=',FormatID); - {$endif} - for i := 0 to QStringList_size(QtList) - 1 do - begin - QStringList_at(QtList, @Str, i); - Str := UTF8Decode(Str); - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('DEBUG TQtWidgetSet.ClipboardFormatToMimeType() QTCLIPBOARD i=',i,' Data=',Str); - {$endif} - if i = FormatID then - begin - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('Debug TQtWidgetSet.ClipboardFormatToMimeType() Clipboard founded mime type ...'); - {$endif} - Result := Str; - break; - end; - end; - finally - QStringList_destroy(QtList); - end; + if FClipBoardFormats.Count > FormatID then + Result := FClipBoardFormats[FormatID]; end; function TQtWidgetSet.ClipboardGetData(ClipboardType: TClipboardType; @@ -230,42 +204,25 @@ var i: Integer; Str: WideString; begin - {$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION} - // WriteLn('***** [WinAPI TQtWidgetSet.ClipboardGetFormats] missing implementation '); - {$endif} - Result := False; Count := 0; List := nil; - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('DEBUG TQtWidgetSet.ClipboardGetFormats() '); - {$endif} - QtClipBoard := QApplication_clipBoard; - - case ClipBoardType of - ctPrimarySelection, - ctSecondarySelection: QtMimeData := QClipboard_mimeData(QtClipBoard, QClipboardSelection); - ctClipBoard: QtMimeData := QClipboard_mimeData(QtClipBoard, QClipboardClipboard); - end; - + QtMimeData := QClipboard_mimeData(QtClipBoard, ClipbBoardTypeToQtClipboard[ClipBoardType]); + QtList := QStringList_create; QMimeData_formats(QtMimeData, QtList); try Count := QStringList_size(QtList); - - GetMem(List,SizeOf(TClipboardFormat)*Count); + GetMem(List, Count * SizeOf(TClipboardFormat)); for i := 0 to Count - 1 do begin QStringList_at(QtList, @Str, i); Str := UTF8Encode(Str); - List[i] := i; - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('DEBUG TQtWidgetSet.ClipboardGetFormats() QTCLIPBOARD i=',i,' Data=',Str); - {$endif} + List[i] := ClipboardRegisterFormat(Str); end; Result := Count > 0; @@ -278,76 +235,61 @@ end; function TQtWidgetSet.ClipboardGetOwnerShip(ClipboardType: TClipboardType; OnRequestProc: TClipboardRequestEvent; FormatCount: integer; Formats: PClipboardFormat): boolean; -begin - {$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION} - WriteLn('***** [WinAPI TQtWidgetSet.ClipboardGetOwnerShips] missing implementation '); - {$endif} +var + ClipBoard: QClipboardH; + MimeData: QMimeDataH; - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('DEBUG TQtWidgetSet.ClipboardGetOwnerShip() '); - {$endif} - - Result := True; + procedure PutOnClipBoard; + var + MimeType: WideString; + MimeData: QMimeDataH; + Data: QByteArrayH; + begin + MimeData := QMimeData_create(); + +{ for I := 0 to FormatCount - 1 do + begin + MimeType := FClipBoardFormats[Format]; + + Data := QByteArray_create(); + + QMimeData_setData(MimeData, @MimeType, Data); + end;} + + QClipboard_setMimeData(ClipBoard, MimeData, ClipbBoardTypeToQtClipboard[ClipBoardType]); + QMimeData_destroy(MimeData); + end; + +begin + Result := false; + if (FormatCount=0) or (OnRequestProc=nil) then + begin + { The LCL indicates it doesn't have the clipboard data anymore + and the interface can't use the OnRequestProc anymore.} + OnClipBoardRequest := nil; + Result := true; + end else + begin + { clear OnClipBoardRequest to prevent destroying the LCL clipboard, + when emptying the clipboard} + OnClipBoardRequest := nil; + ClipBoard := QApplication_clipboard(); + if ClipBoard = nil then + begin + exit; + end; + QClipboard_clear(ClipBoard, ClipbBoardTypeToQtClipboard[ClipBoardType]); + Result := true; + OnClipBoardRequest := OnRequestProc; + PutOnClipBoard; + end; end; function TQtWidgetSet.ClipboardRegisterFormat(const AMimeType: string): TClipboardFormat; -var - QtClipBoard: QClipBoardH; - QtMimeData: QMimeDataH; - List: QStringListH; - i: Integer; - Str: WideString; begin - {$ifdef VerboseQtWinAPI_MISSING_IMPLEMENTATION} - WriteLn('***** [WinAPI TQtWidgetSet.ClipboardRegisterFormat] AMimeType: ',AMimeType); - {$endif} - - Result := 0; - - QtClipBoard := QApplication_clipBoard; - - if QtClipBoard = nil then exit; - - try - QtMimeData := QClipboard_mimeData(QtClipBoard); - except - exit; - end; - - if QtMimeData = nil then exit; - - List := QStringList_create; - try - QMimeData_formats(QtMimeData, List); - - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('DEBUG TQtWidgetSet.ClipboardRegisterFormat() MimeType=',AMimeType,' MIMEDATA LIST COUNT=',QStringList_size(List)); - {$endif} - - for i := 0 to QStringList_size(List) - 1 do - begin - QStringList_at(List, @Str, i); - Str := UTF8Decode(Str); - - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('DEBUG TQtWidgetSet.ClipboardRegisterFormat() QTCLIPBOARD i=',i,' Data=',Str); - {$endif} - - if Str = AMimeType then - begin - - {$ifdef VerboseQtWinAPI_DEBUG_CLIPBOARD} - writeln('Debug TQtWidgetSet.ClipboardRegisterFormat() Clipboard founded mime type ...'); - {$endif} - - Result := i; - break; - end; - end; - finally - QStringList_destroy(List); - end; - + Result := FClipBoardFormats.IndexOf(AMimeType); + if Result = -1 then + Result := FClipBoardFormats.Add(AMimeType); end; @@ -4729,3 +4671,4 @@ end; +