diff --git a/.gitignore b/.gitignore index d51d460..ebac78e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ hs_err_pid* # User -.idea \ No newline at end of file +.idea +target \ No newline at end of file diff --git a/pom.xml b/pom.xml index c3453d4..5e3e995 100644 --- a/pom.xml +++ b/pom.xml @@ -1,34 +1,34 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - me.goudham - MyClipboard - 1.0-SNAPSHOT - MyClipboard + me.goudham + MyClipboard + 1.0-SNAPSHOT + MyClipboard - - UTF-8 - 11 - 11 - + + UTF-8 + 15 + 15 + - - - junit - junit - 4.11 - test - - - org.jetbrains - annotations - RELEASE - compile - - + + + junit + junit + 4.11 + test + + + org.jetbrains + annotations + RELEASE + compile + + diff --git a/src/main/java/me/goudham/ClipboardListener.java b/src/main/java/me/goudham/ClipboardListener.java index 6582155..7299a38 100644 --- a/src/main/java/me/goudham/ClipboardListener.java +++ b/src/main/java/me/goudham/ClipboardListener.java @@ -1,5 +1,6 @@ package me.goudham; +import java.awt.Dimension; import java.awt.Image; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; @@ -7,10 +8,19 @@ import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.image.BufferedImage; import java.io.IOException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import me.goudham.listener.ClipboardEvent; +import me.goudham.model.MyClipboardContent; +import me.goudham.util.ClipboardUtils; import org.jetbrains.annotations.NotNull; +import static me.goudham.util.Contents.IMAGE; +import static me.goudham.util.Contents.STRING; + public class ClipboardListener extends Thread implements ClipboardOwner { private final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); private @NotNull ClipboardEvent clipboardEvent; @@ -36,7 +46,7 @@ public class ClipboardListener extends Thread implements ClipboardOwner { String stringContent = (String) newClipboardContents.getTransferData(DataFlavor.stringFlavor); clipboardEvent.onCopyString(stringContent); } else if (oldClipboard.isDataFlavorAvailable(DataFlavor.imageFlavor)) { - Image imageContent = (Image) newClipboardContents.getTransferData(DataFlavor.imageFlavor); + BufferedImage imageContent = ClipboardUtils.convertToBufferedImage((Image) newClipboardContents.getTransferData(DataFlavor.imageFlavor)); clipboardEvent.onCopyImage(imageContent); } } catch (UnsupportedFlavorException | IOException ignored) { } @@ -56,9 +66,33 @@ public class ClipboardListener extends Thread implements ClipboardOwner { } public void run() { - Transferable currentClipboardContents = clipboard.getContents(currentThread()); - processContents(clipboard, currentClipboardContents); - regainOwnership(clipboard, currentClipboardContents); + Transferable oldClipboardContents = clipboard.getContents(null); + final MyClipboardContent[] myOldClipboardContentsArray = new MyClipboardContent[]{ ClipboardUtils.getClipboardContents(oldClipboardContents, clipboard) }; + + ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + executor.scheduleAtFixedRate(() -> { + Transferable newClipboardContents = clipboard.getContents(null); + MyClipboardContent myNewClipboardContents = new MyClipboardContent<>(""); + + try { + if (STRING.isAvailable(clipboard)) { + myNewClipboardContents.setContent(newClipboardContents.getTransferData(STRING.getDataFlavor())); + if (!myNewClipboardContents.getContent().equals(myOldClipboardContentsArray[0].getContent())) { + clipboardEvent.onCopyString((String) myNewClipboardContents.getContent()); + myOldClipboardContentsArray[0].setContent(myNewClipboardContents.getContent()); + } + } else if (IMAGE.isAvailable(clipboard)) { + BufferedImage bufferedImage = ClipboardUtils.convertToBufferedImage((Image) newClipboardContents.getTransferData(IMAGE.getDataFlavor())); + myNewClipboardContents.setContent(new Dimension(bufferedImage.getWidth(), bufferedImage.getHeight())); + if (!myNewClipboardContents.getContent().equals(myOldClipboardContentsArray[0].getContent())) { + clipboardEvent.onCopyImage(bufferedImage); + myOldClipboardContentsArray[0].setContent(myNewClipboardContents.getContent()); + } + } + } catch (UnsupportedFlavorException | IOException exp) { + exp.printStackTrace(); + } + }, 0, 350, TimeUnit.MILLISECONDS); } public void setClipboardEvent(@NotNull ClipboardEvent clipboardEvent) { diff --git a/src/main/java/me/goudham/listener/ClipboardEvent.java b/src/main/java/me/goudham/listener/ClipboardEvent.java index e4a76d6..02ac7ad 100644 --- a/src/main/java/me/goudham/listener/ClipboardEvent.java +++ b/src/main/java/me/goudham/listener/ClipboardEvent.java @@ -1,8 +1,8 @@ package me.goudham.listener; -import java.awt.Image; +import java.awt.image.BufferedImage; public interface ClipboardEvent { - void onCopyString(String stringContent); - void onCopyImage(Image imageContent); + void onCopyString(String stringContent); + void onCopyImage(BufferedImage imageContent); } diff --git a/src/main/java/me/goudham/model/MyClipboardContent.java b/src/main/java/me/goudham/model/MyClipboardContent.java index 60ac086..1bb0d3e 100644 --- a/src/main/java/me/goudham/model/MyClipboardContent.java +++ b/src/main/java/me/goudham/model/MyClipboardContent.java @@ -1,23 +1,32 @@ package me.goudham.model; -import java.awt.Image; +import java.util.Objects; public class MyClipboardContent { - private T content; + private T content; - public MyClipboardContent(T content) { - this.content = content; - } + public MyClipboardContent(T content) { + this.content = content; + } - public void setContent(Object content) { - this.content = (T) content; - } + public void setContent(Object content) { + this.content = (T) content; + } - public T getContent() { - return content; - } + public T getContent() { + return content; + } - public Image getImage() { - return (Image) content; - } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MyClipboardContent that = (MyClipboardContent) o; + return Objects.equals(content, that.content); + } + + @Override + public int hashCode() { + return Objects.hash(content); + } } diff --git a/src/main/java/me/goudham/util/ClipboardUtils.java b/src/main/java/me/goudham/util/ClipboardUtils.java new file mode 100644 index 0000000..71f274f --- /dev/null +++ b/src/main/java/me/goudham/util/ClipboardUtils.java @@ -0,0 +1,44 @@ +package me.goudham.util; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.image.BufferedImage; +import java.io.IOException; +import me.goudham.model.MyClipboardContent; + +import static me.goudham.util.Contents.IMAGE; +import static me.goudham.util.Contents.STRING; + +public class ClipboardUtils { + + public static MyClipboardContent getClipboardContents(Transferable contents, Clipboard clipboard) { + MyClipboardContent myClipboardContent = new MyClipboardContent<>(""); + + try { + if (STRING.isAvailable(clipboard)) { + myClipboardContent.setContent(contents.getTransferData(STRING.getDataFlavor())); + } else if (IMAGE.isAvailable(clipboard)) { + BufferedImage bufferedImage = convertToBufferedImage((Image) contents.getTransferData(IMAGE.getDataFlavor())); + myClipboardContent.setContent(new Dimension(bufferedImage.getWidth(), bufferedImage.getHeight())); + } + } catch (UnsupportedFlavorException | IOException exp) { + exp.printStackTrace(); + } + + return myClipboardContent; + } + + public static BufferedImage convertToBufferedImage(Image image) { + BufferedImage newImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); + + Graphics2D graphics = newImage.createGraphics(); + graphics.drawImage(image, 0, 0, null); + graphics.dispose(); + + return newImage; + } +} diff --git a/src/main/java/me/goudham/util/Contents.java b/src/main/java/me/goudham/util/Contents.java new file mode 100644 index 0000000..79b94ab --- /dev/null +++ b/src/main/java/me/goudham/util/Contents.java @@ -0,0 +1,37 @@ +package me.goudham.util; + +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; + +public enum Contents { + STRING(DataFlavor.stringFlavor) { + @Override + public boolean isAvailable(Clipboard clipboard) { + return clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor); + } + }, + IMAGE(DataFlavor.imageFlavor) { + @Override + public boolean isAvailable(Clipboard clipboard) { + return clipboard.isDataFlavorAvailable(DataFlavor.imageFlavor); + } + }, + FILELIST(DataFlavor.javaFileListFlavor) { + @Override + public boolean isAvailable(Clipboard clipboard) { + return clipboard.isDataFlavorAvailable(DataFlavor.javaFileListFlavor); + } + }; + + private final DataFlavor dataFlavor; + + Contents(DataFlavor dataFlavor) { + this.dataFlavor = dataFlavor; + } + + public DataFlavor getDataFlavor() { + return dataFlavor; + } + + public abstract boolean isAvailable(Clipboard clipboard); +} diff --git a/src/main/java/me/goudham/view/ClipboardView.java b/src/main/java/me/goudham/view/ClipboardView.java index 7cb7bfc..2624c6a 100644 --- a/src/main/java/me/goudham/view/ClipboardView.java +++ b/src/main/java/me/goudham/view/ClipboardView.java @@ -2,6 +2,7 @@ package me.goudham.view; import java.awt.Dimension; import java.awt.Image; +import java.awt.image.BufferedImage; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; @@ -99,7 +100,11 @@ public class ClipboardView implements ClipboardEvent { } @Override - public void onCopyImage(Image imageContent) { - imageIconLabel.setIcon(new ImageIcon(new ImageIcon(imageContent).getImage().getScaledInstance(500, 250, Image.SCALE_SMOOTH))); + public void onCopyImage(BufferedImage imageContent) { + if (imageContent.getWidth() > 1000 || imageContent.getHeight() > 500) { + imageIconLabel.setIcon(new ImageIcon(new ImageIcon(imageContent).getImage().getScaledInstance(1000, 300, Image.SCALE_SMOOTH))); + } else { + imageIconLabel.setIcon(new ImageIcon(imageContent)); + } } }