Initial revision

From-SVN: r104578
This commit is contained in:
Tom Tromey
2005-09-23 19:36:46 +00:00
parent acff2da93c
commit 9b044d1951
495 changed files with 82760 additions and 0 deletions
@@ -0,0 +1,29 @@
# @configure_input@
prefix = @prefix@
exec_prefix = @exec_prefix@
includedir = @includedir@
libdir = @libdir@
pkglibdir = $(libdir)/@PACKAGE@
all: gnu/classpath/examples/jawt/DemoJAWT.class libDemoJAWT.so
@echo "RUN with:"
@echo " LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:.:$(pkglibdir) jamvm \\"
@echo " gnu.classpath.examples.jawt.DemoJAWT"
gnu/classpath/examples/jawt/DemoJAWT.class: gnu/classpath/examples/jawt/DemoJAWT.java
gcj -C gnu/classpath/examples/jawt/DemoJAWT.java
DemoJAWT.h: gnu/classpath/examples/jawt/DemoJAWT.class
gcjh -jni gnu.classpath.examples.jawt.DemoJAWT -o DemoJAWT.h
libDemoJAWT.so: gnu/classpath/examples/jawt/DemoJAWT.c DemoJAWT.h
gcc -g -O0 -Wall -I. -I/usr/X11R6/include -L. -L/usr/X11R6/lib \
-I$(includedir) -L$(pkglibdir) \
-lX11 -ljawtgnu -shared -o libDemoJAWT.so \
gnu/classpath/examples/jawt/DemoJAWT.c
clean:
rm -f DemoJAWT.h
rm -f gnu/classpath/examples/jawt/DemoJAWT*.class
rm -f libDemoJAWT.so
@@ -0,0 +1,652 @@
/* 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;
/**
* An example how datatransfer works for copying and pasting data to
* and from other programs.
*/
class Demo
extends Frame
implements ActionListener, ItemListener, FlavorListener
{
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 FlavorsComponent flavors;
private FlavorDetailsComponent details;
private Demo()
{
super("GNU Classpath datatransfer");
/* Add all the different panel to the main window in one row. */
setLayout(new GridLayout(5, 1, 10, 10));
add(createTextPanel());
add(createImagePanel());
add(createObjectPanel());
add(createFilesPanel());
add(createFlavorsPanel());
/* Add listeners for the various buttons and events we are
interested in. */
addWindowListener(new WindowAdapter ()
{
public void windowClosing (WindowEvent e)
{
dispose();
}
});
flavors.addItemListener(this);
Toolkit t = Toolkit.getDefaultToolkit();
Clipboard c = t.getSystemClipboard();
c.addFlavorListener(this);
/* Show time! */
pack();
show();
}
/**
* The Text Panel will show simple text that can be copied and pasted.
*/
private Panel createTextPanel()
{
Panel textPanel = new Panel();
textPanel.setLayout(new BorderLayout());
text = new TextArea("GNU Everywhere!",
2, 80,
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;
}
/**
* The Image Panel shows an image that can be copied to another
* program or be replaced by pasting in an image from another
* application.
*/
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;
}
/**
* The Object Panel holds a simple (Point) object that can be copied
* and pasted to another program that supports exchanging serialized
* objects.
*/
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;
}
/**
* The Files Panel shows the files from the current working
* directory. They can be copied and pasted between other
* applications that support the exchange of file lists.
*/
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;
}
/**
* The Flavors Panel shows the different formats (mime-types) that
* data on the clipboard is available in. By clicking on a flavor
* details about the representation class and object is given.
*/
private Panel createFlavorsPanel()
{
Panel flavorsPanel = new Panel();
flavorsPanel.setLayout(new BorderLayout());
Label flavorsHeader = new Label("Flavors on clipboard:");
Toolkit t = Toolkit.getDefaultToolkit();
Clipboard c = t.getSystemClipboard();
DataFlavor[] dataflavors = c.getAvailableDataFlavors();
flavors = new FlavorsComponent(dataflavors);
details = new FlavorDetailsComponent(null);
flavorsPanel.add(flavorsHeader, BorderLayout.NORTH);
flavorsPanel.add(flavors, BorderLayout.CENTER);
flavorsPanel.add(details, BorderLayout.SOUTH);
return flavorsPanel;
}
/**
* FlavorListener implementation that updates the Flavors Panel
* whenever a change in the mime-types available has been detected.
*/
public void flavorsChanged(FlavorEvent event)
{
Toolkit t = Toolkit.getDefaultToolkit();
Clipboard c = t.getSystemClipboard();
DataFlavor[] dataflavors = c.getAvailableDataFlavors();
flavors.setFlavors(dataflavors);
details.setDataFlavor(null);
}
/**
* ItemChangeListener implementation that updates the flavor details
* whenever the user selects a different representation of the data
* available on the clipboard.
*/
public void itemStateChanged(ItemEvent evt)
{
DataFlavor df = null;
String s = flavors.getSelectedItem();
if (s != null)
{
try
{
df = new DataFlavor(s);
}
catch (ClassNotFoundException cnfe)
{
cnfe.printStackTrace();
}
}
details.setDataFlavor(df);
}
/**
* ActionListener implementations that will copy or past data
* to/from the clipboard when the user requests that for the text,
* image, object of file component.
*/
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(ObjectSelection.objFlavor);
}
catch (UnsupportedFlavorException dfnse)
{
}
catch (IOException ioe)
{
}
catch (ClassCastException cce)
{
}
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);
}
}
/**
* Simple awt component that shows an settable image.
*/
static class ImageComponent extends Component
{
private Image image;
ImageComponent(Image image)
{
setSize(20, 20);
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);
}
}
/**
* Simple awt component that shows a settable Serializable object.
*/
static class ObjectComponent extends TextArea
{
private Serializable object;
ObjectComponent(Serializable object)
{
super("", 2, 80, 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();
}
}
/**
* Simple awt component that shows a settable list of Files.
*/
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);
}
}
/**
* Simple awt component that shows a settable list of DataFlavors.
*/
static class FlavorsComponent extends List
{
FlavorsComponent(DataFlavor[] flavors)
{
super(4);
setFlavors(flavors);
}
void setFlavors(DataFlavor[] flavors)
{
removeAll();
for (int i = 0; i < flavors.length; i++)
{
addItem(flavors[i].getMimeType());
}
}
}
/**
* Simple awt component that shows the details for and an object as
* found on the system clipboard as represented by a given
* DataFlavor.
*/
static class FlavorDetailsComponent extends TextArea
{
private DataFlavor df;
FlavorDetailsComponent(DataFlavor df)
{
super("", 2, 80, TextArea.SCROLLBARS_NONE);
setEditable(false);
setEnabled(false);
setDataFlavor(df);
}
void setDataFlavor(DataFlavor df)
{
if (df == this.df
|| (df != null && df.equals(this.df)))
return;
this.df = df;
if (df == null)
setText("No flavor selected");
else
{
Object o = null;
Throwable exception = null;
try
{
Toolkit t = Toolkit.getDefaultToolkit();
Clipboard c = t.getSystemClipboard();
o = c.getData(df);
}
catch (Throwable t)
{
exception = t;
}
if (o != null)
{
setText("Data: " + o.getClass().getName()
+ "\n"
+ o);
}
else
{
setText("Error retrieving: " + df
+ "\n"
+ exception != null ? exception.toString() : "");
}
}
repaint();
}
}
/**
* Helper class to put an Image on a clipboard as
* DataFlavor.imageFlavor.
*/
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;
}
}
/**
* Helper class to put an Object on a clipboard as Serializable
* object.
*/
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;
}
}
/**
* Helper class to put a List of Files on the clipboard as
* DataFlavor.javaFileListFlavor.
*/
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);
}
}
}
@@ -0,0 +1,150 @@
/* DemoJAWT.c -- native portion of AWT Native Interface demo
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. */
#include "DemoJAWT.h"
#include "jawt_md.h"
#include <string.h>
JNIEXPORT void JNICALL
Java_gnu_classpath_examples_jawt_DemoJAWT_paintIt (JNIEnv* env,
jobject canvas,
jobject graphics,
jboolean on)
{
JAWT awt;
JAWT_DrawingSurface* surface;
JAWT_DrawingSurfaceInfo* surface_info;
JAWT_X11DrawingSurfaceInfo* surface_info_x11;
jint lock;
GC gc;
int c;
char* test_string = "JAWT";
XColor orange;
XColor yellow;
XColor blue;
Display* display;
Drawable drawable;
Status status;
awt.version = JAWT_VERSION_1_3;
if (JAWT_GetAWT (env, &awt) == JNI_FALSE)
{
printf ("couldn't find AWT\n");
return;
}
surface = awt.GetDrawingSurface (env, canvas);
if (surface == NULL)
{
printf ("drawing surface is NULL\n");
return;
}
lock = surface->Lock (surface);
if ((lock & JAWT_LOCK_ERROR) != 0)
{
printf ("couldn't lock drawing surface\n");
awt.FreeDrawingSurface (surface);
return;
}
surface_info = surface->GetDrawingSurfaceInfo (surface);
if (surface_info == NULL)
{
printf ("couldn't get surface information\n");
surface->Unlock (surface);
awt.FreeDrawingSurface (surface);
return;
}
surface_info_x11 = (JAWT_X11DrawingSurfaceInfo*) surface_info->platformInfo;
display = surface_info_x11->display;
drawable = surface_info_x11->drawable;
gc = XCreateGC (display, drawable, 0, 0);
XSetBackground (display, gc, 0);
orange.red = 254 * 65535 / 255;
orange.green = 90 * 65535 / 255;
orange.blue = 16 * 65535 / 255;
/* assume color lookups succeed */
status = XAllocColor (display, DefaultColormap (display,
DefaultScreen (display)),
&orange);
if (!status)
{
printf ("color allocation failed\n");
goto cleanup;
}
yellow.red = 255 * 65535 / 255;
yellow.green = 255 * 65535 / 255;
yellow.blue = 0 * 65535 / 255;
XAllocColor (display, DefaultColormap (display,
DefaultScreen (display)),
&yellow);
if (!status)
{
printf ("color allocation failed\n");
goto cleanup;
}
blue.red = 16 * 65535 / 255;
blue.green = 30 * 65535 / 255;
blue.blue = 137 * 65535 / 255;
XAllocColor (display, DefaultColormap (display,
DefaultScreen (display)),
&blue);
if (!status)
{
printf ("color allocation failed\n");
goto cleanup;
}
for (c = 5; c >= 0; c--)
{
if (c % 2 == on)
XSetForeground (display, gc, yellow.pixel);
else
XSetForeground (display, gc, orange.pixel);
XFillArc (display, drawable, gc, 140 - c * 15, 140 - c * 15, c * 30, c * 30, 0, 360 * 64);
}
XSetForeground (display, gc, blue.pixel);
XDrawString (display, drawable,
gc, 129, 145, test_string, strlen (test_string));
cleanup:
XFreeGC (display, gc);
surface->FreeDrawingSurfaceInfo (surface_info);
surface->Unlock (surface);
awt.FreeDrawingSurface (surface);
}
@@ -0,0 +1,77 @@
/* DemoJAWT.java -- AWT Native Interface demo
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.jawt;
import java.awt.*;
import java.awt.event.*;
public class DemoJAWT extends Canvas
{
static
{
System.loadLibrary ("DemoJAWT");
}
public native void paintIt (Graphics g, boolean on);
public void paint (Graphics g)
{
paintIt (g, on);
}
private boolean on;
public static void main (String[] args)
{
Frame f = new Frame ("GNU Classpath JAWT Demo");
f.setBounds (0, 0, 300, 300);
f.setResizable (false);
DemoJAWT jawtDemo = new DemoJAWT ();
f.add (jawtDemo);
f.addWindowListener (new WindowAdapter ()
{
public void windowClosing (WindowEvent evt)
{
System.exit (0);
}
});
f.show ();
while (true)
{
try
{
Thread.sleep (500);
}
catch (InterruptedException ie)
{
// ignored
}
jawtDemo.on = ! jawtDemo.on;
f.repaint();
}
}
}