Ignore:
Timestamp:
11/14/14 06:10:51 (10 years ago)
Author:
dmay
Message:

progress of the last days: clicks on menu items are now optionally supported by a menu description file which circumvents a few problems

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDgenerateJacaretoReplay.java

    r1809 r1825  
    2020import java.io.IOException; 
    2121import java.io.OutputStreamWriter; 
     22import java.nio.charset.Charset; 
     23import java.nio.file.Files; 
     24import java.nio.file.Paths; 
    2225import java.util.ArrayList; 
    2326import java.util.Calendar; 
     
    2629import java.util.Iterator; 
    2730import java.util.List; 
     31import java.util.Stack; 
    2832import java.util.UUID; 
    2933import java.util.logging.Level; 
     
    3539import de.ugoe.cs.autoquest.eventcore.IEventTarget; 
    3640import de.ugoe.cs.autoquest.eventcore.gui.*; 
     41import de.ugoe.cs.autoquest.eventcore.guimodel.GUIModel; 
     42import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement; 
    3743import de.ugoe.cs.autoquest.keyboardmaps.VirtualKey; 
    3844import de.ugoe.cs.autoquest.plugin.jfc.guimodel.JFCGUIElement; 
     45import de.ugoe.cs.autoquest.plugin.jfc.guimodel.JFCMenu; 
     46import de.ugoe.cs.autoquest.plugin.jfc.guimodel.JFCMenuButton; 
    3947import de.ugoe.cs.util.console.Console; 
    4048import de.ugoe.cs.util.console.GlobalDataContainer; 
     
    113121    private StructureNode lastItemActionEvent; 
    114122    private IEventTarget lastMouseDownTarget; 
     123    private HashMap<String, JFCGUIElement> menuElements; 
     124    private List<String> menuList; 
    115125 
    116126    /* 
     
    121131    @Override 
    122132    public String help() { 
    123         return "generateJacaretoReplay <filename> <sequences> <class> <basepath> <classpathext> {<initclass>}"; 
     133        return "generateJacaretoReplay <filename> <sequences> <class> <basepath> <classpathext> {<menufile>}"; 
    124134    } 
    125135 
     
    137147        String basepath; 
    138148        String classpathext; 
    139         String initclass = ""; 
    140149        try { 
    141150            filename = (String) parameters.get(0); 
     
    150159 
    151160        if (parameters.size() > 5) { 
    152             initclass = (String) parameters.get(5); 
     161            try { 
     162                menuList = 
     163                    Files.readAllLines(Paths.get((String) parameters.get(5)), 
     164                                       Charset.defaultCharset()); 
     165            } 
     166            catch (IOException e) { 
     167                Console.printerrln("Unable to open menu file"); 
     168                Console.logException(e); 
     169            } 
    153170        } 
    154171 
     
    165182 
    166183        sequences = (Collection<List<Event>>) dataObject; 
     184 
     185        menuElements = new HashMap<>(); 
    167186 
    168187        // map which maps VirtualKeys back to awt key modifier codes 
     
    176195        StructureNode.nextRef = 0; 
    177196 
    178         writeJacaretoXML(sequences, filename, classpath, initclass, basepath, classpathext); 
     197        writeJacaretoXML(sequences, filename, classpath, basepath, classpathext); 
    179198    } 
    180199 
     
    186205    private void writeJacaretoHead(BufferedWriter writer, 
    187206                                   String classname, 
    188                                    String initclass, 
    189207                                   String basepath, 
    190208                                   String classpathext) throws IOException 
     
    218236            + "name=\"Autoquest Replay\" " 
    219237            + "class=\"" + classname + "\" " 
    220             + "initclass=\"" + initclass + "\" "  
     238            + "initclass=\"\" "  
    221239            + "basepath=\"" + basepath + "\" " 
    222240            + "classpathext=\"" + classpathext + "\" " 
     
    250268                    lastMouseClickEvent = new StructureNode("MouseClick"); 
    251269                    lastMouseDownTarget = event.getTarget(); 
    252                     writeMouseClickEvent(writer, event, EVENT_DURATION, 501); 
     270                    writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     271                                         EVENT_DURATION, 501); 
    253272                } 
    254273                else if (event.getType() instanceof MouseButtonUp) { 
    255274                    lastKeySequenceEvent = null; 
    256275 
    257                     writeMouseClickEvent(writer, event, EVENT_DURATION, 502); 
     276                    writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     277                                         EVENT_DURATION, 502); 
    258278                } 
    259279                else if (event.getType() instanceof MouseDoubleClick) { 
     
    262282                    // first click 
    263283                    lastMouseClickEvent = multiClick.add("MouseClick"); 
    264                     writeMouseClickEvent(writer, event, DOUBLE_CLICK_DURATION, 501); 
    265                     writeMouseClickEvent(writer, event, DOUBLE_CLICK_DURATION, 502); 
    266                     writeMouseClickEvent(writer, event, DOUBLE_CLICK_DURATION, 500); 
     284                    writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     285                                         DOUBLE_CLICK_DURATION, 501); 
     286                    writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     287                                         DOUBLE_CLICK_DURATION, 502); 
     288                    writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     289                                         DOUBLE_CLICK_DURATION, 500); 
    267290                    // second click 
    268291                    lastMouseClickEvent = multiClick.add("MouseClick"); 
    269                     writeMouseClickEvent(writer, event, DOUBLE_CLICK_DURATION, 501); 
    270                     writeMouseClickEvent(writer, event, DOUBLE_CLICK_DURATION, 502); 
    271                     writeMouseClickEvent(writer, event, DOUBLE_CLICK_DURATION, 500); 
     292                    writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     293                                         DOUBLE_CLICK_DURATION, 501); 
     294                    writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     295                                         DOUBLE_CLICK_DURATION, 502); 
     296                    writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     297                                         DOUBLE_CLICK_DURATION, 500); 
    272298 
    273299                    lastMouseClickEvent = null; 
    274300                } 
    275301                else if (event.getType() instanceof MouseClick) { 
     302                    // if a menu file was provided, use the improved event 
     303                    // generation 
     304                    if (menuList != null) { 
     305                        if (event.getTarget() instanceof JFCMenuButton) { 
     306                            if (menuElements.isEmpty()) { 
     307                                // parse the menu structure 
     308                                GUIModel model = ((IGUIElement) event.getTarget()).getGUIModel(); 
     309                                getMenuElements(model.getRootElements(), model); 
     310                            } 
     311 
     312                            Stack<JFCGUIElement> hierarchy = 
     313                                findMenuItemHierarchy((JFCGUIElement) event.getTarget()); 
     314 
     315                            while (!hierarchy.empty()) { 
     316                                generateFullClick(writer, event, hierarchy.pop()); 
     317                            } 
     318                            continue; 
     319                        } 
     320                    } 
     321 
    276322                    lastKeySequenceEvent = null; 
    277323 
     
    282328                            // was triggered on this target 
    283329 
    284                             writeMouseClickEvent(writer, event, EVENT_DURATION, 500); 
     330                            writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     331                                                 EVENT_DURATION, 500); 
    285332                            writeItemActionEvent(writer, event); 
    286333 
     
    307354 
    308355                            // finish the last click on the old target 
    309                             writeMouseClickEvent(writer, event, EVENT_DURATION, 500); 
     356                            writeMouseClickEvent(writer, event, (JFCGUIElement) event.getTarget(), 
     357                                                 EVENT_DURATION, 500); 
    310358                            structure.children.add(lastMouseClickEvent); 
    311359 
    312360                            // and generate a new one 
    313                             generateFullClick(writer, event); 
     361                            generateFullClick(writer, event, (JFCGUIElement) event.getTarget()); 
    314362                        } 
    315363                    } 
     
    319367                        // mouseUps anymore 
    320368                        // -> just generate another full click 
    321                         generateFullClick(writer, event); 
     369                        generateFullClick(writer, event, (JFCGUIElement) event.getTarget()); 
    322370                    } 
    323371                } 
     
    345393    } 
    346394 
     395    private void getMenuElements(List<IGUIElement> elements, GUIModel model) { 
     396        for (IGUIElement child : elements) { 
     397            if (child instanceof JFCMenuButton || child instanceof JFCMenu) { 
     398                menuElements.put(((JFCGUIElement) child).getName().replaceAll("^\"|\"$", ""), 
     399                                 (JFCGUIElement) child); 
     400            } 
     401            getMenuElements(model.getChildren(child), model); 
     402        } 
     403    } 
     404 
     405    private Stack<JFCGUIElement> findMenuItemHierarchy(JFCGUIElement item) { 
     406        Stack<JFCGUIElement> elements = new Stack<>(); 
     407 
     408        // find line that contains this menu item name 
     409        int lineOfItem = -1; 
     410        for (int i = 0; i < menuList.size(); i++) { 
     411            String name = "\"" + menuList.get(i).trim().toLowerCase() + "\""; 
     412            if (name.equals(item.getName().trim().toLowerCase())) { 
     413                lineOfItem = i; 
     414            } 
     415        } 
     416 
     417        // now go backwards until the toplevel menu is found 
     418        int oldIndent = Integer.MAX_VALUE; 
     419        for (int j = lineOfItem; j >= 0; j--) { 
     420            String stripped = menuList.get(j).replaceFirst("^ *", ""); 
     421            int indent = menuList.get(j).length() - stripped.length(); 
     422 
     423            if (indent < oldIndent) { 
     424                // this is a parent submenu 
     425                elements.add(menuElements.get(stripped)); 
     426                oldIndent = indent; 
     427            } 
     428        } 
     429 
     430        return elements; 
     431    } 
     432 
    347433    private void commitFocusEvent() { 
    348434        if (lastFocusChangeEvent != null) { 
     
    352438    } 
    353439 
    354     private void generateFullClick(BufferedWriter writer, Event event) throws IOException { 
     440    private void generateFullClick(BufferedWriter writer, Event event, JFCGUIElement target) 
     441        throws IOException 
     442    { 
    355443        lastMouseClickEvent = new StructureNode("MouseClick"); 
    356444        lastMouseDownTarget = event.getTarget(); 
    357445 
    358         writeMouseClickEvent(writer, event, EVENT_DURATION, 501); 
    359         writeMouseClickEvent(writer, event, EVENT_DURATION, 502); 
    360         writeMouseClickEvent(writer, event, EVENT_DURATION, 500); 
     446        writeMouseClickEvent(writer, event, target, EVENT_DURATION, 501); 
     447        writeMouseClickEvent(writer, event, target, EVENT_DURATION, 502); 
     448        writeMouseClickEvent(writer, event, target, EVENT_DURATION, 500); 
    361449        writeItemActionEvent(writer, event); 
    362450 
     
    365453 
    366454        lastMouseDownTarget = null; 
    367  
    368455    } 
    369456 
     
    381468                                  String filename, 
    382469                                  String classpath, 
    383                                   String initclass, 
    384470                                  String basepath, 
    385471                                  String classpathext) 
     
    388474 
    389475        try { 
    390             writeJacaretoHead(writer, classpath, initclass, basepath, classpathext); 
     476            writeJacaretoHead(writer, classpath, basepath, classpathext); 
    391477            writeJacaretoEvents(writer, sequences); 
    392478            writeJacaretoTail(writer); 
     
    519605    } 
    520606 
    521     private void writeMouseClickEvent(BufferedWriter writer, Event event, int duration, int jacId) 
    522         throws IOException 
     607    private void writeMouseClickEvent(BufferedWriter writer, 
     608                                      Event event, 
     609                                      JFCGUIElement target, 
     610                                      int duration, 
     611                                      int jacId) throws IOException 
    523612    { 
    524613        MouseButtonInteraction info = (MouseButtonInteraction) event.getType(); 
    525         JFCGUIElement target = (JFCGUIElement) event.getTarget(); 
    526614        int clickCount = event.getType() instanceof MouseDoubleClick ? 2 : 1; 
    527615 
    528         // TODO: change procTime and duration to adequate values 
    529616        //@formatter:off 
    530617        writeLine(writer, 
Note: See TracChangeset for help on using the changeset viewer.