*クリップボード [#la16025e] コピー、ペースト関連。 #contents mime-type は Iana に登録されているもの http://www.iana.org/assignments/media-types/ **システムクリップボード [#yb999369] ***内容の変更 [#jb106149] デスクトップ環境のクリップボードの内容を変更します。 クリップボードの要求に対して返す com.sun.star.datatransfer.XTransferable インターフェースを用意します。 コードのあるライブラリのあるドキュメントを閉じるとクリップボードの要求が通らなくなります。 #code(ob){{ Global sTxtCString As String Sub clipboard_1 sText = "123456" CopyToClipBoard(sText) End Sub Sub CopyToClipBoard( sText ) ' create SystemClipboard instance oClip = CreateUnoService( _ "com.sun.star.datatransfer.clipboard.SystemClipboard") oTR = createUnoListener("Tr_", _ "com.sun.star.datatransfer.XTransferable") ' set data oClip.setContents(oTR,Null) sTxtCString = sText 'oClip.flushClipboard() ' does not work End Sub Function Tr_getTransferData( _ aFlavor as com.sun.star.datatransfer.DataFlavor) If (aFlavor.MimeType = "text/plain;charset=utf-16") Then Tr_getTransferData() = sTxtCString End If End Function Function Tr_getTransferDataFlavors() Dim aFlavor As new com.sun.star.datatransfer.DataFlavor aFlavor.MimeType = "text/plain;charset=utf-16" aFlavor.HumanPresentableName = "Unicode-Text" Tr_getTransferDataFlavors() = array(aFlavor) End Function Function Tr_isDataFlavorSupported( _ aFlavor as com.sun.star.datatransfer.DataFlavor) as Boolean If aFlavor.MimeType = "text/plain;charset=utf-16" Then Tr_isDataFlavorSupported = true Else Tr_isDataFlavorSupported = false End If End Function }} ***内容の取得 [#c57b688d] システムクリップボード内の内容を取得します。内容の種類を判定しなければいけません。 #code(ob){{ Sub clipboard_2 oClip = CreateUnoService( _ "com.sun.star.datatransfer.clipboard.SystemClipboard") oTransfer = oClip.getContents() ' sequence of com.sun.star.datatransfer.DataFlavor aDataFlavors = oTransfer.getTransferDataFlavors() bType = False For i = 0 To UBound(aDataFlavors) Step 1 aDataFlavor = aDataFlavors(i) If aDataFlavor.MimeType = "text/plain;charset=utf-16" Then bType = True Exit For End If Next If bType Then ' convert utf-16 to UNO string oConverter = CreateUnoService( _ "com.sun.star.script.Converter") sData = oConverter.convertToSimpleType( _ oTransfer.getTransferData(aDataFlavor), _ com.sun.star.uno.TypeClass.STRING) msgbox sData End If End Sub }} **ドキュメント [#h7e681f8] ドキュメントのみのデータ取り扱いがあります。ドキュメントコントローラの com.sun.star.datatransfer.XTransferableSupplier インターフェースの insertTransferable メソッドを呼び出すと即時 (コピーおよび) 貼り付けされます。 効果は一度のみでシステムクリップボードなどには関与しません。 #code(ob){{ Global sTxtCString As String Sub clipboard_3 sText = "abc..." CopyToClipBoard(sText) End Sub Sub CopyToClipBoard( sText ) oTR = createUnoListener("Tr_", _ "com.sun.star.datatransfer.XTransferable") ThisComponent.getCurrentController().insertTransferable(oTR) sTxtCString = sText End Sub Function Tr_getTransferData( _ aFlavor as com.sun.star.datatransfer.DataFlavor) If (aFlavor.MimeType = "text/plain;charset=utf-16") Then Tr_getTransferData() = sTxtCString End If End Function Function Tr_getTransferDataFlavors() Dim aFlavor As new com.sun.star.datatransfer.DataFlavor aFlavor.MimeType = "text/plain;charset=utf-16" aFlavor.HumanPresentableName = "Unicode-Text" Tr_getTransferDataFlavors() = array(aFlavor) End Function Function Tr_isDataFlavorSupported( _ aFlavor as com.sun.star.datatransfer.DataFlavor) as Boolean If aFlavor.MimeType = "text/plain;charset=utf-16" Then Tr_isDataFlavorSupported = true Else Tr_isDataFlavorSupported = false End If End Function }} **クリップボードの内容 [#fd67b02c] OpenOffice.org 上でコピーを実行した後のクリップボードの内容には色々な種類があります。 特に、MimeType が application/x-openoffice-embed-source-xml;windows_formatname="Star Embed Source (XML)" のものはコピーした部分のみを含む ODF 形式のドキュメントになっています。 このクリップボードの内容を取得、保存してやるとドキュメントの一部のみで構成されたドキュメントが簡単に作成できます。うまくいくのは Spreadsheet、Drawing、Impress です。なぜか Writer ではうまくいきません。また、Chart や Formular などの内部で利用されているフォーマットの ODF 形式データも保存できます (普段は ODF ファイル内で見ることができます。うまくやればインポートできるようになるかも?)。 注: 以下のコードは Python-UNO で書かれています。 #code(python){{ import uno from com.sun.star.ui.dialogs.ExecutableDialogResults import OK as EDR_OK from com.sun.star.ui.dialogs.TemplateDescription import \ FILESAVE_SIMPLE as TD_FILESAVE_SIMPLE def saveclip(): ctx = XSCRIPTCONTEXT.getComponentContext() smgr = ctx.ServiceManager desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx) # create SystemClipboard service sc = smgr.createInstanceWithContext( "com.sun.star.datatransfer.clipboard.SystemClipboard",ctx) contents = sc.getContents() if not contents: message(ctx,"Clipboard is empty.") tf = u'application/x-openoffice-embed-source-xml;windows_formatname="Star Embed Source (XML)"' flavors = contents.getTransferDataFlavors() for f in flavors: if f.MimeType == tf: if contents.isDataFlavorSupported(f): data = contents.getTransferData(f) #byte_data = data.value url = get_fileurl(ctx,smgr) if url: sfa = smgr.createInstanceWithContext( "com.sun.star.ucb.SimpleFileAccess",ctx) out = sfa.openFileWrite(url) out.writeBytes(data) out.flush() out.closeOutput() return message(ctx,"This kind of the clipboard content is not supported.") def get_fileurl(ctx,smgr): ooofilepicker = smgr.createInstanceWithContext( "com.sun.star.ui.dialogs.FilePicker",ctx) ooofilepicker.initialize((TD_FILESAVE_SIMPLE,)) ooofilepicker.setMultiSelectionMode(False) ooofilepicker.appendFilter("All Files (*.*)","*.*") ooofilepicker.setCurrentFilter("All Files (*.*)") filepath = "" if ooofilepicker.execute() == EDR_OK: filepaths = ooofilepicker.getFiles() filepath = filepaths[0] return filepath else: return False # needs OOo 2.2 or later def message(ctx,msg="",title=""): desktop = ctx.ServiceManager.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx) frame = desktop.getCurrentFrame() win = frame.getContainerWindow() toolkit = win.getToolkit() rect = uno.createUnoStruct("com.sun.star.awt.Rectangle") msgbox = toolkit.createMessageBox( win,rect,"messbox",1,title,msg) msgbox.execute() g_exportedScripts = saveclip, }} |