Top > OOoBasic > Generic > Clipboard

クリップボード Edit

コピー、ペースト関連。

mime-type は Iana に登録されているもの http://www.iana.org/assignments/media-types/

システムクリップボード Edit

内容の変更 Edit

デスクトップ環境のクリップボードの内容を変更します。

クリップボードの要求に対して返す com.sun.star.datatransfer.XTransferable インターフェースを用意します。

コードのあるライブラリのあるドキュメントを閉じるとクリップボードの要求が通らなくなります。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
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

内容の取得 Edit

システムクリップボード内の内容を取得します。内容の種類を判定しなければいけません。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
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

ドキュメント Edit

ドキュメントのみのデータ取り扱いがあります。ドキュメントコントローラの com.sun.star.datatransfer.XTransferableSupplier インターフェースの insertTransferable メソッドを呼び出すと即時 (コピーおよび) 貼り付けされます。

効果は一度のみでシステムクリップボードなどには関与しません。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
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

クリップボードの内容 Edit

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 で書かれています。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
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