Skip to content

Commit

Permalink
Merge pull request #2 from alexkogon/addTextBasedVerify
Browse files Browse the repository at this point in the history
Enhanced XPath generation for better text based verification
  • Loading branch information
alexkogon committed Sep 22, 2015
2 parents 6d3071b + 36e6f03 commit d034072
Show file tree
Hide file tree
Showing 6 changed files with 489 additions and 6 deletions.
51 changes: 51 additions & 0 deletions src/org/synthuse/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ public class Config extends PropertiesSerializer {
public String xpathList = "";
public String xpathHightlight = ".*process=\"([^\"]*)\".*";

public boolean useStrongTextMatching = false;


public Config() //needed for cloning
{
}
Expand All @@ -37,20 +40,36 @@ public boolean isUiaBridgeDisabled()
return disableUiaBridge.equals("true") || disableUiaBridge.equals("True");
}


public void setDisableUiaBridge(boolean aNewValue) {
disableUiaBridge=aNewValue?"true":"false";
}


public boolean isFilterUiaDisabled()
{
if (disableFiltersUia == null)
return false;
return disableFiltersUia.equals("true") || disableFiltersUia.equals("True");
}

public void setDisableFiltersUia(boolean aNewValue) {
disableFiltersUia=aNewValue?"true":"false";
}


public boolean isAlwaysOnTop()
{
if (alwaysOnTop == null)
return new Config().alwaysOnTop.equals("true") || new Config().alwaysOnTop.equals("True");
return alwaysOnTop.equals("true") || alwaysOnTop.equals("True");
}

public void setAlwaysOnTop(boolean aNewValue)
{
alwaysOnTop=aNewValue?"true":"false";
}

public int getRefreshKeyCode()
{
String keyStr = "";
Expand All @@ -62,6 +81,10 @@ else if (this.refreshKey.isEmpty())
keyStr = this.refreshKey;
return RobotMacro.getKeyCode(keyStr.charAt(0))[0];
}

public void setRefreshKeyCode(String aText) {
this.refreshKey=aText;
}

public int getTargetKeyCode()
{
Expand All @@ -74,4 +97,32 @@ else if (this.targetKey.isEmpty())
keyStr = this.targetKey;
return RobotMacro.getKeyCode(keyStr.charAt(0))[0];
}

public void setTargetKeyCode(String aText) {
this.targetKey=aText;
}

public boolean isUseStrongTextMatching() {
return useStrongTextMatching;
}

public void setUseStrongTextMatching(boolean useStrongTextMatching) {
this.useStrongTextMatching = useStrongTextMatching;
}

public String getXpathList() {
return xpathList;
}

public void setXPathList(String aText) {
xpathList=aText;
}

public String getXpathHighlight() {
return xpathHightlight;
}

public void setXPathHighlight(String aText) {
xpathHightlight=aText;
}
}
45 changes: 45 additions & 0 deletions src/org/synthuse/SynthuseConfigDialog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.synthuse;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import org.synthuse.controllers.SynthuseConfigDialogControllers;
import org.synthuse.views.SynthuseConfigPanel;

public class SynthuseConfigDialog extends JDialog {

/**
*
*/
private static final long serialVersionUID = -4877764256323621418L;

private Config theConfig; //Model
private final SynthuseConfigPanel theSynthuseConfigPanel; //View

public SynthuseConfigDialog(JFrame aParentFrame, Config aConfig) {
super(aParentFrame);

this.setConfig(aConfig);

this.setTitle("Synthuse Properties");

theSynthuseConfigPanel = new SynthuseConfigPanel();

SynthuseConfigDialogControllers.bindActionControllers(theSynthuseConfigPanel,theConfig);

this.getContentPane().add(theSynthuseConfigPanel);
this.setSize(492, 260);

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SynthuseConfigDialogControllers.initializeUI(theSynthuseConfigPanel,theConfig);
}
});
}

synchronized private void setConfig(Config aConfig) {
theConfig = aConfig;
}
}
33 changes: 29 additions & 4 deletions src/org/synthuse/SynthuseDlg.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@

