LibreOffice5(121)SystemClipboardのサービスとインターフェイスの一覧

2018-01-20

旧ブログ

t f B! P L
クリップボードにはSystemClipboardサービスを使ってアクセスできます。XTransferable型のオブジェクトをこのサービスから取得したり、設定したりして、クリップボードの値を取り出したり渡したりします。

前の関連記事:LibreOffice5(120)ドキュメントに埋め込んだモジュールをインポートする


SystemClipboardのサービスとインターフェイスの一覧

def macro():
 ctx = XSCRIPTCONTEXT.getComponentContext()  # コンポーネントコンテクストの取得。
 smgr = ctx.getServiceManager()  # サービスマネージャーの取得。 
 tcu = smgr.createInstanceWithContext("pq.Tcu", ctx)  # サービス名か実装名でインスタンス化。
 systemclipboard = smgr.createInstanceWithContext("com.sun.star.datatransfer.clipboard.SystemClipboard", ctx)
 tcu.wtree(systemclipboard)
SystemClipboardの内容はgetContents()で取得しsetContents()で設定できますが、やりとりするのはXTransferable型のオブジェクトになります。

└─.datatransfer.clipboard.SystemClipboard
  └─.datatransfer.clipboard.XSystemClipboard
     ├─.datatransfer.clipboard.XClipboardEx
     │   │   byte  getRenderingCapabilities()
     │   └─.datatransfer.clipboard.XClipboard
     │        .datatransfer.XTransferable  getContents()
     │                             string  getName()
     │                               void  setContents( [in]             .datatransfer.XTransferable xTrans,
     │                                                  [in] .datatransfer.clipboard.XClipboardOwner xClipboardOwner)
     ├─.datatransfer.clipboard.XClipboardNotifier
     │     void  addClipboardListener( [in] .datatransfer.clipboard.XClipboardListener listener)
     │     void  removeClipboardListener( [in] .datatransfer.clipboard.XClipboardListener listener)
     ├─.datatransfer.clipboard.XFlushableClipboard
     │     void  flushClipboard()
     └─.lang.XComponent
           void  addEventListener( [in] .lang.XEventListener xListener)
           void  dispose()
           void  removeEventListener( [in] .lang.XEventListener aListener)

SystemClipboardの内容のサービスとインターフェイスの一覧

def macro():
 ctx = XSCRIPTCONTEXT.getComponentContext()  # コンポーネントコンテクストの取得。
 smgr = ctx.getServiceManager()  # サービスマネージャーの取得。 
 tcu = smgr.createInstanceWithContext("pq.Tcu", ctx)  # サービス名か実装名でインスタンス化。
 systemclipboard = smgr.createInstanceWithContext("com.sun.star.datatransfer.clipboard.SystemClipboard", ctx)
 tcu.wtree(systemclipboard.getContents())
SystemClipboardに渡すXTransferable型のオブジェクトのサービスとインターフェイスですが、実装しているのはXTransferableインターフェイスだけでした。

└─.datatransfer.XTransferable
                               any  getTransferData( [in] .datatransfer.DataFlavor aFlavor
                                          ) raises ( .io.IOException,
                                                     .datatransfer.UnsupportedFlavorException)
        [.datatransfer.DataFlavor]  getTransferDataFlavors()
                           boolean  isDataFlavorSupported( [in] .datatransfer.DataFlavor aFlavor)

DataFlavor Structを指定してgetTransferData()でクリップボードの内容を取得できます。

DataFlavorとはJavaで使われている概念のようで、データに関するメタ情報を提供するもののようです(DataFlavor (Java Platform SE 8 ))。

DataFlavor StructにはMimetype、HumanPresentableName、DataTypeの3つのアトリビュートがありますが、必須の情報はMimetypeだけのようです。

Pythonのデバッガで確認するとDataTypeには(type)stringや(type)[]byteが入っていました。

このDataTypeはenum TypeClassに該当すると思ったのですが、これらの値を入れたDataFlavor Structを返すオブジェクトをsetContents()に渡すとLibreOfficeがクラッシュしました。

setContents()に渡すオブジェクトのDataFlavor StructのDataTypeは設定しなくてよいようです(その時voidが入ることになります)。

getTransferDataFlavors()の戻り値がシークエンス型であるように、1つのクリップボードの内容に対して複数のDataFlavorが存在するということが最初は理解できませんでしたが、これはsetContents()に渡すオブジェクトが対応しているDataFlavorに該当しているようです。

OOoBasic/Generic/XTransferable - ...?には各ドキュメントからコピーした場合にクリップボードに入るオブジェクトのDataFlavorのMimeTypeの一覧があります。

LibreOfficeのクリップボードで受け取れる文字列のMimeTypeはtext/plain;charset=utf-16であって、text/plain;charset=utf-8だけにしか対応していないXTransferable型のオブジェクトではペーストできませんでした(linuxBean14.04の場合)。

参考にしたサイト


DataFlavor (Java Platform SE 8 )
DataFlavorとはデータに関するメタ情報を提供するもののようです。

OOoBasic/Generic/XTransferable - ...?
XTransferableインターフェイスの解説。

次の関連記事:LibreOffice5(122)Javaの例: ClipboardをPythonにする

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