Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDparseJFCwithJacaretoIndices.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDparseJFCwithJacaretoIndices.java	(revision 1722)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDparseJFCwithJacaretoIndices.java	(revision 1722)
@@ -0,0 +1,105 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.plugin.jfc.commands;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+
+import de.ugoe.cs.autoquest.CommandHelpers;
+import de.ugoe.cs.autoquest.eventcore.Event;
+import de.ugoe.cs.autoquest.eventcore.guimodel.GUIModel;
+import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement;
+import de.ugoe.cs.autoquest.plugin.jfc.JFCSimplifiedLogParser;
+import de.ugoe.cs.autoquest.plugin.jfc.guimodel.JFCGUIElementSpec;
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
+import de.ugoe.cs.util.console.GlobalDataContainer;
+
+/**
+ * <p>
+ * Command to generate sessions in which the JFCGUIElements contain a special index that is required
+ * to replay the sequences with Jacareto.
+ * </p>
+ * 
+ * @author Daniel May
+ * @version 1.0
+ */
+public class CMDparseJFCwithJacaretoIndices implements Command {
+
+    @Override
+    public void run(List<Object> parameters) {
+        String filename;
+        String sequencesName = "sequences";
+        try {
+            filename = (String) parameters.get(0);
+            if (parameters.size() >= 2) {
+                sequencesName = (String) parameters.get(1);
+            }
+        }
+        catch (Exception e) {
+            throw new IllegalArgumentException();
+        }
+
+        JFCSimplifiedLogParser parser = new JFCSimplifiedLogParser();
+
+        try {
+            parser.parseFile(filename);
+        }
+        catch (Exception e) {
+            Console.printerrln("Could not parse " + filename + ": " + e.getMessage());
+            return;
+        }
+
+        Collection<List<Event>> sequences = parser.getSequences();
+        GUIModel targets = parser.getGuiModel();
+
+        generateJacaretoIndices(targets.getRootElements(), targets);
+
+        if (GlobalDataContainer.getInstance().addData(sequencesName, sequences)) {
+            CommandHelpers.dataOverwritten(sequencesName);
+        }
+
+        if (GlobalDataContainer.getInstance().addData(sequencesName + "_targets", targets)) {
+            CommandHelpers.dataOverwritten(sequencesName + "_targets");
+        }
+    }
+
+    @Override
+    public String help() {
+        return "parseJFCwithJacaretoIndices <filename> {<sequences>}";
+    }
+
+    private void generateJacaretoIndices(List<IGUIElement> elements, GUIModel targets) {
+        HashMap<String, Integer> typeCount = new HashMap<>();
+
+        for (IGUIElement child : elements) {
+            String type = child.getSpecification().getType();
+            Integer count = typeCount.get(type);
+
+            if (count == null) {
+                count = 0;
+                typeCount.put(type, count);
+            }
+            else {
+                typeCount.put(type, ++count);
+            }
+
+            ((JFCGUIElementSpec) child.getSpecification()).setAltIndex(count);
+
+            generateJacaretoIndices(targets.getChildren(child), targets);
+        }
+    }
+}
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/guimodel/JFCGUIElement.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/guimodel/JFCGUIElement.java	(revision 1721)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/guimodel/JFCGUIElement.java	(revision 1722)
@@ -157,21 +157,8 @@
         // get the Java classname, ignore the package hierarchy if present
         String[] parts = getSpecification().getType().split("\\.");
-        String name = parts[parts.length - 1];
 
         // find the correct Jacareto index
         // jacareto indices start at 1
-        int jacIndex = getIndex() + 1;
-
-        // FIXME: some class specific hacks
-        if (name.equals("JFrame")) {
-            jacIndex++;
-        }
-        else if (name.equals("JLayeredPane")) {
-            jacIndex--;
-        }
-        else if (name.equals("JTextField")) {
-            jacIndex = 1;
-        }
-
+        int jacIndex = ((JFCGUIElementSpec) getSpecification()).getAltIndex() + 1;
         str = parts[parts.length - 1] + "_(" + jacIndex + ")";
 
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/guimodel/JFCGUIElementSpec.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/guimodel/JFCGUIElementSpec.java	(revision 1721)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/guimodel/JFCGUIElementSpec.java	(revision 1722)
@@ -77,4 +77,12 @@
     /**
      * <p>
+     * An alternative index of the specified GUI element in its parent element. Each element type is
+     * counted separately. This index is used for replaying programs such as Jacareto.
+     * </p>
+     */
+    private int altIndex = -1;
+
+    /**
+     * <p>
      * Hash code of the GUI element. Used as unique identifier during its existence.
      * </p>
@@ -88,5 +96,5 @@
      */
     private List<Integer> formerElementHashes = new ArrayList<Integer>();
-    
+
     /**
      * <p>
@@ -203,6 +211,5 @@
         JFCGUIElementSpec otherSpec = (JFCGUIElementSpec) other;
 
-        return
-            (name == null ? otherSpec.name == null : name.equals(otherSpec.name)) &&
+        return (name == null ? otherSpec.name == null : name.equals(otherSpec.name)) &&
             (type == null ? otherSpec.type == null : type.equals(otherSpec.type)) &&
             (icon == null ? otherSpec.icon == null : icon.equals(otherSpec.icon)) &&
@@ -294,4 +301,16 @@
     /**
      * <p>
+     * Returns an alternative index of the specified GUI element in its parent element. Each element
+     * type is counted separately.
+     * </p>
+     * 
+     * @return the index
+     */
+    public int getAltIndex() {
+        return altIndex;
+    }
+
+    /**
+     * <p>
      * Returns the object hash of the specified GUI element.
      * </p>
@@ -301,4 +320,16 @@
     public int getElementHash() {
         return elementHash;
+    }
+
+    /**
+     * <p>
+     * Sets the alternative index.
+     * </p>
+     * 
+     * @param newAltIndex
+     *            the index
+     */
+    public void setAltIndex(int newAltIndex) {
+        altIndex = newAltIndex;
     }
 
@@ -372,13 +403,14 @@
         this.elementHash = newElementHash;
     }
-    
+
     /**
      * <p>
      * Sets the type hierarchy of the specified GUI element.
+     * 
      * @param typeHierarchy
-     * </p>
-     */
-    public void setTypeHierarchy(List<String> typeHierarchy){
-    	this.typeHierarchy = typeHierarchy;
+     *            </p>
+     */
+    public void setTypeHierarchy(List<String> typeHierarchy) {
+        this.typeHierarchy = typeHierarchy;
     }
 
@@ -423,9 +455,10 @@
     @Override
     public String[] getTypeHierarchy() {
-    	if (typeHierarchy == null){
-    		return new String[]{(getType())};
-    	}
-    	else
-    		return typeHierarchy.toArray(new String[typeHierarchy.size()]);
+        if (typeHierarchy == null) {
+            return new String[]
+                { (getType()) };
+        }
+        else
+            return typeHierarchy.toArray(new String[typeHierarchy.size()]);
     }
 