import org.synthuse.Api.User32Ex;
import org.synthuse.DragTarget.dragEvents;
import org.synthuse.views.SynthuseConfigPanel;



Expand Down Expand Up @@ -85,6 +86,7 @@ public class SynthuseDlg extends JFrame {
private JButton btnAdvanced;

private TestIdeFrame testIde = null;
protected SynthuseConfigDialog configDialog=null;
//private MessageHookFrame msgHook = null;
private int targetX;
private int targetY;
Expand Down Expand Up @@ -283,17 +285,35 @@ public void actionPerformed(ActionEvent arg0) {
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridwidth = 1;
c.gridwidth = 2;
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(3,3,3,3); // add padding around objects

final DragTarget lblTarget = new DragTarget();

lblTarget.setHorizontalAlignment(SwingConstants.CENTER);
lblTarget.setIcon(new ImageIcon(SynthuseDlg.class.getResource(RES_STR_TARGET_IMG)));
final ImageIcon imageIcon = new ImageIcon(SynthuseDlg.class.getResource(RES_STR_TARGET_IMG));
lblTarget.setMinimumSize(new Dimension(imageIcon.getIconWidth(), imageIcon.getIconHeight()));
lblTarget.setIcon(imageIcon);
panel.add(lblTarget, c);

final JButton btnConfig = new JButton("Cfg");

btnConfig.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(configDialog==null) {
createConfigDialog();
}
configDialog.setVisible(true);
}

});
c.gridx = 2;
c.gridwidth = 1;
panel.add(btnConfig, c);

btnFind = new JButton("Find");
btnFind.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Expand Down Expand Up @@ -323,8 +343,8 @@ public void keyReleased(KeyEvent event) {
}
}
});
c.gridwidth = 3;
c.gridx = 1;
c.gridwidth = 1;
c.gridx = 3;
panel.add(cmbXpath, c);
btnFind.setIcon(new ImageIcon(SynthuseDlg.class.getResource(RES_STR_FIND_IMG)));
c.gridwidth = 1;
Expand Down Expand Up @@ -562,4 +582,9 @@ public void disposeWindow()
WindowEvent closingEvent = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(closingEvent);
}

