Top > OOoBasic > Generic > Clipboard

*クリップボード [#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,

}}

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes