package net.mms_projects.copy_it.clipboard_backends; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import net.mms_projects.copy_it.ClipboardListener; import net.mms_projects.copy_it.PollingServiceInterface; import net.mms_projects.copy_it.clipboard_services.CopyServiceInterface; import net.mms_projects.copy_it.clipboard_services.PasteServiceInterface; import net.mms_projects.copy_it.ui.swt.SwtUtils; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.widgets.Display; public class SwtBackend implements CopyServiceInterface, PasteServiceInterface, PollingServiceInterface { public static String SERVICE_NAME = "swt"; private Clipboard clipboard; private ClipboardListener listener; private boolean pollingEnabled; private String currentContent; private Executor executor; public SwtBackend(final ClipboardListener listener) { this.listener = listener; this.clipboard = new Clipboard(Display.getDefault()); new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (!pollingEnabled) { continue; } String newContent = getContent(); if (newContent != null) { /* * Check if the clipboard content is really new. */ if (!newContent.equals(currentContent)) { /* * If so update the current content and broadcast to * all the listeners */ currentContent = newContent; listener.onClipboardContentChange(newContent); } } } } }).start(); } @Override public void requestSet(final String text) { this.getExecutor().execute(new Runnable() { @Override public void run() { setContent(text); } }); } @Override public String getContent() { final CountDownLatch countDownLatch = new CountDownLatch(1); final String[] content = new String[1]; Runnable task = new Runnable() { @Override public void run() { TextTransfer transfer = TextTransfer.getInstance(); String data = (String) clipboard.getContents(transfer); content[0] = data; countDownLatch.countDown(); } }; if (SwtUtils.isUIThread()) { task.run(); } else { Display.getDefault().asyncExec(task); } try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); // To change body of catch statement use File | // Settings | File Templates. } return content[0]; } @Override public void setContent(final String content) { if (content == null) { return; } final CountDownLatch countDownLatch = new CountDownLatch(1); Runnable task = new Runnable() { @Override public void run() { TextTransfer textTransfer = TextTransfer.getInstance(); clipboard.setContents(new Object[] { content }, new Transfer[] { textTransfer }); currentContent = content; countDownLatch.countDown(); } }; if (SwtUtils.isUIThread()) { task.run(); } else { Display.getDefault().asyncExec(task); } try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); // To change body of catch statement use File | // Settings | File Templates. } } @Override public String getServiceName() { return SERVICE_NAME; } @Override public Executor getExecutor() { return this.executor; } @Override public void setExecutor(Executor executor) { this.executor = executor; } @Override public void activatePaste() { // TODO Auto-generated method stub } @Override public void deactivatePaste() { // TODO Auto-generated method stub } @Override public boolean isPasteActivated() { // TODO Auto-generated method stub return false; } @Override public void activateCopy() { // TODO Auto-generated method stub } @Override public void deactivateCopy() { // TODO Auto-generated method stub } @Override public boolean isCopyActivated() { // TODO Auto-generated method stub return false; } @Override public void activatePolling() { this.pollingEnabled = true; } @Override public void deactivatePolling() { this.pollingEnabled = false; } @Override public boolean isPollingActivated() { return this.pollingEnabled; } }