package gnu.java.awt.peer.gtk;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
public class GtkClipboard extends Clipboard
{
final static int SELECTION_RECEIVED_TIMEOUT = 5000;
static String selection;
static Object selectionLock = new Object ();
static boolean hasSelection = false;
protected
GtkClipboard ()
{
super ("System Clipboard");
initNativeState ();
}
public Transferable
getContents (Object requestor)
{
synchronized (this)
{
if (hasSelection)
return contents;
}
synchronized (selectionLock)
{
requestStringConversion ();
try
{
selectionLock.wait (SELECTION_RECEIVED_TIMEOUT);
}
catch (InterruptedException e)
{
return null;
}
return (selection == null) ? null : new StringSelection (selection);
}
}
void
stringSelectionReceived (String newSelection)
{
synchronized (selectionLock)
{
selection = newSelection;
selectionLock.notify ();
}
}
synchronized String
stringSelectionHandler () throws IOException
{
String selection = null;
try {
if (contents.isDataFlavorSupported (DataFlavor.stringFlavor))
selection = (String)contents.getTransferData (DataFlavor.stringFlavor);
else if (contents.isDataFlavorSupported (DataFlavor.plainTextFlavor))
{
StringBuffer sbuf = new StringBuffer ();
InputStreamReader reader;
char readBuf[] = new char[512];
int numChars;
reader = new InputStreamReader
((InputStream)
contents.getTransferData (DataFlavor.plainTextFlavor), "UNICODE");
while (true)
{
numChars = reader.read (readBuf);
if (numChars == -1)
break;
sbuf.append (readBuf, 0, numChars);
}
selection = new String (sbuf);
}
} catch (Exception e) { }
return selection;
}
public synchronized void
setContents (Transferable contents, ClipboardOwner owner)
{
selectionGet ();
this.contents = contents;
this.owner = owner;
hasSelection = true;
}
synchronized
void selectionClear ()
{
hasSelection = false;
if (owner != null)
{
owner.lostOwnership (this, contents);
owner = null;
contents = null;
}
}
native void initNativeState ();
native static void requestStringConversion ();
native static void selectionGet ();
}