private void createConfigDialog() {
configDialog=new SynthuseConfigDialog(this, config);
configDialog.setLocationRelativeTo(null);
}
}
20 changes: 18 additions & 2 deletions src/org/synthuse/XpathManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public XpathManager(HWND hwnd, String enumProperties, JTextPane windowsXmlTextPa

@Override
public void run() {
String results = buildXpathStatement();
String results = SynthuseDlg.config.isUseStrongTextMatching()?buildXpathStatement(true,50,50):buildXpathStatement();
events.executionCompleted(hwnd, results);
}

Expand Down Expand Up @@ -143,7 +143,23 @@ public String buildXpathStatement(boolean useFullTextMatching, int maxParentText
parentTxtStr = " and @text='" + parentTxtStr + "'";
}
if (!parentClassStr.isEmpty())
builtXpath = "//win[@class='" + parentClassStr + "'" + parentTxtStr + "]/win[@class='" + classStr + "']";
{
if (!txtStr.isEmpty()&&useFullTextMatching) {
String copyOfTxtStr = txtStr;
if (copyOfTxtStr.length() > maxTextLength) {// if the text is too long only test the first maxTextLength characters
copyOfTxtStr = WindowsEnumeratedXml.escapeXmlAttributeValue(copyOfTxtStr.substring(0, maxTextLength));
copyOfTxtStr = " and starts-with(@text,'" + copyOfTxtStr + "')";
}
else
copyOfTxtStr = " and @text='" + copyOfTxtStr + "'";
builtXpath = "//win[@class='" + parentClassStr + "'" + parentTxtStr + "]/win[@class='" + classStr + "'" + copyOfTxtStr + "]";
}
else
{
builtXpath = "//win[@class='" + parentClassStr + "'" + parentTxtStr + "]/win[@class='" + classStr + "']";
}
}
System.out.println(builtXpath);
resultList = WindowsEnumeratedXml.evaluateXpathGetValues(xml, builtXpath);
if (resultList.size() > 1) { // if there are still multiple results add position to the xpath
int position = 1;
Expand Down
121 changes: 121 additions & 0 deletions src/org/synthuse/controllers/SynthuseConfigDialogControllers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package org.synthuse.controllers;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import org.synthuse.Config;
import org.synthuse.views.SynthuseConfigPanel;

public class SynthuseConfigDialogControllers {

public static void initializeUI(SynthuseConfigPanel aSynthuseConfigPanel, Config aConfig) {
aSynthuseConfigPanel.getAlwaysOnTopCheckBox().setSelected(aConfig.isAlwaysOnTop());
aSynthuseConfigPanel.getDisableFiltersUiaCheckBox().setSelected(aConfig.isFilterUiaDisabled());
aSynthuseConfigPanel.getDisableUiaBridgeCheckBox().setSelected(aConfig.isUiaBridgeDisabled());
aSynthuseConfigPanel.getRefreshKeyTextField().setText(Integer.toString(aConfig.getRefreshKeyCode()));
aSynthuseConfigPanel.getStrongTextMatchingCheckBox().setSelected(aConfig.isUseStrongTextMatching());
aSynthuseConfigPanel.getTargetKeyTextField().setText(Integer.toString(aConfig.getTargetKeyCode()));
aSynthuseConfigPanel.getXPathHighlightTextField().setText(aConfig.getXpathHighlight());
aSynthuseConfigPanel.getXPathListTextField().setText(aConfig.getXpathList());
}

public static void bindActionControllers(final SynthuseConfigPanel aSynthuseConfigPanel, final Config aConfig) {
aSynthuseConfigPanel.getAlwaysOnTopCheckBox().addActionListener(alwaysOnTopCheckboxActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getDisableFiltersUiaCheckBox().addActionListener(disableFiltersUiaCheckboxActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getDisableUiaBridgeCheckBox().addActionListener(disableUiaBridgeCheckboxActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getRefreshKeyTextField().addActionListener(refreshKeyCodeTextFieldActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getStrongTextMatchingCheckBox().addActionListener(strongTextMatchingCheckboxActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getTargetKeyTextField().addActionListener(targetKeyCodeTextFieldActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getXPathHighlightTextField().addActionListener(xpathHighlightTextFieldActionHandler(aSynthuseConfigPanel, aConfig));
aSynthuseConfigPanel.getXPathListTextField().addActionListener(xpathListTextFieldActionHandler(aSynthuseConfigPanel, aConfig));
}

private static ActionListener xpathListTextFieldActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setXPathList(aSynthuseConfigPanel.getXPathListTextField().getText());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener xpathHighlightTextFieldActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setXPathHighlight(aSynthuseConfigPanel.getXPathHighlightTextField().getText());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener targetKeyCodeTextFieldActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setTargetKeyCode(aSynthuseConfigPanel.getTargetKeyTextField().getText());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener strongTextMatchingCheckboxActionHandler(
final SynthuseConfigPanel aSynthuseConfigPanel, final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setUseStrongTextMatching(aSynthuseConfigPanel.getStrongTextMatchingCheckBox().isSelected());
}
};
}

private static ActionListener refreshKeyCodeTextFieldActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setRefreshKeyCode(aSynthuseConfigPanel.getRefreshKeyTextField().getText());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener disableUiaBridgeCheckboxActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setDisableUiaBridge(aSynthuseConfigPanel.getDisableUiaBridgeCheckBox().isSelected());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener disableFiltersUiaCheckboxActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setDisableFiltersUia(aSynthuseConfigPanel.getDisableFiltersUiaCheckBox().isSelected());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}

private static ActionListener alwaysOnTopCheckboxActionHandler(final SynthuseConfigPanel aSynthuseConfigPanel,
final Config aConfig) {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent aE) {
aConfig.setAlwaysOnTop(aSynthuseConfigPanel.getAlwaysOnTopCheckBox().isSelected());
JOptionPane.showMessageDialog(aSynthuseConfigPanel, "May require restart to be effective");
}
};
}
}
Loading

0 comments on commit d034072

Please sign in to comment.