classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] FYI: New datatransfer example


From: Mark Wielaard
Subject: [cp-patches] FYI: New datatransfer example
Date: Fri, 12 Aug 2005 02:15:41 +0200

Hi,

Since I was working on getting datatransfer to work with the gtk+
clipboard I wrote a little example application to show it off.
The actual code to make it work isn't finalized yet. But I have a
prototype implementation that makes these examples work. So see it as a
little teaser :)

2005-08-11  Mark Wielaard  <address@hidden>

       * examples/gnu/classpath/examples/datatransfer/Demo.java:
       New example.

I was hoping that it would at least help the awt hackers.
Two things that I found was that I need to resize the window before
anything is visible and that (multiple) selections on a non-showing awt
List don't seem to work.

Cheers,

Mark

-- 
Escape the Java Trap with GNU Classpath!
http://www.gnu.org/philosophy/java-trap.html

Join the community at http://planet.classpath.org/
Index: examples/gnu/classpath/examples/datatransfer/Demo.java
===================================================================
RCS file: examples/gnu/classpath/examples/datatransfer/Demo.java
diff -N examples/gnu/classpath/examples/datatransfer/Demo.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ examples/gnu/classpath/examples/datatransfer/Demo.java      11 Aug 2005 
23:51:48 -0000
@@ -0,0 +1,457 @@
+/* Demo.java -- And example of copy/paste datatransfer
+   Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath examples.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA. */
+
+package gnu.classpath.examples.datatransfer;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.datatransfer.*;
+
+import java.io.*;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Random;
+
+class Demo
+  extends Frame
+  implements ActionListener
+{
+  public static void main(String args[])
+  {
+    new Demo();
+  }
+
+  private TextArea text;
+  private Button copyText;
+  private Button pasteText;
+
+  private ImageComponent image;
+  private Button copyImage;
+  private Button pasteImage;
+
+  private ObjectComponent object;
+  private Button copyObject;
+  private Button pasteObject;
+
+  private FilesComponent files;
+  private Button copyFiles;
+  private Button pasteFiles;
+
+  private Demo()
+  {
+    super("GNU Classpath datatransfer");
+    setLayout(new GridLayout(4, 1, 5, 5));
+    add(createTextPanel());
+    add(createImagePanel());
+    add(createObjectPanel());
+    add(createFilesPanel());
+    addWindowListener(new WindowAdapter ()
+      {
+       public void windowClosing (WindowEvent e)
+       {
+         dispose();
+       }
+      });
+    pack();
+    show();
+  }
+
+  private Panel createTextPanel()
+  {
+    Panel textPanel = new Panel();
+    textPanel.setLayout(new BorderLayout());
+    text = new TextArea("GNU Everywhere!",
+                       4, 40,
+                       TextArea.SCROLLBARS_VERTICAL_ONLY);
+    text.setEditable(false);
+    text.setEnabled(true);
+    Panel textButtons = new Panel();
+    textButtons.setLayout(new FlowLayout());
+    copyText = new Button("Copy text");
+    copyText.addActionListener(this);
+    pasteText = new Button("Paste text");
+    pasteText.addActionListener(this);
+    textButtons.add(copyText);
+    textButtons.add(pasteText);
+    textPanel.add(text, BorderLayout.CENTER);
+    textPanel.add(textButtons, BorderLayout.SOUTH);
+    return textPanel;
+  }
+
+  private Panel createImagePanel()
+  {
+    Panel imagePanel = new Panel();
+    imagePanel.setLayout(new BorderLayout());
+    URL imageurl = this.getClass()
+      .getResource("/gnu/classpath/examples/icons/big-fullscreen.png");
+    Image img = Toolkit.getDefaultToolkit().createImage(imageurl);
+    image = new ImageComponent(img);
+    Panel imageButtons = new Panel();
+    copyImage = new Button("Copy image");
+    copyImage.addActionListener(this);
+    pasteImage = new Button("Paste image");
+    pasteImage.addActionListener(this);
+    imageButtons.add(copyImage);
+    imageButtons.add(pasteImage);
+    imagePanel.add(image, BorderLayout.CENTER);
+    imagePanel.add(imageButtons, BorderLayout.SOUTH);
+    return imagePanel;
+  }
+
+  private Panel createObjectPanel()
+  {
+    Panel objectPanel = new Panel();
+    objectPanel.setLayout(new BorderLayout());
+    Random random = new Random();
+    int x = (byte) random.nextInt();
+    int y = (byte) random.nextInt();
+    object = new ObjectComponent(new Point(x, y));
+    Panel objectButtons = new Panel();
+    copyObject = new Button("Copy object");
+    copyObject.addActionListener(this);
+    pasteObject = new Button("Paste object");
+    pasteObject.addActionListener(this);
+    objectButtons.add(copyObject);
+    objectButtons.add(pasteObject);
+    objectPanel.add(object, BorderLayout.CENTER);
+    objectPanel.add(objectButtons, BorderLayout.SOUTH);
+    return objectPanel;
+  }
+  
+  private Panel createFilesPanel()
+  {
+    Panel filesPanel = new Panel();
+    filesPanel.setLayout(new BorderLayout());
+    files = new FilesComponent(new File(".").listFiles());
+    Panel filesButtons = new Panel();
+    copyFiles = new Button("Copy files");
+    copyFiles.addActionListener(this);
+    pasteFiles = new Button("Paste files");
+    pasteFiles.addActionListener(this);
+    filesButtons.add(copyFiles);
+    filesButtons.add(pasteFiles);
+    filesPanel.add(files, BorderLayout.CENTER);
+    filesPanel.add(filesButtons, BorderLayout.SOUTH);
+    return filesPanel;
+  }
+  
+  public void actionPerformed (ActionEvent evt)
+  {
+    Button b = (Button) evt.getSource();
+    Toolkit t = Toolkit.getDefaultToolkit();
+    Clipboard c = t.getSystemClipboard();
+    if (b == copyText)
+      c.setContents(new StringSelection(text.getText()), null);
+
+    if (b == pasteText)
+      {
+       String s = null;
+       try
+         {
+           s = (String) c.getData(DataFlavor.stringFlavor);
+         }
+       catch (UnsupportedFlavorException dfnse)
+         {
+         }
+       catch (IOException ioe)
+         {
+         }
+       catch (ClassCastException cce)
+         {
+         }
+       if (s == null)
+         t.beep();
+       else
+         text.setText(s);
+      }
+
+    if (b == copyImage)
+      c.setContents(new ImageSelection(image.getImage()), null);
+
+    if (b == pasteImage)
+      {
+       Image i = null;
+       try
+         {
+           i = (Image) c.getData(DataFlavor.imageFlavor);
+         }
+       catch (UnsupportedFlavorException dfnse)
+         {
+         }
+       catch (IOException ioe)
+         {
+         }
+       catch (ClassCastException cce)
+         {
+         }
+       if (i == null)
+         t.beep();
+       else
+         image.setImage(i);
+      }
+
+    if (b == copyObject)
+      c.setContents(new ObjectSelection(object.getObject()), null);
+
+    if (b == pasteObject)
+      {
+       Serializable o = null;
+       try
+         {
+           o = (Serializable) c.getData
+             (new DataFlavor(DataFlavor.javaSerializedObjectMimeType));
+         }
+       catch (UnsupportedFlavorException dfnse)
+         {
+         }
+       catch (IOException ioe)
+         {
+         }
+       catch (ClassCastException cce)
+         {
+         }
+       catch (ClassNotFoundException cnfe)
+         {
+         }
+       if (o == null)
+         t.beep();
+       else
+         object.setObject(o);
+      }
+
+    if (b == copyFiles)
+      c.setContents(new FilesSelection(files.getFiles()), null);
+
+    if (b == pasteFiles)
+      {
+       java.util.List fs = null;
+       try
+         {
+           fs = (java.util.List) c.getData(DataFlavor.javaFileListFlavor);
+         }
+       catch (UnsupportedFlavorException dfnse)
+         {
+         }
+       catch (IOException ioe)
+         {
+         }
+       catch (ClassCastException cce)
+         {
+         }
+       if (fs == null)
+         t.beep();
+       else
+         files.setFiles(fs);
+      }
+  }
+
+  static class ImageComponent extends Component
+  {
+    private Image image;
+
+    ImageComponent(Image image)
+    {
+      setSize(120, 120);
+      setImage(image);
+    }
+
+    Image getImage()
+    {
+      return image;
+    }
+
+    void setImage(Image image)
+    {
+      this.image = image;
+      repaint();
+    }
+
+    public void paint(Graphics g)
+    {
+      g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
+    }
+  }
+
+  static class ObjectComponent extends TextArea
+  {
+    private Serializable object;
+
+    ObjectComponent(Serializable object)
+    {
+      super("", 2, 40, TextArea.SCROLLBARS_NONE);
+      setEditable(false);
+      setEnabled(false);
+      setObject(object);
+    }
+
+    Serializable getObject()
+    {
+      return object;
+    }
+
+    void setObject(Serializable object)
+    {
+      this.object = object;
+      setText("Class: " + object.getClass().getName()
+             + "\n"
+             + "toString(): " + object.toString());
+      repaint();
+    }
+  }
+
+  static class FilesComponent extends List
+  {
+    private File[] files;
+
+    FilesComponent(File[] files)
+    {
+      super(4, true);
+      setFiles(files);
+    }
+
+    File[] getFiles()
+    {
+      String[] strings = getSelectedItems();
+      if (strings == null || strings.length == 0)
+       return (File[]) files.clone();
+
+      File[] fs = new File[strings.length];
+      for (int i = 0; i < strings.length; i++)
+       fs[i] = new File(strings[i]);
+      return fs;
+    }
+
+    void setFiles(File[] files)
+    {
+      this.files = files;
+      removeAll();
+      for (int i = 0; i < files.length; i++)
+       {
+         addItem(files[i].toString());
+         select(i);
+       }
+    }
+
+    void setFiles(java.util.List list)
+    {
+      File[] fs = new File[list.size()];
+      int i = 0;
+      Iterator it = list.iterator();
+      while (it.hasNext())
+       fs[i++] = (File) it.next();
+
+      setFiles(fs);
+    }
+  }
+    
+  static class ImageSelection implements Transferable
+  {
+    private final Image img;
+
+    ImageSelection(Image img)
+    {
+      this.img = img;
+    }
+
+    static DataFlavor[] flavors = new DataFlavor[] { DataFlavor.imageFlavor };
+    public DataFlavor[] getTransferDataFlavors()
+    {
+      return (DataFlavor[]) flavors.clone();
+    }
+
+    public boolean isDataFlavorSupported(DataFlavor flavor)
+    {
+      return flavor.equals(DataFlavor.imageFlavor);
+    }
+
+    public Object getTransferData(DataFlavor flavor)
+      throws UnsupportedFlavorException
+    {
+      if (!isDataFlavorSupported(flavor))
+       throw new UnsupportedFlavorException(flavor);
+
+      return img;
+    }
+  }
+
+  static class ObjectSelection implements Transferable
+  {
+    private final Serializable obj;
+
+    ObjectSelection(Serializable obj)
+    {
+      this.obj = obj;
+    }
+
+    static DataFlavor objFlavor = new DataFlavor(Serializable.class,
+                                                "Serialized Object");
+    static DataFlavor[] flavors = new DataFlavor[] { objFlavor };
+    public DataFlavor[] getTransferDataFlavors()
+    {
+      return (DataFlavor[]) flavors.clone();
+    }
+
+    public boolean isDataFlavorSupported(DataFlavor flavor)
+    {
+      return flavor.equals(objFlavor);
+    }
+
+    public Object getTransferData(DataFlavor flavor)
+      throws UnsupportedFlavorException
+    {
+      if (!isDataFlavorSupported(flavor))
+       throw new UnsupportedFlavorException(flavor);
+
+      return obj;
+    }
+  }
+
+  static class FilesSelection implements Transferable
+  {
+    private final File[] files;
+
+    FilesSelection(File[] files)
+    {
+      this.files = files;
+    }
+
+    static DataFlavor[] flavors = new DataFlavor[]
+      { DataFlavor.javaFileListFlavor };
+    public DataFlavor[] getTransferDataFlavors()
+    {
+      return (DataFlavor[]) flavors.clone();
+    }
+
+    public boolean isDataFlavorSupported(DataFlavor flavor)
+    {
+      return flavor.equals(DataFlavor.javaFileListFlavor);
+    }
+
+    public Object getTransferData(DataFlavor flavor)
+      throws UnsupportedFlavorException
+    {
+      if (!isDataFlavorSupported(flavor))
+       throw new UnsupportedFlavorException(flavor);
+
+      return Arrays.asList(files);
+    }
+  }
+}

Attachment: signature.asc
Description: This is a digitally signed message part


reply via email to

[Prev in Thread] Current Thread [Next in Thread]