UPD: refactor in uDarwinClipboard

(cherry picked from commit aff2d61421)
This commit is contained in:
rich2014 2026-01-01 23:09:20 +08:00 committed by Alexander Koblov
commit d6537aa308
2 changed files with 75 additions and 81 deletions

View file

@ -549,7 +549,7 @@ var
darwinOp: TDarwinClipboardOperation;
begin
darwinOp:= OperationToDarwin[ClipboardOp];
Result:= TDarwinClipboardUtil.writeToClipboard( filenames, darwinOp );
Result:= TDarwinClipboardUtil.setFiles( darwinOp, filenames );
end;
function PasteFromClipboard(out ClipboardOp: TClipboardOperation; out filenames:TStringList):Boolean;
@ -559,7 +559,7 @@ const
var
darwinOp: TDarwinClipboardOperation;
begin
Result:= TDarwinClipboardUtil.readFromClipboard( darwinOp, filenames );
Result:= TDarwinClipboardUtil.getFiles( darwinOp, filenames );
ClipboardOp:= OperationFromDarwin[darwinOp];
end;

View file

@ -7,7 +7,7 @@ interface
uses
Classes, SysUtils,
CocoaAll, CocoaUtils,
CocoaAll,
DCStrUtils,
uDarwinUtil;
@ -19,45 +19,39 @@ type
{ TDarwinClipboardUtil }
TDarwinClipboardUtil = class
private
class procedure addText( const value: String; const pbType: NSString );
class procedure addText( const value: String );
class procedure addFiles( const filenames: TStringList; const pb: NSPasteboard );
class procedure addFiles( const filenames:TStringList );
private
class function filenamesToString( const filenames:TStringList ): String;
public
class function writeToClipboard(
const filenames: TStringList;
const clipboardOp: TDarwinClipboardOperation ): Boolean;
class function readFromClipboard(
class procedure setText( const value: String );
class function getText( const pbType: String ): String;
class function setFiles(
const clipboardOp: TDarwinClipboardOperation;
const filenames: TStringList ): Boolean;
class function getFiles(
out clipboardOp: TDarwinClipboardOperation;
out filenames:TStringList):Boolean;
out filenames:TStringList ): Boolean;
class procedure clear;
class procedure setText( const s: String );
end;
implementation
const
OperationName : array[TDarwinClipboardOperation] of String =
OPERATION_NAME: array[TDarwinClipboardOperation] of String =
( 'copy', 'cut' );
darwinPasteboardOpMime = 'application/x-darwin-doublecmd-PbOp';
PASTEBOARD_OP_MIME = 'application/x-darwin-doublecmd-PbOp';
// MacOs 10.5 compatibility
// macOS 10.5 compatibility
function FilenamesToString(const filenames:TStringList): String;
begin
Result := TrimRightLineEnding( filenames.Text, filenames.TextLineBreakStyle);
end;
{ TDarwinClipboardUtil }
procedure NSPasteboardAddFiles(const filenames:TStringList; pb:NSPasteboard);
begin
pb.addTypes_owner(NSArray.arrayWithObject(NSFileNamesPboardType), nil);
pb.setPropertyList_forType(ListToNSArray(filenames), NSFileNamesPboardType);
end;
procedure NSPasteboardAddFiles(const filenames:TStringList);
begin
NSPasteboardAddFiles( filenames, NSPasteboard.generalPasteboard );
end;
procedure NSPasteboardAddString(const value:String; const pbType:NSString );
class procedure TDarwinClipboardUtil.addText( const value: String; const pbType: NSString );
var
pb: NSPasteboard;
begin
@ -66,95 +60,95 @@ begin
pb.setString_forType(StringToNSString(value), pbType);
end;
procedure NSPasteboardAddString(const value:String);
class procedure TDarwinClipboardUtil.addText( const value:String );
begin
NSPasteboardAddString( value , NSStringPboardType );
TDarwinClipboardUtil.addText( value , NSStringPboardType );
end;
function getStringFromPasteboard( pbType : NSString ) : String;
class procedure TDarwinClipboardUtil.setText( const value: String );
begin
TDarwinClipboardUtil.clear;
TDarwinClipboardUtil.addText( value );
end;
class function TDarwinClipboardUtil.getText( const pbType: String ): String;
var
pb : NSPasteboard;
pb: NSPasteboard;
begin
pb := NSPasteboard.generalPasteboard;
Result := NSStringToString( pb.stringForType( pbType ) );
pb:= NSPasteboard.generalPasteboard;
Result:= pb.stringForType(NSSTR(pbType)).UTF8String;
end;
function getOpFromPasteboard() : TDarwinClipboardOperation;
var
opString : String;
class procedure TDarwinClipboardUtil.addFiles( const filenames: TStringList; const pb: NSPasteboard );
begin
Result := TDarwinClipboardOperation.copy;
opString := getStringFromPasteboard( StringToNSString(darwinPasteboardOpMime) );
if OperationName[TDarwinClipboardOperation.cut].CompareTo(opString) = 0 then
Result := TDarwinClipboardOperation.cut;
pb.addTypes_owner(NSArray.arrayWithObject(NSFileNamesPboardType), nil);
pb.setPropertyList_forType(ListToNSArray(filenames), NSFileNamesPboardType);
end;
function getFilenamesFromPasteboard() : TStringList;
var
pb : NSPasteboard;
filenameArray{, lClasses}: NSArray;
class procedure TDarwinClipboardUtil.addFiles( const filenames:TStringList );
begin
Result := nil;
pb := NSPasteboard.generalPasteboard;
filenameArray := pb.propertyListForType(NSFilenamesPboardType);
if filenameArray <> nil then Result := NSArrayToList( filenameArray );
TDarwinClipboardUtil.addFiles( filenames, NSPasteboard.generalPasteboard );
end;
procedure ClearClipboard( pb:NSPasteboard );
class function TDarwinClipboardUtil.filenamesToString( const filenames:TStringList ): String;
begin
pb.clearContents;
Result:= TrimRightLineEnding( filenames.Text, filenames.TextLineBreakStyle );
end;
procedure ClearClipboard;
begin
ClearClipboard( NSPasteboard.generalPasteboard );
end;
procedure ClipboardSetText(AText: String);
begin
ClearClipboard;
NSPasteboardAddString(AText);
end;
{ TDarwinClipboardUtil }
class function TDarwinClipboardUtil.writeToClipboard(
const filenames: TStringList;
const clipboardOp: TDarwinClipboardOperation ): Boolean;
class function TDarwinClipboardUtil.setFiles(
const clipboardOp: TDarwinClipboardOperation;
const filenames: TStringList ): Boolean;
begin
Result:= False;
if filenames.Count = 0 then Exit;
ClearClipboard;
NSPasteboardAddFiles( filenames );
NSPasteboardAddString( FilenamesToString(filenames) );
NSPasteboardAddString( OperationName[ClipboardOp] , StringToNSString(darwinPasteboardOpMime) );
TDarwinClipboardUtil.clear;
TDarwinClipboardUtil.addFiles( filenames );
TDarwinClipboardUtil.addText( filenamesToString(filenames) );
TDarwinClipboardUtil.addText( OPERATION_NAME[ClipboardOp] , NSSTR(PASTEBOARD_OP_MIME) );
Result:= True;
end;
class function TDarwinClipboardUtil.readFromClipboard(
class function TDarwinClipboardUtil.getFiles(
out clipboardOp: TDarwinClipboardOperation;
out filenames: TStringList ): Boolean;
function getFilenamesFromPasteboard(): TStringList;
var
pb: NSPasteboard;
filenameArray: NSArray;
begin
Result:= nil;
pb:= NSPasteboard.generalPasteboard;
filenameArray:= pb.propertyListForType(NSFilenamesPboardType);
if filenameArray <> nil then
Result:= NSArrayToList( filenameArray );
end;
function getOpFromPasteboard(): TDarwinClipboardOperation;
var
opString: String;
begin
Result:= TDarwinClipboardOperation.copy;
opString:= TDarwinClipboardUtil.getText( PASTEBOARD_OP_MIME );
if OPERATION_NAME[TDarwinClipboardOperation.cut].CompareTo(opString) = 0 then
Result:= TDarwinClipboardOperation.cut;
end;
begin
Result := False;
clipboardOp := TDarwinClipboardOperation.copy;
filenames := getFilenamesFromPasteboard();
Result:= False;
clipboardOp:= TDarwinClipboardOperation.copy;
filenames:= getFilenamesFromPasteboard();
if filenames <> nil then begin
clipboardOp := getOpFromPasteboard();
Result := True;
clipboardOp:= getOpFromPasteboard();
Result:= True;
end;
end;
class procedure TDarwinClipboardUtil.clear;
begin
ClearClipboard( NSPasteboard.generalPasteboard );
end;
class procedure TDarwinClipboardUtil.setText( const s: String );
begin
TDarwinClipboardUtil.clear;
NSPasteboardAddString( s );
NSPasteboard.generalPasteboard.clearContents;
end;
end.