Colocar o conteúdo de um arquivo no NSPasteboard usando UTI e não NSFileContentsPboardType?
-
14-11-2019 - |
Pergunta
Eu tenho um arquivo rich text com algumas imagens e texto.No meu aplicativo Cocoa, estou tentando colocar o conteúdo desse arquivo no NSDragPboard
para que o usuário possa arrastar o conteúdo em outros aplicativos (TextEdit, Mail, etc.).
Um caso de uso é este:o arquivo rich text contém um modelo de email e o usuário arrasta o conteúdo para uma nova mensagem do Mail.
Eu tentei isso sem sucesso:
NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard writeFileContents:filePath];
Os documentos da Apple dizem o seguinte:
Grava o conteúdo do nome do arquivo para o receptor e declara os dados como do tipo NSFileContentsPboardType e também de um tipo apropriado para a extensão do arquivo (conforme retornado pela função NSCReateFileContentsPboardType quando passou a extensão dos arquivos), se houver um.
No aplicativo ClipboardViewer posso ver alguns tipos de dados, sendo um deles NXFileContentsPboardType
.No entanto, aplicativos como Mail e TextEdit não permitem descartar esse tipo de dados.
Quando copio manualmente o conteúdo rich text para a área de transferência (Control + C), vejo todos os diferentes tipos de dados que desejo:
public.rtf
public.utf8-plain-text
NSStringPboardType
- ...
Então, como posso fazer isso programaticamente?Preciso descobrir todos os vários tipos de UTI e definir os dados correspondentes?Eu pensei que era isso [pboard writeFileContents:path]
era para...
Obrigado, Marcos.
EDITAR:
Fazendo progresso...Isso funciona para .rtf
arquivos, mas não para .txt
arquivos:
NSString *uti = // helper code to get UTI from NSURL resource key...
NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
[pboard declareTypes:[NSArray arrayWithObject:uti] owner:nil];
[pboard setData:[NSData dataWithContentsOfFile:filePath] forType:uti];
Para .txt
arquivos, o tipo de dados na área de transferência é public.text
.No entanto, TextEdit e Mail.app não permitem descartar esse tipo. public.rtf
no caso de rich text funciona bem ...
Solução
Parece que não é possível adicionar o conteúdo do arquivo à área de transferência e fazer com que os tipos de conteúdo sejam detectados automaticamente.
Acontece que colocar o conteúdo do arquivo RTF/RTFD na área de transferência é tão simples quanto:
NSAttributedString *contents = [[NSAttributedString alloc] initWithPath:filePath documentAttributes:NULL];
// This sets the correct type automatically:
[pboard writeObjects:[NSArray arrayWithObject:contents]];
[contents release];