?? clipboard.java
字號:
/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/package org.eclipse.swt.dnd;import org.eclipse.swt.*;import org.eclipse.swt.widgets.*;import org.eclipse.swt.internal.win32.*;import org.eclipse.swt.internal.ole.win32.*;/** * The <code>Clipboard</code> provides a mechanism for transferring data from one * application to another or within an application. * * <p>IMPORTANT: This class is <em>not</em> intended to be subclassed.</p> */public class Clipboard { private Display display; // ole interfaces private COMObject iDataObject; private int refCount; private Transfer[] transferAgents = new Transfer[0]; private Object[] data = new Object[0]; private int CFSTR_PREFERREDDROPEFFECT;/** * Constructs a new instance of this class. Creating an instance of a Clipboard * may cause system resources to be allocated depending on the platform. It is therefore * mandatory that the Clipboard instance be disposed when no longer required. * * @param display the display on which to allocate the clipboard * * @exception SWTException <ul> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li> * </ul> * * @see Clipboard#dispose * @see Clipboard#checkSubclass */public Clipboard(Display display) { checkSubclass (); if (display == null) { display = Display.getCurrent(); if (display == null) { display = Display.getDefault(); } } if (display.getThread() != Thread.currentThread()) { DND.error(SWT.ERROR_THREAD_INVALID_ACCESS); } this.display = display; TCHAR chFormatName = new TCHAR(0, "Preferred DropEffect", true); //$NON-NLS-1$ CFSTR_PREFERREDDROPEFFECT = COM.RegisterClipboardFormat(chFormatName); createCOMInterfaces(); this.AddRef();}/** * Checks that this class can be subclassed. * <p> * The SWT class library is intended to be subclassed * only at specific, controlled points. This method enforces this * rule unless it is overridden. * </p><p> * <em>IMPORTANT:</em> By providing an implementation of this * method that allows a subclass of a class which does not * normally allow subclassing to be created, the implementer * agrees to be fully responsible for the fact that any such * subclass will likely fail between SWT releases and will be * strongly platform specific. No support is provided for * user-written classes which are implemented in this fashion. * </p><p> * The ability to subclass outside of the allowed SWT classes * is intended purely to enable those not on the SWT development * team to implement patches in order to get around specific * limitations in advance of when those limitations can be * addressed by the team. Subclassing should not be attempted * without an intimate and detailed understanding of the hierarchy. * </p> * * @exception SWTException <ul> * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li> * </ul> */protected void checkSubclass () { String name = getClass().getName (); String validName = Clipboard.class.getName(); if (!validName.equals(name)) { DND.error (SWT.ERROR_INVALID_SUBCLASS); }}/** * Throws an <code>SWTException</code> if the receiver can not * be accessed by the caller. This may include both checks on * the state of the receiver and more generally on the entire * execution context. This method <em>should</em> be called by * widget implementors to enforce the standard SWT invariants. * <p> * Currently, it is an error to invoke any method (other than * <code>isDisposed()</code>) on a widget that has had its * <code>dispose()</code> method called. It is also an error * to call widget methods from any thread that is different * from the thread that created the widget. * </p><p> * In future releases of SWT, there may be more or fewer error * checks and exceptions may be thrown for different reasons. * </p> * * @exception SWTException <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> * </ul> */protected void checkWidget () { Display display = this.display; if (display == null) DND.error (SWT.ERROR_WIDGET_DISPOSED); if (display.getThread() != Thread.currentThread ()) DND.error (SWT.ERROR_THREAD_INVALID_ACCESS); if (display.isDisposed()) DND.error(SWT.ERROR_WIDGET_DISPOSED);}/** * Disposes of the operating system resources associated with the clipboard. * The data will still be available on the system clipboard after the dispose * method is called. * * <p>NOTE: On some platforms the data will not be available once the application * has exited or the display has been disposed.</p> * * @exception SWTException <ul> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> * </ul> */public void dispose () { if (isDisposed()) return; if (display.getThread() != Thread.currentThread()) DND.error(SWT.ERROR_THREAD_INVALID_ACCESS); if (COM.OleIsCurrentClipboard(this.iDataObject.getAddress()) == COM.S_OK) { COM.OleFlushClipboard(); } this.Release(); display = null;}/** * Retrieve the data of the specified type currently available on the system clipboard. Refer to the * specific subclass of <code>Tramsfer</code> to determine the type of object returned. * * <p>The following snippet shows text and RTF text being retrieved from the clipboard:</p> * * <code><pre> * Clipboard clipboard = new Clipboard(display); * TextTransfer textTransfer = TextTransfer.getInstance(); * String textData = (String)clipboard.getContents(textTransfer); * if (textData != null) System.out.println("Text is "+textData); * RTFTransfer rtfTransfer = RTFTransfer.getInstance(); * String rtfData = (String)clipboard.getContents(rtfTransfer); * if (rtfData != null) System.out.println("RTF Text is "+rtfData); * clipboard.dispose(); * </code></pre> * * @see Transfer * * @param transfer the transfer agent for the type of data being requested * * @return the data obtained from the clipboard or null if no data of this type is available * * @exception SWTException <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> * </ul> * @exception IllegalArgumentException <ul> * <li>ERROR_NULL_ARGUMENT - if transfer is null</li> * </ul> */public Object getContents(Transfer transfer) { checkWidget(); if (transfer == null) DND.error(SWT.ERROR_NULL_ARGUMENT); /* * Bug in Windows. When a new application takes control * of the clipboard, other applications may open the * clipboard to determine if they want to record the * clipoard updates. When this happens, the clipboard * can not be accessed until the other application is * finished. To allow the other applications to release * the clipboard, use PeekMessage() to enable cross thread * message sends. */ int[] ppv = new int[1]; int retryCount = 0; int result = COM.OleGetClipboard(ppv); while (result != COM.S_OK && retryCount++ < 10) { try { Thread.sleep(50);} catch (Throwable t) {} MSG msg = new MSG(); COM.PeekMessage (msg, 0, 0, 0, OS.PM_NOREMOVE | OS.PM_NOYIELD); result = COM.OleGetClipboard(ppv); } if (result != COM.S_OK) return null; IDataObject dataObject = new IDataObject(ppv[0]); try { TransferData[] allowed = transfer.getSupportedTypes(); for (int i = 0; i < allowed.length; i++) { if (dataObject.QueryGetData(allowed[i].formatetc) == COM.S_OK) { TransferData data = allowed[i]; data.pIDataObject = ppv[0]; return transfer.nativeToJava(data); } } } finally { dataObject.Release(); } return null; // No data available for this transfer}/** * Returns <code>true</code> if the clipboard has been disposed, * and <code>false</code> otherwise. * <p> * This method gets the dispose state for the clipboard. * When a clipboard has been disposed, it is an error to * invoke any other method using the clipboard. * </p> * * @return <code>true</code> when the widget is disposed and <code>false</code> otherwise * * @since 3.0 */public boolean isDisposed () { return (display == null);}/** * Place data of the specified type on the system clipboard. More than one type of * data can be placed on the system clipboard at the same time. Setting the data * clears any previous data of the same type from the system clipboard and also * clears data of any other type currently on the system clipboard. * * <p>NOTE: On some platforms, the data is immediately copied to the system * clipboard but on other platforms it is provided upon request. As a result, if the * application modifes the data object it has set on the clipboard, that modification * may or may not be available when the data is subsequently requested.</p> * * <p>The following snippet shows text and RTF text being set on the clipboard:</p> * * <code><pre> * Clipboard clipboard = new Clipboard(display); * String textData = "Hello World"; * String rtfData = "{\\rtf1\\b\\i Hello World}"; * TextTransfer textTransfer = TextTransfer.getInstance(); * RTFTransfer rtfTransfer = RTFTransfer.getInstance(); * clipboard.setContents(new Object[]{textData, rtfData}, new Transfer[]{textTransfer, rtfTransfer}); * clipboard.dispose(); * </code></pre> * * @param data the data to be set in the clipboard * @param dataTypes the transfer agents that will convert the data to its platform * specific format; each entry in the data array must have a corresponding dataType * * @exception IllegalArgumentException <ul> * <li>ERROR_INVALID_ARGUMENT - if data is null or datatypes is null * or the length of data is not the same as the length of dataTypes</li> * </ul> * @exception SWTError <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> * <li>ERROR_CANNOT_SET_CLIPBOARD - if the clipboard is locked or otherwise unavailable</li>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -