Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDgenerateJacaretoReplay.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDgenerateJacaretoReplay.java	(revision 1808)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDgenerateJacaretoReplay.java	(revision 1809)
@@ -33,4 +33,5 @@
 import de.ugoe.cs.util.console.Command;
 import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.eventcore.IEventTarget;
 import de.ugoe.cs.autoquest.eventcore.gui.*;
 import de.ugoe.cs.autoquest.keyboardmaps.VirtualKey;
@@ -111,4 +112,5 @@
     private StructureNode lastFocusChangeEvent;
     private StructureNode lastItemActionEvent;
+    private IEventTarget lastMouseDownTarget;
 
     /*
@@ -245,7 +247,7 @@
                     commitFocusEvent();
                     lastKeySequenceEvent = null;
-                    checkIfMouseDragged();
 
                     lastMouseClickEvent = new StructureNode("MouseClick");
+                    lastMouseDownTarget = event.getTarget();
                     writeMouseClickEvent(writer, event, EVENT_DURATION, 501);
                 }
@@ -272,26 +274,50 @@
                 }
                 else if (event.getType() instanceof MouseClick) {
+                    lastKeySequenceEvent = null;
+
                     if (lastMouseClickEvent != null) {
-                        lastKeySequenceEvent = null;
-
-                        writeMouseClickEvent(writer, event, EVENT_DURATION, 500);
-                        // FIXME: don't always write an item action
-                        writeItemActionEvent(writer, event);
-                        // FIXME: don't write it all here because there
-                        // might be no item action at all
-                        if (lastFocusChangeEvent == null) {
-                            // write structure sequentially
-                            structure.children.add(lastMouseClickEvent);
-                            structure.children.add(lastItemActionEvent);
+                        if (lastMouseDownTarget == event.getTarget()) {
+                            // this is the standard case:
+                            // mouseDown, mouseUp and mouseClick sequence
+                            // was triggered on this target
+
+                            writeMouseClickEvent(writer, event, EVENT_DURATION, 500);
+                            writeItemActionEvent(writer, event);
+
+                            if (lastFocusChangeEvent == null) {
+                                // write structure sequentially
+                                structure.children.add(lastMouseClickEvent);
+                                structure.children.add(lastItemActionEvent);
+                            }
+                            else {
+                                // with nested structure
+                                structure.children.add(lastItemActionEvent);
+                                lastItemActionEvent.children.add(0, lastFocusChangeEvent);
+                                lastFocusChangeEvent.children.add(0, lastMouseClickEvent);
+
+                                lastFocusChangeEvent = null;
+                                lastMouseClickEvent = null;
+                            }
                         }
                         else {
-                            // with nested structure
-                            structure.children.add(lastItemActionEvent);
-                            lastItemActionEvent.children.add(0, lastFocusChangeEvent);
-                            lastFocusChangeEvent.children.add(0, lastMouseClickEvent);
-
-                            lastFocusChangeEvent = null;
-                            lastMouseClickEvent = null;
+                            // target of mouseDown and mouseClick are different
+                            // -> this is, for example, a click on a menu item
+                            // within a condensed sequence
+                            commitFocusEvent();
+
+                            // finish the last click on the old target
+                            writeMouseClickEvent(writer, event, EVENT_DURATION, 500);
+                            structure.children.add(lastMouseClickEvent);
+
+                            // and generate a new one
+                            generateFullClick(writer, event);
                         }
+                    }
+                    else {
+                        // a target was clicked repeatedly:
+                        // the condensed sequence contains no mouseDowns or
+                        // mouseUps anymore
+                        // -> just generate another full click
+                        generateFullClick(writer, event);
                     }
                 }
@@ -303,5 +329,4 @@
                 else if (event.getType() instanceof KeyPressed) {
                     commitFocusEvent();
-                    // checkIfMouseDragged();
 
                     if (lastKeySequenceEvent == null) {
@@ -313,5 +338,4 @@
                 else if (event.getType() instanceof KeyReleased) {
                     commitFocusEvent();
-                    // checkIfMouseDragged();
 
                     writeKeyEvent(writer, event, 402);
@@ -328,11 +352,18 @@
     }
 
-    private void checkIfMouseDragged() {
-        if (lastMouseClickEvent != null) {
-            // this was not really a click, just a drag
-            lastMouseClickEvent.setContent("MouseDrag");
-            structure.children.add(lastMouseClickEvent);
-            lastMouseClickEvent = null;
-        }
+    private void generateFullClick(BufferedWriter writer, Event event) throws IOException {
+        lastMouseClickEvent = new StructureNode("MouseClick");
+        lastMouseDownTarget = event.getTarget();
+
+        writeMouseClickEvent(writer, event, EVENT_DURATION, 501);
+        writeMouseClickEvent(writer, event, EVENT_DURATION, 502);
+        writeMouseClickEvent(writer, event, EVENT_DURATION, 500);
+        writeItemActionEvent(writer, event);
+
+        structure.children.add(lastMouseClickEvent);
+        structure.children.add(lastItemActionEvent);
+
+        lastMouseDownTarget = null;
+
     }
 
