import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;

class JMenueClipBoard extends JFrame implements ActionListener, ClipboardOwner
{
	// Textfeld fuer den Test der Zwischenablage und der Menues
	JTextArea dieTextFlaeche;

	// Instanz der Zwischenablage
	Clipboard dieZwischenablage;

	// Menüleiste, Hauptmenüs und Menüeinträge
	JMenuBar dieMenueLeiste;
	JMenu mBearbeiten, mBeenden, mHilfe;
	JMenuItem miBeenden, miKopieren, miAusschneiden, 
			 miEinfuegen, miHilfe;

	public static void main(String[] args)
	{
		new JMenueClipBoard();
	}

	public JMenueClipBoard()
	{
		// Fenstertitel an Oberklasse Frame übergeben
		super("Menues, Tastaturkuerzel und Zwischenablage");

		// Zuweisung eines Layouts
		getContentPane().setLayout(new BorderLayout());

		dieZwischenablage = new Clipboard("dieZwischenablage");

		// Erzeugen der Menüleiste
		dieMenueLeiste 	= new JMenuBar();

		// Erzeugen der Menüs und ihrer Einträge
		// Jeder Menüeintrag wird einem Menü, jedes Menü der 
		// Menüleiste hizugefügt.
		//
		// Jeder Menueintrag bekommt ein Tastaturkürzel zu gewiesen,
		// d. h. es fängt einen bestimmten KeyEvent ab. Dabei
		// ist systembhängig voreingestellt, welche Sondertaste
		// zusätzlich gedrückt sein muss
		// (z.B. Windows: Control-/Steuertaste)
		// Abfrage über Toolkit.getMenuShortcutKeyMask()
		mBeenden		= new JMenu("Datei");
		miBeenden 		= new JMenuItem("Beenden");
		miBeenden.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK));
		miBeenden.setActionCommand("Beenden");
		miBeenden.addActionListener(this);
		mBeenden.add(miBeenden);
		dieMenueLeiste.add(mBeenden);

		//das HelpMenu ist laut API in Swing noch nicht inplementiert
		//mHilfe = new JMenu("Hilfe");
		//miHilfe	= new JMenuItem("Hilfe...", (int) 'H');
		//miHilfe.setActionCommand("Hilfe");
		//miHilfe.addActionListener(this);
		//mHilfe.add(miHilfe);
		//dieMenueLeiste.add(mHilfe);
		//dieMenueLeiste.setHelpMenu(mHilfe);

		mBearbeiten = new JMenu("Bearbeiten");
		miKopieren 	= new JMenuItem("Kopieren");
		miKopieren.setActionCommand("Kopieren");
		miKopieren.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK));
		miKopieren.addActionListener(this);
		mBearbeiten.add(miKopieren);

		miAusschneiden 	= new JMenuItem("Ausschneiden");
		miAusschneiden.setActionCommand("Ausschneiden");
		miAusschneiden.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
		miAusschneiden.addActionListener(this);
		mBearbeiten.add(miAusschneiden);

		miEinfuegen = new JMenuItem( "Einfuegen");
		miEinfuegen.setActionCommand("Einfuegen");
		miEinfuegen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK));
		miEinfuegen.addActionListener(this);
		mBearbeiten.add(miEinfuegen);
		dieMenueLeiste.add(mBearbeiten);

		setJMenuBar(dieMenueLeiste);

		String StartText = 	"Dies ist der Starttext.\n\nDas Programm laesst sich " +
					"ueber die Menues oder ueber Tastaturkuerzel bedienen,\n" +
					"z. B. Kopieren: Ctrl/Strg + C";
		dieTextFlaeche = new JTextArea(StartText);
		getContentPane().add(dieTextFlaeche, BorderLayout.CENTER);
		
		pack();
		
		// Lauschobjekt für Fensterereignisse zuweisen
		// (Abfangen des "Fenster schließen"-Befehls
		addWindowListener(
			new WindowAdapter() {
				public void windowClosing(WindowEvent e)
				{
					System.out.println("Anwendung mit System.exit(0) beendet.");
					System.exit(0);
				}
			}
		);
			
		setVisible(true);
	}

	public void actionPerformed(ActionEvent e)
	{
		String Befehl = e.getActionCommand();
		if(Befehl.equals("Beenden"))
		{
			System.out.println("Anwendung beendet (System.exit(0)).");
			System.exit(0);
		}
		if(Befehl.equals("Hilfe"))
		{
			dieTextFlaeche.setText(
				"Dieser Text simuliert die Reaktion der Hilfe ...");
		}

		if(Befehl.equals("Kopieren"))
		{
			StringSelection derText =
			new StringSelection(dieTextFlaeche.getText());

			getToolkit().getSystemClipboard().setContents(derText, this);
		}
		if(Befehl.equals("Ausschneiden"))
		{
			StringSelection derText = new StringSelection(dieTextFlaeche.getText());
			dieTextFlaeche.setText("");
			getToolkit().getSystemClipboard().setContents(derText, this);
		}
		if(Befehl.equals("Einfuegen"))
		{
			Transferable dieDatenderZwischenablage = 
			getToolkit().getSystemClipboard().getContents(this);

			try
			{
				if	( (dieDatenderZwischenablage != null) &&
					  (dieDatenderZwischenablage.isDataFlavorSupported(DataFlavor.stringFlavor)))
				{
					dieTextFlaeche.append(
						(String) dieDatenderZwischenablage.getTransferData(DataFlavor.stringFlavor));
				}
			}
			catch(Exception Ausnahme)
			{
				dieTextFlaeche.setText("inkompatibles Datenformat in der Zwischenablage");
 				dieTextFlaeche.append(" oder Ein-/Ausgabefehler (Zwischenablage)");
			}
		}
	}

	public void lostOwnership(Clipboard Cl, Transferable T)
	{
		dieTextFlaeche.setText("Besitz des Clipboards verloren - neuer Inhalt verfügbar ???");
	}
}

