diff --git a/.classpath b/.classpath
index b7181ef..2762e90 100644
--- a/.classpath
+++ b/.classpath
@@ -4,5 +4,7 @@
+
+
diff --git a/ivy.xml b/ivy.xml
index 8b4138d..08b5ed1 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -1,7 +1,12 @@
+
+
+
+
-
-
+
+
+
\ No newline at end of file
diff --git a/src/org/synthuse/Api.java b/src/org/synthuse/Api.java
index 7c1803e..6896e2d 100644
--- a/src/org/synthuse/Api.java
+++ b/src/org/synthuse/Api.java
@@ -120,6 +120,7 @@ public class Api {
HWND SetFocus(HWND hWnd);
HWND FindWindow(String winClass, String title);
+ LRESULT PostMessage(HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam);
LRESULT SendMessage(HWND hWnd, int Msg, WPARAM wParam, LPARAM lParam);
LRESULT SendMessageA(HWND editHwnd, int wmGettext, long l, byte[] lParamStr);
boolean DestroyWindow(HWND hWnd);
@@ -296,7 +297,8 @@ public class Api {
public boolean closeWindow(HWND handle) {
//return user32.DestroyWindow(handle);
- user32.SendMessage(handle, WM_CLOSE , null, null);
+ //user32.SendMessage(handle, WM_CLOSE , null, null);
+ user32.PostMessage(handle, WM_CLOSE , null, null);
//user32.SendMessage(handle, WM_NCDESTROY , null, null);
return true;
}
diff --git a/src/org/synthuse/CommandPopupMenu.java b/src/org/synthuse/CommandPopupMenu.java
index ae9fd2f..aca4309 100644
--- a/src/org/synthuse/CommandPopupMenu.java
+++ b/src/org/synthuse/CommandPopupMenu.java
@@ -137,6 +137,15 @@ public class CommandPopupMenu extends JPopupMenu {
CommandMenuItem mntmGetwindowclass = new CommandMenuItem("getWindowClass", 2);
mnWinMessages.add(mntmGetwindowclass);
+ CommandMenuItem mntmOpen = new CommandMenuItem("open", 2, false);
+ add(mntmOpen);
+
+ CommandMenuItem mntmDisplayText = new CommandMenuItem("displayText", 3, false);
+ add(mntmDisplayText);
+
+ //CommandMenuItem mntmOpenAndWait = new CommandMenuItem("openAndWait", 1, false);
+ //add(mntmOpenAndWait);
+
CommandMenuItem mntmPause = new CommandMenuItem("pause", 2, false);
add(mntmPause);
diff --git a/src/org/synthuse/CommandProcessor.java b/src/org/synthuse/CommandProcessor.java
index 8efa3db..d443ad0 100644
--- a/src/org/synthuse/CommandProcessor.java
+++ b/src/org/synthuse/CommandProcessor.java
@@ -8,34 +8,36 @@
package org.synthuse;
import java.awt.Point;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.sql.Timestamp;
import java.text.DecimalFormat;
-import java.util.Date;
-import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.JOptionPane;
-
-import com.sun.jna.platform.win32.WinDef.HWND;
+import org.synthuse.commands.*;
public class CommandProcessor implements Runnable{
- private static String WIN_XML = "";
- public static long LAST_UPDATED_XML = 0;
public static long SPEED = 1000; // ms
public static double XML_UPDATE_THRESHOLD = 5.0; // seconds
public static long WAIT_TIMEOUT_THRESHOLD = 30000; //ms
- public static AtomicBoolean STOP_PROCESSOR = new AtomicBoolean(false);
+ public static AtomicBoolean STOP_PROCESSOR = new AtomicBoolean(false); //stop script from executing
+ public static boolean DEFAULT_QUIET = false; //by default is quiet enabled
+ protected CommandProcessor CommandProcessor = null;
+ public int executeErrorCount;
public String lastError = "";
+ public String currentCommandText = "";
+ public Point targetOffset = new Point();
+ public StatusWindow currentStatusWin = null;
+
public String scriptStr = "";
- private Api api = new Api();
- private Point targetOffset = new Point();
-
- private int executeErrorCount = 0;
- private String currentCommandText = "";
+ public BaseCommand base = new BaseCommand(this);
+ public MouseCommands mouse = new MouseCommands(this);
+ public KeyboardCommands keyboard = new KeyboardCommands(this);
+ public WindowsCommands win = new WindowsCommands(this);
+ public MainCommands main = new MainCommands(this);
+
+ private boolean isQuiet = DEFAULT_QUIET;
+ private int scriptErrorCount = 0;
public static interface Events {
void statusChanged(String status);
@@ -50,12 +52,29 @@ public class CommandProcessor implements Runnable{
}
};
+ public int getErrors() {
+ return scriptErrorCount;
+ }
+
+ public void setScript(String Script) {
+ scriptStr = Script;
+ }
+
+ public void setQuiet(boolean val) {
+ isQuiet = val;
+ }
+
public CommandProcessor () {
}
+
+ public CommandProcessor (String scriptStr) {
+ this.scriptStr = scriptStr;
+ }
public CommandProcessor (String scriptStr, Events customEvents) { //multithreading support
this.scriptStr = scriptStr;
- this.events = customEvents;
+ if (customEvents != null)
+ this.events = customEvents;
}
@Override
@@ -63,15 +82,18 @@ public class CommandProcessor implements Runnable{
executeAllScriptCommands(scriptStr);
}
- public static void executeThreaded(String scriptStr, Events customEvents) { //multithreading support
- Thread t = new Thread(new CommandProcessor(scriptStr, customEvents));
+ public static CommandProcessor executeThreaded(String scriptStr, Events customEvents) { //multithreading support
+ CommandProcessor cp = new CommandProcessor(scriptStr, customEvents);
+ Thread t = new Thread(cp);
t.start();
+ return cp;
}
public void executeAllScriptCommands(String scriptStr) {
events.statusChanged("Executing Test Script...");
//CommandProcessor cmdProcessor = new CommandProcessor();
- int errors = 0;
+ scriptErrorCount = 0;
+ lastError = "";
long startTime = System.nanoTime();
String[] lines = scriptStr.split("\n");
for (String line : lines) {
@@ -86,13 +108,13 @@ public class CommandProcessor implements Runnable{
events.statusChanged("Executing line: " + line);
if (parsed.length == 4 || parsed.length == 3)
execute(parsed[2].trim(), new String[] {});
- if (parsed.length == 6)
+ if (parsed.length == 6 || parsed.length == 5)
execute(parsed[2].trim(), new String[] {parsed[4].trim()});
if (parsed.length == 7)
execute(parsed[2].trim(), new String[] {parsed[4].trim(), parsed[6].trim()});
if (executeErrorCount > 0) //check if any errors occurred
- ++errors;
+ ++scriptErrorCount;
if (STOP_PROCESSOR.get())
break;
@@ -101,9 +123,9 @@ public class CommandProcessor implements Runnable{
String forcedStr = "Completed";
if (STOP_PROCESSOR.get())
forcedStr = "Stopped";
- events.statusChanged("Script Execution " + forcedStr + " with " + errors + " error(s) in " + new DecimalFormat("#.###").format(seconds) + " seconds");
+ events.statusChanged("Script Execution " + forcedStr + " with " + scriptErrorCount + " error(s) in " + new DecimalFormat("#.###").format(seconds) + " seconds");
events.executionCompleted();
- if (errors > 0)
+ if (scriptErrorCount > 0 && !isQuiet)
JOptionPane.showMessageDialog(null, lastError);
}
@@ -115,12 +137,16 @@ public class CommandProcessor implements Runnable{
joinedArgs += arg + " | ";
if (joinedArgs.endsWith("| "))
joinedArgs = joinedArgs.substring(0, joinedArgs.length()-2);
- StatusWindow sw = new StatusWindow(command + " " + joinedArgs, -1);
+ //StatusWindow sw = null;
+ if (!isQuiet)
+ currentStatusWin = new StatusWindow(command + " " + joinedArgs, -1);
Object result = executeCommandSwitch(command, args);
if (SPEED > 0)
try { Thread.sleep(SPEED); } catch (Exception e) {e.printStackTrace();}
- sw.dispose();
+
+ if (!isQuiet && currentStatusWin != null)
+ currentStatusWin.dispose();
return result;
}
@@ -129,531 +155,110 @@ public class CommandProcessor implements Runnable{
//Key commands
if (command.equals("sendKeys"))
- return cmdSendKeys(args);
+ return keyboard.cmdSendKeys(args);
if (command.equals("keyDown"))
- return cmdKeyDown(args);
+ return keyboard.cmdKeyDown(args);
if (command.equals("keyUp"))
- return cmdKeyUp(args);
+ return keyboard.cmdKeyUp(args);
if (command.equals("keyCopy"))
- return cmdKeyCopy(args);
+ return keyboard.cmdKeyCopy(args);
if (command.equals("keyPaste"))
- return cmdKeyPaste(args);
+ return keyboard.cmdKeyPaste(args);
if (command.equals("keyEscape"))
- return cmdKeyEscape(args);
+ return keyboard.cmdKeyEscape(args);
if (command.equals("keyFunctionX"))
- return cmdKeyFunc(args);
+ return keyboard.cmdKeyFunc(args);
//Mouse commands
if (command.equals("click"))
- return cmdClick(args);
+ return mouse.cmdClick(args);
if (command.equals("doubleClick"))
- return cmdDoubleClick(args);
+ return mouse.cmdDoubleClick(args);
if (command.equals("rightClick"))
- return cmdRightClick(args);
+ return mouse.cmdRightClick(args);
if (command.equals("winClick"))
- return cmdWinClick(args);
+ return mouse.cmdWinClick(args);
if (command.equals("winDoubleClick"))
- return cmdWinDoubleClick(args);
+ return mouse.cmdWinDoubleClick(args);
if (command.equals("winRightClick"))
- return cmdWinRightClick(args);
+ return mouse.cmdWinRightClick(args);
if (command.equals("dragAndDrop"))
- return cmdRightClick(args);
+ return mouse.cmdRightClick(args);
if (command.equals("mouseDown"))
- return cmdMouseDown(args);
+ return mouse.cmdMouseDown(args);
if (command.equals("mouseUp"))
- return cmdMouseUp(args);
+ return mouse.cmdMouseUp(args);
if (command.equals("mouseDownRight"))
- return cmdMouseDownRight(args);
+ return mouse.cmdMouseDownRight(args);
if (command.equals("mouseUpRight"))
- return cmdMouseUpRight(args);
+ return mouse.cmdMouseUpRight(args);
if (command.equals("mouseMove"))
- return cmdMouseMove(args);
+ return mouse.cmdMouseMove(args);
if (command.equals("mouseMoveXy"))
- return cmdMouseMoveXy(args);
+ return mouse.cmdMouseMoveXy(args);
if (command.equals("setTargetOffset"))
- return cmdSetTargetOffset(args);
+ return mouse.cmdSetTargetOffset(args);
//Windows Api Commands
if (command.equals("windowFocus"))
- return cmdWindowFocus(args);
+ return win.cmdWindowFocus(args);
if (command.equals("windowMinimize"))
- return cmdWindowMinimize(args);
+ return win.cmdWindowMinimize(args);
if (command.equals("windowMaximize"))
- return cmdWindowMaximize(args);
+ return win.cmdWindowMaximize(args);
if (command.equals("windowRestore"))
- return cmdWindowRestore(args);
+ return win.cmdWindowRestore(args);
if (command.equals("windowShow"))
- return cmdWindowShow(args);
+ return win.cmdWindowShow(args);
if (command.equals("windowHide"))
- return cmdWindowHide(args);
+ return win.cmdWindowHide(args);
if (command.equals("windowSwitchToThis"))
- return cmdWindowSwitchToThis(args);
+ return win.cmdWindowSwitchToThis(args);
if (command.equals("windowClose"))
- return cmdWindowClose(args);
+ return win.cmdWindowClose(args);
if (command.equals("setWindowText"))
- return cmdSetText(args);
+ return win.cmdSetText(args);
if (command.equals("getWindowText"))
- return cmdGetText(args);
+ return win.cmdGetText(args);
- // Misc Commands
+ // Misc Command and Test/Sample command
if (command.equals("delay") || command.equals("pause")) {
+ if (!base.checkArgumentLength(args, 1))
+ return false;
+ if (!base.checkFirstArgumentLength(args))
+ return false;
+ if (!base.checkIsNumeric(args[0]))
+ return false;
+ //System.out.println("sleeping for " + args[0] );
Thread.sleep(Long.parseLong(args[0]));
return true;
}
+ if (command.equals("open"))
+ return main.cmdOpen(args);
+ if (command.equals("displayText"))
+ return main.cmdDisplayText(args);
if (command.equals("setSpeed"))
- return cmdSetSpeed(args);
+ return main.cmdSetSpeed(args);
if (command.equals("setTimeout"))
- return cmdSetTimeout(args);
+ return main.cmdSetTimeout(args);
if (command.equals("waitForTitle"))
- return cmdWaitForTitle(args);
+ return main.cmdWaitForTitle(args);
if (command.equals("waitForText"))
- return cmdWaitForText(args);
+ return main.cmdWaitForText(args);
if (command.equals("waitForClass"))
- return cmdWaitForClass(args);
+ return main.cmdWaitForClass(args);
if (command.equals("waitForVisible"))
- return cmdWaitForVisible(args);
+ return main.cmdWaitForVisible(args);
}
catch (Exception e) {
- appendError(e);
+ base.appendError(e);
return false;
}
- appendError("Error: Command '" + command + "' not found.");
+ base.appendError("Error: Command '" + command + "' not found.");
return false;
}
-
- private void appendError(Exception e) {
- ++executeErrorCount;
- StringWriter sw = new StringWriter();
- e.printStackTrace(new PrintWriter(sw));
- lastError += new Timestamp((new Date()).getTime()) + " - " + sw.toString() + "\n";
- try {
- sw.close();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
-
- private void appendError(String msg) {
- ++executeErrorCount;
- lastError += new Timestamp((new Date()).getTime()) + " - " + msg + "\n";
- }
-
- private boolean checkArgumentLength(String[] args, int expectedLength) {
- if (args.length < expectedLength) {
- appendError("Error: expected at least " + expectedLength + " arguments (" + currentCommandText + "[" + args.length + "])");
- return false;
- }
- return true;
- }
-
- private boolean whenFalseAppendError(boolean cmdResult) {
- if (!cmdResult)
- appendError("Error: command '" + currentCommandText + "' failed");
- return cmdResult;
- }
-
- private HWND findHandleWithXpath(String xpath) {
- return findHandleWithXpath(xpath, false);
- }
-
- private HWND findHandleWithXpath(String xpath, boolean ignoreFailedFind) {
- HWND result = null;
- double secondsFromLastUpdate = ((double)(System.nanoTime() - LAST_UPDATED_XML) / 1000000000);
- if (secondsFromLastUpdate > XML_UPDATE_THRESHOLD) { //default 5 second threshold
- WIN_XML = WindowsEnumeratedXml.getXml();
- LAST_UPDATED_XML = System.nanoTime();
- }
- WindowsEnumeratedXml.evaluateXpathGetValues(WIN_XML, xpath);
- String resultStr = "";
- List resultList = WindowsEnumeratedXml.evaluateXpathGetValues(WIN_XML, xpath);
- for(String item: resultList) {
- if (item.contains("hwnd=")) {
- List hwndList = WindowsEnumeratedXml.evaluateXpathGetValues(item, "//@hwnd");
- resultStr = hwndList.get(0);
- }
- else
- resultStr = item;
- break;
- }
- result = Api.GetHandleFromString(resultStr);
- if (result == null && !ignoreFailedFind)
- appendError("Error: Failed to find window handle matching: " + xpath);
- return result;
- }
-
- private boolean cmdSendKeys(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- return whenFalseAppendError(RobotMacro.sendKeys(args[0]));
- }
-
- private boolean cmdKeyDown(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- if (args[0].length() < 1){
- appendError("Error: command '" + currentCommandText + "' failed, expected first argument length > 0");
- return false;
- }
- char keyChar = args[0].charAt(0);
- return RobotMacro.keyDown(keyChar);
- }
-
- private boolean cmdKeyUp(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- if (args[0].length() < 1){
- appendError("Error: command '" + currentCommandText + "' failed, expected first argument length > 0");
- return false;
- }
- char keyChar = args[0].charAt(0);
- return RobotMacro.keyUp(keyChar);
- }
-
- private boolean cmdKeyCopy(String[] args) {
- RobotMacro.copyKey();
- return true;
- }
-
- private boolean cmdKeyPaste(String[] args) {
- RobotMacro.pasteKey();
- return true;
- }
-
- private boolean cmdKeyEscape(String[] args) {
- RobotMacro.escapeKey();
- return true;
- }
-
- private boolean cmdKeyFunc(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- if (args[0].length() < 1){
- appendError("Error: command '" + currentCommandText + "' failed, expected first argument length > 0");
- return false;
- }
- int fNum = Integer.parseInt(args[0]);
- RobotMacro.functionKey(fNum);
- return true;
- }
-
- private boolean cmdClick(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- Point p = api.getWindowPosition(handle);
- RobotMacro.mouseMove(p.x + targetOffset.x, p.y + targetOffset.y);
- RobotMacro.leftClickMouse();
- return true;
- }
-
- private boolean cmdDoubleClick(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- Point p = api.getWindowPosition(handle);
- RobotMacro.mouseMove(p.x + targetOffset.x, p.y + targetOffset.y);
- RobotMacro.doubleClickMouse();
- return true;
- }
-
- private boolean cmdRightClick(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- Point p = api.getWindowPosition(handle);
- RobotMacro.mouseMove(p.x + targetOffset.x, p.y + targetOffset.y);
- RobotMacro.rightClickMouse();
- return true;
- }
-
- private boolean cmdMouseDown(String[] args) {
- RobotMacro.leftMouseDown();
- return true;
- }
-
- private boolean cmdMouseUp(String[] args) {
- RobotMacro.leftMouseUp();
- return true;
- }
-
- private boolean cmdMouseDownRight(String[] args) {
- RobotMacro.rightMouseDown();
- return true;
- }
-
- private boolean cmdMouseUpRight(String[] args) {
- RobotMacro.rightMouseUp();
- return true;
- }
-
- private boolean cmdMouseMove(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- Point p = api.getWindowPosition(handle);
- RobotMacro.mouseMove(p.x + targetOffset.x, p.y + targetOffset.y);
- //System.out.println("point " + p.x + "," + p.y);
- return true;
- }
-
- private boolean cmdSetTargetOffset(String[] args) {
- if (!checkArgumentLength(args, 2))
- return false;
- int x = Integer.parseInt(args[0]);
- int y = Integer.parseInt(args[1]);
- targetOffset.x = x;
- targetOffset.y = y;
- return true;
- }
- private boolean cmdMouseMoveXy(String[] args) {
- if (!checkArgumentLength(args, 2))
- return false;
- int x = Integer.parseInt(args[0]);
- int y = Integer.parseInt(args[1]);
- RobotMacro.mouseMove(x, y);
- return true;
- }
-
- private boolean cmdWinClick(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.sendClick(handle);
- return true;
- }
-
- private boolean cmdWinDoubleClick(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.sendDoubleClick(handle);
- return true;
- }
-
- private boolean cmdWinRightClick(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.sendRightClick(handle);
- return true;
- }
-
- private boolean cmdWindowFocus(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.activateWindow(handle);
- //api.showWindow(handle);
- return true;
- }
-
- private boolean cmdWindowMinimize(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.minimizeWindow(handle);
- return true;
- }
-
- private boolean cmdWindowMaximize(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.maximizeWindow(handle);
- return true;
- }
-
- private boolean cmdWindowRestore(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.restoreWindow(handle);
- return true;
- }
-
- private boolean cmdWindowHide(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.hideWindow(handle);
- return true;
- }
-
- private boolean cmdWindowShow(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.showWindow(handle);
- return true;
- }
-
- private boolean cmdWindowSwitchToThis(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.switchToThisWindow(handle, true);
- return true;
- }
-
-
- private boolean cmdWindowClose(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.closeWindow(handle);
- return true;
- }
-
- private boolean cmdSetText(String[] args) {
- if (!checkArgumentLength(args, 2))
- return false;
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return false;
- api.sendWmSetText(handle, args[1]);
- return true;
- }
-
- private String cmdGetText(String[] args) {
- if (!checkArgumentLength(args, 1))
- return "";
- HWND handle = findHandleWithXpath(args[0]);
- if (handle == null)
- return "";
- return api.sendWmGetText(handle);
- }
-
- private boolean cmdSetSpeed(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- long speed = Long.parseLong(args[0]);
- SPEED = speed;
- return true;
- }
-
- private boolean cmdSetTimeout(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- long timeout = Long.parseLong(args[0]);
- WAIT_TIMEOUT_THRESHOLD = timeout;
- return true;
- }
-
- private boolean cmdWaitForTitle(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- long totalAttempts = (long) (WAIT_TIMEOUT_THRESHOLD / (XML_UPDATE_THRESHOLD * 1000));
- long attemptCount = 0;
- String xpath = "/EnumeratedWindows/win[@TEXT='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']";
- HWND handle = findHandleWithXpath(xpath, true);
- if (handle != null)// first test without a timeout
- return true;
- while (attemptCount < totalAttempts) {
- handle = findHandleWithXpath(xpath, true);
- if (handle != null)
- break;
- try {Thread.sleep((long)(XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();}
- ++attemptCount;
- if (STOP_PROCESSOR.get())
- break;
- }
- return handle != null;
- }
-
- private boolean cmdWaitForText(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- long totalAttempts = (long) (WAIT_TIMEOUT_THRESHOLD / (XML_UPDATE_THRESHOLD * 1000));
- long attemptCount = 0;
- String xpath = "//[@TEXT='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']";
- HWND handle = findHandleWithXpath(xpath, true);
- if (handle != null)// first test without a timeout
- return true;
- while (attemptCount < totalAttempts) {
- handle = findHandleWithXpath(xpath, true);
- if (handle != null)
- break;
- try {Thread.sleep((long)(XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();}
- ++attemptCount;
- if (STOP_PROCESSOR.get())
- break;
- }
- return handle != null;
- }
-
- private boolean cmdWaitForClass(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- long totalAttempts = (long) (WAIT_TIMEOUT_THRESHOLD / (XML_UPDATE_THRESHOLD * 1000));
- long attemptCount = 0;
- String xpath = "//win[@CLASS='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']";
- HWND handle = findHandleWithXpath(xpath, true);
- if (handle != null)// first test without a timeout
- return true;
- while (attemptCount < totalAttempts) {
- handle = findHandleWithXpath(xpath, true);
- if (handle != null)
- break;
- try {Thread.sleep((long)(XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();}
- ++attemptCount;
- if (STOP_PROCESSOR.get())
- break;
- }
- return handle != null;
- }
-
- private boolean cmdWaitForVisible(String[] args) {
- if (!checkArgumentLength(args, 1))
- return false;
- long totalAttempts = (long) (WAIT_TIMEOUT_THRESHOLD / (XML_UPDATE_THRESHOLD * 1000));
- long attemptCount = 0;
- HWND handle = findHandleWithXpath(args[0], true);
- if (handle != null)// first test without a timeout
- return true;
- while (attemptCount < totalAttempts) {
- handle = findHandleWithXpath(args[0], true);
- if (handle != null)
- break;
- try {Thread.sleep((long)(XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();}
- ++attemptCount;
- if (STOP_PROCESSOR.get())
- break;
- }
- return handle != null;
- }
-
}
diff --git a/src/org/synthuse/SynthuseDlg.java b/src/org/synthuse/SynthuseDlg.java
index d6fc7b9..2070c74 100644
--- a/src/org/synthuse/SynthuseDlg.java
+++ b/src/org/synthuse/SynthuseDlg.java
@@ -71,7 +71,7 @@ public class SynthuseDlg extends JFrame {
/**
*
*/
- public static String VERSION_STR = "1.0.7";
+ public static String VERSION_STR = "1.0.8";
public static String RES_STR_MAIN_ICON = "/org/synthuse/img/gnome-robots.png";
public static String RES_STR_REFRESH_IMG = "/org/synthuse/img/rapidsvn.png";
diff --git a/src/org/synthuse/commands/BaseCommand.java b/src/org/synthuse/commands/BaseCommand.java
new file mode 100644
index 0000000..ae81354
--- /dev/null
+++ b/src/org/synthuse/commands/BaseCommand.java
@@ -0,0 +1,137 @@
+package org.synthuse.commands;
+
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.List;
+
+import org.synthuse.*;
+
+import com.sun.jna.platform.win32.WinDef.HWND;
+
+public class BaseCommand {
+
+ static String WIN_XML = "";
+ static long LAST_UPDATED_XML = 0;
+
+ protected Api api = new Api();
+ protected CommandProcessor parentProcessor = null;
+
+ protected int getExecuteErrorCount() {
+ return parentProcessor.executeErrorCount;
+ }
+
+ protected void setExecuteErrorCount(int val) {
+ parentProcessor.executeErrorCount = val;
+ }
+
+ protected String getCurrentCommand() {
+ return parentProcessor.currentCommandText;
+ }
+
+ protected void setCurrentCommand(String val) {
+ parentProcessor.currentCommandText = val;
+ }
+
+ protected boolean isProcessorStopped() {
+ return CommandProcessor.STOP_PROCESSOR.get();
+ }
+
+ public BaseCommand(CommandProcessor cp) { // should pass in the parent command processor
+ parentProcessor = cp;
+ }
+
+ public void appendError(Exception e) {
+ setExecuteErrorCount(getExecuteErrorCount() + 1);
+ StringWriter sw = new StringWriter();
+ e.printStackTrace(new PrintWriter(sw));
+ parentProcessor.lastError += new Timestamp((new Date()).getTime()) + " - " + sw.toString() + "\n";
+ try {
+ sw.close();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public void appendError(String msg) {
+ setExecuteErrorCount(getExecuteErrorCount() + 1);
+ parentProcessor.lastError += new Timestamp((new Date()).getTime()) + " - " + msg + "\n";
+ }
+
+ public boolean checkArgumentLength(String[] args, int expectedLength) {
+ if (args.length < expectedLength) {
+ appendError("Error: expected at least " + expectedLength + " arguments (" + getCurrentCommand() + "[" + args.length + "])");
+ return false;
+ }
+ return true;
+ }
+
+ public boolean checkFirstArgumentLength(String[] args) {
+ if (args[0].length() <= 0) {
+ appendError("Error: command '" + getCurrentCommand() + "' failed, expected first argument length > 0");
+ return false;
+ }
+ return true;
+ }
+
+ public boolean checkIsNumeric(String val) {
+ try {
+ Long.parseLong(val);
+ } catch(NumberFormatException e) {
+ appendError("Error: command '" + getCurrentCommand() + "' failed, was expecting a numeric value instead '" + val + "'");
+ return false;
+ }
+ return true;
+ }
+
+ public boolean whenFalseAppendError(boolean cmdResult) {
+ if (!cmdResult)
+ appendError("Error: command '" + getCurrentCommand() + "' failed");
+ return cmdResult;
+ }
+
+ public HWND findHandleWithXpath(String xpath) {
+ return findHandleWithXpath(xpath, false);
+ }
+
+ public HWND findHandleWithXpath(String xpath, boolean ignoreFailedFind) {
+ HWND result = null;
+ double secondsFromLastUpdate = ((double)(System.nanoTime() - LAST_UPDATED_XML) / 1000000000);
+ if (secondsFromLastUpdate > CommandProcessor.XML_UPDATE_THRESHOLD) { //default 5 second threshold
+ WIN_XML = WindowsEnumeratedXml.getXml();
+ LAST_UPDATED_XML = System.nanoTime();
+ }
+ WindowsEnumeratedXml.evaluateXpathGetValues(WIN_XML, xpath);
+ String resultStr = "";
+ List resultList = WindowsEnumeratedXml.evaluateXpathGetValues(WIN_XML, xpath);
+ for(String item: resultList) {
+ if (item.contains("hwnd=")) {
+ List hwndList = WindowsEnumeratedXml.evaluateXpathGetValues(item, "//@hwnd");
+ resultStr = hwndList.get(0);
+ }
+ else
+ resultStr = item;
+ break;
+ }
+ result = Api.GetHandleFromString(resultStr);
+ if (result == null && !ignoreFailedFind)
+ appendError("Error: Failed to find window handle matching: " + xpath);
+ return result;
+ }
+
+ public String convertListToString(List listStr, String delimiter) {
+ StringBuilder result = new StringBuilder("");
+ for (String item: listStr) {
+ result.append(item + delimiter);
+ }
+ return result.toString();
+ }
+
+ public void killStatusWindow() {
+ parentProcessor.currentStatusWin.dispose();
+ parentProcessor.currentStatusWin = null;
+ }
+
+}
diff --git a/src/org/synthuse/commands/FileCommands.java b/src/org/synthuse/commands/FileCommands.java
new file mode 100644
index 0000000..3f1cb8c
--- /dev/null
+++ b/src/org/synthuse/commands/FileCommands.java
@@ -0,0 +1,59 @@
+package org.synthuse.commands;
+
+import java.io.*;
+import org.synthuse.*;
+
+public class FileCommands extends BaseCommand {
+
+ public FileCommands(CommandProcessor cp) {
+ super(cp);
+ }
+
+ public String cmdGrepFile(String[] args) throws Exception {
+ if (!checkArgumentLength(args, 2))
+ return null;
+ String filename = args[0];
+ String pattern = args[1];
+ StringBuilder result = new StringBuilder("");
+ FileInputStream fis = null;
+ BufferedReader br = null;
+ try {
+ fis = new FileInputStream(filename);
+ DataInputStream dis = new DataInputStream(fis);
+ br = new BufferedReader(new InputStreamReader(dis));
+ String strLine = "";
+ while ((strLine = br.readLine()) != null) {
+ if (strLine.matches(pattern))
+ result.append(strLine + "\n");
+ }
+ }
+ catch (Exception ex) {
+ throw ex;
+ }
+ finally {
+ if (fis != null)
+ fis.close();
+ if (br != null)
+ br.close();
+ }
+ return result.toString();
+ }
+
+ public String cmdFileSearch(String[] args) {
+ if (!checkArgumentLength(args, 2))
+ return null;
+ String path = args[0];
+ String filenamePattern = args[1];
+ StringBuilder result = new StringBuilder("");
+ File parent = new File(path);
+ for(File child : parent.listFiles()) {
+ if (child.isFile() && child.getName().matches(filenamePattern))
+ result.append(child.getAbsolutePath() + "\n");
+ else if (child.isDirectory()) {
+ result.append(cmdFileSearch(new String[] {child.getAbsolutePath(), filenamePattern}));
+ }
+ }
+ return result.toString();
+ }
+
+}
diff --git a/src/org/synthuse/commands/KeyboardCommands.java b/src/org/synthuse/commands/KeyboardCommands.java
new file mode 100644
index 0000000..8e13835
--- /dev/null
+++ b/src/org/synthuse/commands/KeyboardCommands.java
@@ -0,0 +1,60 @@
+package org.synthuse.commands;
+
+import org.synthuse.*;
+
+public class KeyboardCommands extends BaseCommand {
+
+ public KeyboardCommands(CommandProcessor commandProcessor) {
+ super(commandProcessor);
+ }
+
+ public boolean cmdSendKeys(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ return whenFalseAppendError(RobotMacro.sendKeys(args[0]));
+ }
+
+ public boolean cmdKeyDown(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ if (!checkFirstArgumentLength(args))
+ return false;
+ char keyChar = args[0].charAt(0);
+ return RobotMacro.keyDown(keyChar);
+ }
+
+ public boolean cmdKeyUp(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ if (!checkFirstArgumentLength(args))
+ return false;
+ char keyChar = args[0].charAt(0);
+ return RobotMacro.keyUp(keyChar);
+ }
+
+ public boolean cmdKeyCopy(String[] args) {
+ RobotMacro.copyKey();
+ return true;
+ }
+
+ public boolean cmdKeyPaste(String[] args) {
+ RobotMacro.pasteKey();
+ return true;
+ }
+
+ public boolean cmdKeyEscape(String[] args) {
+ RobotMacro.escapeKey();
+ return true;
+ }
+
+ public boolean cmdKeyFunc(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ if (!checkFirstArgumentLength(args))
+ return false;
+ int fNum = Integer.parseInt(args[0]);
+ RobotMacro.functionKey(fNum);
+ return true;
+ }
+
+}
diff --git a/src/org/synthuse/commands/MainCommands.java b/src/org/synthuse/commands/MainCommands.java
new file mode 100644
index 0000000..db042b2
--- /dev/null
+++ b/src/org/synthuse/commands/MainCommands.java
@@ -0,0 +1,135 @@
+package org.synthuse.commands;
+
+import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.io.IOException;
+
+import org.synthuse.*;
+import com.sun.jna.platform.win32.WinDef.HWND;
+
+public class MainCommands extends BaseCommand {
+
+ public MainCommands(CommandProcessor cp) {
+ super(cp);
+ }
+
+ public boolean cmdOpen(String[] args) throws IOException {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ Runtime runtime = Runtime.getRuntime();
+ runtime.exec(args[0]);
+ return true;
+ }
+
+ public boolean cmdDisplayText(String[] args) throws IOException {
+ if (!checkArgumentLength(args, 2))
+ return false;
+ if (!checkIsNumeric(args[1]))
+ return false;
+ this.killStatusWindow();
+ StatusWindow sw = new StatusWindow(args[0], Integer.parseInt(args[1]));
+ Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
+ sw.setLocation(dim.width/2-sw.getSize().width/2, dim.height + StatusWindow.Y_BOTTOM_OFFSET - 80 );
+ return true;
+ }
+
+ public boolean cmdSetSpeed(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ long speed = Long.parseLong(args[0]);
+ CommandProcessor.SPEED = speed;
+ return true;
+ }
+
+ public boolean cmdSetTimeout(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ long timeout = Long.parseLong(args[0]);
+ CommandProcessor.WAIT_TIMEOUT_THRESHOLD = timeout;
+ return true;
+ }
+
+ public boolean cmdWaitForTitle(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ long totalAttempts = (long) (CommandProcessor.WAIT_TIMEOUT_THRESHOLD / (CommandProcessor.XML_UPDATE_THRESHOLD * 1000));
+ long attemptCount = 0;
+ String xpath = "/EnumeratedWindows/win[@TEXT='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']";
+ HWND handle = findHandleWithXpath(xpath, true);
+ if (handle != null)// first test without a timeout
+ return true;
+ while (attemptCount < totalAttempts) {
+ handle = findHandleWithXpath(xpath, true);
+ if (handle != null)
+ break;
+ try {Thread.sleep((long)(CommandProcessor.XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();}
+ ++attemptCount;
+ if (isProcessorStopped())
+ break;
+ }
+ return handle != null;
+ }
+
+ public boolean cmdWaitForText(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ long totalAttempts = (long) (CommandProcessor.WAIT_TIMEOUT_THRESHOLD / (CommandProcessor.XML_UPDATE_THRESHOLD * 1000));
+ long attemptCount = 0;
+ String xpath = "//[@TEXT='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']";
+ HWND handle = findHandleWithXpath(xpath, true);
+ if (handle != null)// first test without a timeout
+ return true;
+ while (attemptCount < totalAttempts) {
+ handle = findHandleWithXpath(xpath, true);
+ if (handle != null)
+ break;
+ try {Thread.sleep((long)(CommandProcessor.XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();}
+ ++attemptCount;
+ if (isProcessorStopped())
+ break;
+ }
+ return handle != null;
+ }
+
+ public boolean cmdWaitForClass(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ long totalAttempts = (long) (CommandProcessor.WAIT_TIMEOUT_THRESHOLD / (CommandProcessor.XML_UPDATE_THRESHOLD * 1000));
+ long attemptCount = 0;
+ String xpath = "//win[@CLASS='" + WindowsEnumeratedXml.escapeXmlAttributeValue(args[0].toUpperCase()) + "']";
+ HWND handle = findHandleWithXpath(xpath, true);
+ if (handle != null)// first test without a timeout
+ return true;
+ while (attemptCount < totalAttempts) {
+ handle = findHandleWithXpath(xpath, true);
+ if (handle != null)
+ break;
+ try {Thread.sleep((long)(CommandProcessor.XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();}
+ ++attemptCount;
+ if (isProcessorStopped())
+ break;
+ }
+ return handle != null;
+ }
+
+ public boolean cmdWaitForVisible(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ long totalAttempts = (long) (CommandProcessor.WAIT_TIMEOUT_THRESHOLD / (CommandProcessor.XML_UPDATE_THRESHOLD * 1000));
+ long attemptCount = 0;
+ HWND handle = findHandleWithXpath(args[0], true);
+ if (handle != null)// first test without a timeout
+ return true;
+ while (attemptCount < totalAttempts) {
+ handle = findHandleWithXpath(args[0], true);
+ if (handle != null)
+ break;
+ try {Thread.sleep((long)(CommandProcessor.XML_UPDATE_THRESHOLD * 1000));} catch (Exception e) {e.printStackTrace();}
+ ++attemptCount;
+ if (isProcessorStopped())
+ break;
+ }
+ return handle != null;
+ }
+
+}
diff --git a/src/org/synthuse/commands/MouseCommands.java b/src/org/synthuse/commands/MouseCommands.java
new file mode 100644
index 0000000..231f80f
--- /dev/null
+++ b/src/org/synthuse/commands/MouseCommands.java
@@ -0,0 +1,130 @@
+package org.synthuse.commands;
+
+import java.awt.Point;
+
+import org.synthuse.*;
+
+import com.sun.jna.platform.win32.WinDef.HWND;
+
+public class MouseCommands extends BaseCommand {
+
+ public MouseCommands(CommandProcessor commandProcessor) {
+ super(commandProcessor);
+ }
+
+ public boolean cmdClick(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ Point p = api.getWindowPosition(handle);
+ RobotMacro.mouseMove(p.x + parentProcessor.targetOffset.x, p.y + parentProcessor.targetOffset.y);
+ RobotMacro.leftClickMouse();
+ return true;
+ }
+
+ public boolean cmdDoubleClick(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ Point p = api.getWindowPosition(handle);
+ RobotMacro.mouseMove(p.x + parentProcessor.targetOffset.x, p.y + parentProcessor.targetOffset.y);
+ RobotMacro.doubleClickMouse();
+ return true;
+ }
+
+ public boolean cmdRightClick(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ Point p = api.getWindowPosition(handle);
+ RobotMacro.mouseMove(p.x + parentProcessor.targetOffset.x, p.y + parentProcessor.targetOffset.y);
+ RobotMacro.rightClickMouse();
+ return true;
+ }
+
+ public boolean cmdMouseDown(String[] args) {
+ RobotMacro.leftMouseDown();
+ return true;
+ }
+
+ public boolean cmdMouseUp(String[] args) {
+ RobotMacro.leftMouseUp();
+ return true;
+ }
+
+ public boolean cmdMouseDownRight(String[] args) {
+ RobotMacro.rightMouseDown();
+ return true;
+ }
+
+ public boolean cmdMouseUpRight(String[] args) {
+ RobotMacro.rightMouseUp();
+ return true;
+ }
+
+ public boolean cmdMouseMove(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ Point p = api.getWindowPosition(handle);
+ RobotMacro.mouseMove(p.x + parentProcessor.targetOffset.x, p.y + parentProcessor.targetOffset.y);
+ //System.out.println("point " + p.x + "," + p.y);
+ return true;
+ }
+
+ public boolean cmdSetTargetOffset(String[] args) {
+ if (!checkArgumentLength(args, 2))
+ return false;
+ int x = Integer.parseInt(args[0]);
+ int y = Integer.parseInt(args[1]);
+ parentProcessor.targetOffset.x = x;
+ parentProcessor.targetOffset.y = y;
+ return true;
+ }
+ public boolean cmdMouseMoveXy(String[] args) {
+ if (!checkArgumentLength(args, 2))
+ return false;
+ int x = Integer.parseInt(args[0]);
+ int y = Integer.parseInt(args[1]);
+ RobotMacro.mouseMove(x, y);
+ return true;
+ }
+
+ public boolean cmdWinClick(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.sendClick(handle);
+ return true;
+ }
+
+ public boolean cmdWinDoubleClick(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.sendDoubleClick(handle);
+ return true;
+ }
+
+ public boolean cmdWinRightClick(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.sendRightClick(handle);
+ return true;
+ }
+}
diff --git a/src/org/synthuse/commands/WindowsCommands.java b/src/org/synthuse/commands/WindowsCommands.java
new file mode 100644
index 0000000..6526bf1
--- /dev/null
+++ b/src/org/synthuse/commands/WindowsCommands.java
@@ -0,0 +1,113 @@
+package org.synthuse.commands;
+
+import org.synthuse.*;
+
+import com.sun.jna.platform.win32.WinDef.HWND;
+
+public class WindowsCommands extends BaseCommand {
+
+ public WindowsCommands(CommandProcessor cp) {
+ super(cp);
+ }
+
+ public boolean cmdWindowFocus(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.activateWindow(handle);
+ //api.showWindow(handle);
+ return true;
+ }
+
+ public boolean cmdWindowMinimize(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.minimizeWindow(handle);
+ return true;
+ }
+
+ public boolean cmdWindowMaximize(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.maximizeWindow(handle);
+ return true;
+ }
+
+ public boolean cmdWindowRestore(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.restoreWindow(handle);
+ return true;
+ }
+
+ public boolean cmdWindowHide(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.hideWindow(handle);
+ return true;
+ }
+
+ public boolean cmdWindowShow(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.showWindow(handle);
+ return true;
+ }
+
+ public boolean cmdWindowSwitchToThis(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.switchToThisWindow(handle, true);
+ return true;
+ }
+
+
+ public boolean cmdWindowClose(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.closeWindow(handle);
+ return true;
+ }
+
+ public boolean cmdSetText(String[] args) {
+ if (!checkArgumentLength(args, 2))
+ return false;
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return false;
+ api.sendWmSetText(handle, args[1]);
+ return true;
+ }
+
+ public String cmdGetText(String[] args) {
+ if (!checkArgumentLength(args, 1))
+ return "";
+ HWND handle = findHandleWithXpath(args[0]);
+ if (handle == null)
+ return "";
+ return api.sendWmGetText(handle);
+ }
+}
diff --git a/src/org/synthuse/test/CommandProcessorTest.java b/src/org/synthuse/test/CommandProcessorTest.java
new file mode 100644
index 0000000..88d94bf
--- /dev/null
+++ b/src/org/synthuse/test/CommandProcessorTest.java
@@ -0,0 +1,122 @@
+package org.synthuse.test;
+
+import static org.junit.Assert.*;
+
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.synthuse.*;
+
+public class CommandProcessorTest {
+
+ String goodTestScript1 = "| do | pause | on | 10 |";
+ String goodTestScript2 = "| do | pause | on | 10 |\n| do | pause | on | 20 |\n";
+ String goodTestScript3 = "|do|pause|on|8|\n|do|pause|on|16|\n";
+ String goodTestScript4 = "| do|pause|on|8|\r\n|do|pause|on|16|\r\n";
+
+ String badTestScript1 = "| do | pause | on | bob |\n";
+ String badTestScript2 = "| do | pause | on | bob |\n| do | pause | on | joe |\n";
+
+ CommandProcessor.Events testEvents = new CommandProcessor.Events() {
+ @Override
+ public void statusChanged(String status) {
+ }
+ @Override
+ public void executionCompleted() {
+ }
+ };
+
+
+ @Before
+ public void setUp() throws Exception {
+ CommandProcessor.DEFAULT_QUIET = true;
+ CommandProcessor.SPEED = 0;
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void initCommandProcessor() {
+ CommandProcessor commandProcessor = null;
+
+ commandProcessor = new CommandProcessor("");
+ assertEquals(commandProcessor.scriptStr, "");
+
+ commandProcessor = new CommandProcessor(goodTestScript1);
+ assertEquals(commandProcessor.scriptStr, goodTestScript1);
+
+ //this script will be initialized and executed too
+ commandProcessor = CommandProcessor.executeThreaded(goodTestScript2, testEvents);
+ assertEquals(commandProcessor.scriptStr, goodTestScript2);
+ }
+
+ @Test
+ public void ExecuteSingleThreadedValidScripts() {
+ CommandProcessor commandProcessor = new CommandProcessor("", testEvents);
+ commandProcessor.run();
+ assertEquals(commandProcessor.getErrors(), 0);
+
+ commandProcessor.setScript(goodTestScript1);
+ assertEquals(commandProcessor.scriptStr, goodTestScript1);
+ commandProcessor.run();
+ assertEquals(commandProcessor.getErrors(), 0);
+
+ commandProcessor.setScript(goodTestScript2);
+ assertEquals(commandProcessor.scriptStr, goodTestScript2);
+ commandProcessor.run();
+ assertEquals(commandProcessor.getErrors(), 0);
+
+ commandProcessor = new CommandProcessor(goodTestScript3, testEvents);
+ commandProcessor.run();
+ assertEquals(commandProcessor.getErrors(), 0);
+ }
+
+ @Test
+ public void ExecuteMultiThreadedValidScripts() {
+ CommandProcessor.executeThreaded("", testEvents);
+ CommandProcessor commandProcessor = null;
+ commandProcessor = CommandProcessor.executeThreaded(goodTestScript1, testEvents);
+ assertEquals(commandProcessor.getErrors(), 0);
+ commandProcessor = CommandProcessor.executeThreaded(goodTestScript2, testEvents);
+ assertEquals(commandProcessor.getErrors(), 0);
+ commandProcessor = CommandProcessor.executeThreaded(goodTestScript3, testEvents);
+ assertEquals(commandProcessor.getErrors(), 0);
+ //CommandProcessor.executeThreaded(goodTestScript3, null);
+ }
+
+ @Test
+ public void ExecuteSingleThreadedBadScripts() {
+ //undefined command
+ CommandProcessor commandProcessor = new CommandProcessor("| do | xasdffds |", testEvents);
+ commandProcessor.setQuiet(true);
+ commandProcessor.run();
+ //System.out.println(commandProcessor.lastError);
+ //2014-03-25 10:19:37.54 - Error: Command 'xasdffds' not found.
+ assertEquals(commandProcessor.getErrors(), 1);
+
+ commandProcessor.setScript(badTestScript1);
+ commandProcessor.setQuiet(true);
+ commandProcessor.run();
+ //System.out.println(commandProcessor.lastError);
+ assertEquals(commandProcessor.getErrors(), 1);
+ assertTrue(commandProcessor.lastError.length() > 1);
+
+ commandProcessor.setScript(badTestScript2);
+ commandProcessor.setQuiet(true);
+ assertEquals(commandProcessor.scriptStr, badTestScript2);
+ commandProcessor.run();
+ //System.out.println(commandProcessor.lastError);
+ assertEquals(commandProcessor.getErrors(), 2);
+ assertTrue(commandProcessor.lastError.length() > 1);
+
+ }
+
+ // test running mulithreaded bad scripts
+
+ // test parsing bars, and arguments that contain values with bars
+
+ // test command sections ie keyboard, mouse, win, main, base
+}
diff --git a/synthuse.properties b/synthuse.properties
index 3f9a9aa..06a1f84 100644
--- a/synthuse.properties
+++ b/synthuse.properties
@@ -1,5 +1,5 @@
#
-#Wed Mar 12 21:53:43 EDT 2014
+#Tue Mar 25 12:56:37 EDT 2014
DEFAULT_PROP_FILENAME=
urlList=
xpathList=