screen capture tool now reads .ini and starts to generate .xml
This commit is contained in:
parent
51b4ba3885
commit
7348a33d34
|
@ -17,5 +17,15 @@
|
||||||
</library>
|
</library>
|
||||||
</orderEntry>
|
</orderEntry>
|
||||||
<orderEntry type="library" name="junit" level="project" />
|
<orderEntry type="library" name="junit" level="project" />
|
||||||
|
<orderEntry type="module-library">
|
||||||
|
<library name="JUnit4">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$USER_HOME$/.m2/repository/junit/junit/4.12/junit-4.12.jar!/" />
|
||||||
|
<root url="jar://$USER_HOME$/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
</library>
|
||||||
|
</orderEntry>
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
|
@ -2,6 +2,7 @@
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ProjectModuleManager">
|
<component name="ProjectModuleManager">
|
||||||
<modules>
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/../../java_console/inifile/inifile.iml" filepath="$PROJECT_DIR$/../../java_console/inifile/inifile.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/screen/screen.iml" filepath="$PROJECT_DIR$/screen/screen.iml" />
|
<module fileurl="file://$PROJECT_DIR$/screen/screen.iml" filepath="$PROJECT_DIR$/screen/screen.iml" />
|
||||||
</modules>
|
</modules>
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -10,5 +10,6 @@
|
||||||
<orderEntry type="library" name="TunerStudioMS" level="project" />
|
<orderEntry type="library" name="TunerStudioMS" level="project" />
|
||||||
<orderEntry type="library" name="serial" level="project" />
|
<orderEntry type="library" name="serial" level="project" />
|
||||||
<orderEntry type="library" name="3rd_party" level="project" />
|
<orderEntry type="library" name="3rd_party" level="project" />
|
||||||
|
<orderEntry type="module" module-name="inifile" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
|
@ -0,0 +1,23 @@
|
||||||
|
import com.rusefi.ScreenGenerator;
|
||||||
|
|
||||||
|
public class ScreenCaptureLauncher {
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
startTunerStudio(args);
|
||||||
|
ScreenGenerator.main(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void startTunerStudio(String[] args) {
|
||||||
|
Thread t = new Thread(() -> {
|
||||||
|
try {
|
||||||
|
TunerStudio.main(args);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
t.setDaemon(false);
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.rusefi;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@XmlRootElement
|
||||||
|
public class Content {
|
||||||
|
private List<TopLevelMenu> menus = new ArrayList<>();
|
||||||
|
|
||||||
|
@XmlElementWrapper
|
||||||
|
@XmlElement(name = "keyword")
|
||||||
|
public List<TopLevelMenu> getTopLevelMenus() {
|
||||||
|
return menus;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,13 +1,18 @@
|
||||||
|
package com.rusefi;
|
||||||
|
|
||||||
|
import com.opensr5.ini.IniFileModel;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import javax.xml.bind.JAXBContext;
|
||||||
|
import javax.xml.bind.JAXBException;
|
||||||
|
import javax.xml.bind.Marshaller;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.awt.image.RasterFormatException;
|
import java.awt.image.RasterFormatException;
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
@ -21,15 +26,14 @@ public class ScreenGenerator {
|
||||||
|
|
||||||
private static final String DESTINATION = "images" + File.separator;
|
private static final String DESTINATION = "images" + File.separator;
|
||||||
|
|
||||||
public static void main(String[] args) throws InterruptedException, InvocationTargetException, IOException, AWTException {
|
static Content content = new Content();
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
IniFileModel iniFileModel = new IniFileModel();
|
||||||
|
iniFileModel.readIniFile("../../firmware/tunerstudio");
|
||||||
|
|
||||||
new File(DESTINATION).mkdirs();
|
new File(DESTINATION).mkdirs();
|
||||||
|
|
||||||
Thread t = new Thread(() -> TunerStudio.main(args));
|
|
||||||
|
|
||||||
t.setDaemon(false);
|
|
||||||
t.start();
|
|
||||||
|
|
||||||
|
|
||||||
Frame mainFrame = findMainFrame();
|
Frame mainFrame = findMainFrame();
|
||||||
|
|
||||||
while (topLevelButtons.isEmpty()) {
|
while (topLevelButtons.isEmpty()) {
|
||||||
|
@ -48,9 +52,22 @@ public class ScreenGenerator {
|
||||||
|
|
||||||
System.out.println("Done discovering buttons, " + topLevelButtons.size());
|
System.out.println("Done discovering buttons, " + topLevelButtons.size());
|
||||||
|
|
||||||
doJob(mainFrame);
|
handleTopLevelButtons(mainFrame, topLevelButtons);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void writeXml(Content content) throws JAXBException, IOException {
|
||||||
|
JAXBContext jaxbContext = JAXBContext.newInstance(Content.class);
|
||||||
|
|
||||||
|
Marshaller marshaller = jaxbContext.createMarshaller();
|
||||||
|
|
||||||
|
StringWriter xmlWriter = new StringWriter();
|
||||||
|
marshaller.marshal(content, xmlWriter);
|
||||||
|
System.out.println(xmlWriter.toString());
|
||||||
|
|
||||||
|
marshaller.marshal(content, new FileWriter("output.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Frame findMainFrame() throws InterruptedException {
|
private static Frame findMainFrame() throws InterruptedException {
|
||||||
while (true) {
|
while (true) {
|
||||||
Frame[] all = JFrame.getFrames();
|
Frame[] all = JFrame.getFrames();
|
||||||
|
@ -108,19 +125,23 @@ public class ScreenGenerator {
|
||||||
return component instanceof bi.b;
|
return component instanceof bi.b;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void doJob(Frame frame) throws InterruptedException, InvocationTargetException, IOException, AWTException {
|
private static void handleTopLevelButtons(Frame frame, ArrayList<AbstractButton> topLevelButtons) throws Exception {
|
||||||
printAllDialogs("Dialogs before clicking ", JDialog.getWindows());
|
printAllDialogs("Dialogs before clicking ", JDialog.getWindows());
|
||||||
|
|
||||||
|
|
||||||
for (AbstractButton topLevel : topLevelButtons) {
|
for (AbstractButton topLevel : topLevelButtons) {
|
||||||
handleTopLevelButton(frame, topLevel);
|
handleTopLevelButton(frame, topLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void handleTopLevelButton(Frame frame, AbstractButton topLevel) throws InterruptedException, InvocationTargetException, IOException {
|
private static void handleTopLevelButton(Frame frame, AbstractButton topLevel) throws Exception {
|
||||||
SwingUtilities.invokeAndWait(topLevel::doClick);
|
SwingUtilities.invokeAndWait(topLevel::doClick);
|
||||||
Thread.sleep(TOP_MENU_CLICK_DELAY);
|
Thread.sleep(TOP_MENU_CLICK_DELAY);
|
||||||
|
|
||||||
|
content.getTopLevelMenus().add(new TopLevelMenu(topLevel.getText()));
|
||||||
|
|
||||||
|
writeXml(content);
|
||||||
|
|
||||||
|
|
||||||
ImageIO.write(
|
ImageIO.write(
|
||||||
getScreenShot(frame),
|
getScreenShot(frame),
|
||||||
"png",
|
"png",
|
||||||
|
@ -134,20 +155,13 @@ public class ScreenGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void handleMenuItem(JMenuItem menuItem) throws InterruptedException, InvocationTargetException {
|
private static void handleMenuItem(JMenuItem menuItem) throws InterruptedException, InvocationTargetException {
|
||||||
SwingUtilities.invokeAndWait(new Runnable() {
|
SwingUtilities.invokeAndWait(menuItem::doClick);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
menuItem.doClick();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Thread.sleep(MENU_CLICK_DELAY);
|
Thread.sleep(MENU_CLICK_DELAY);
|
||||||
|
|
||||||
|
|
||||||
AtomicReference<JDialog> ref = new AtomicReference<>();
|
AtomicReference<JDialog> ref = new AtomicReference<>();
|
||||||
SwingUtilities.invokeAndWait(() -> {
|
SwingUtilities.invokeAndWait(() -> ref.set(findDynamicDialog()));
|
||||||
ref.set(findDynamicDialog());
|
|
||||||
});
|
|
||||||
// let's give it time to appear on the screen
|
// let's give it time to appear on the screen
|
||||||
Thread.sleep(MENU_CLICK_DELAY);
|
Thread.sleep(MENU_CLICK_DELAY);
|
||||||
JDialog dialog = ref.get();
|
JDialog dialog = ref.get();
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.rusefi;
|
||||||
|
|
||||||
|
import com.opensr5.ini.DialogModel;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TopLevelMenu {
|
||||||
|
private final String title;
|
||||||
|
|
||||||
|
@XmlElementWrapper
|
||||||
|
@XmlElement(name = "dialog")
|
||||||
|
private List<DialogModel> dialogs = new ArrayList<>();
|
||||||
|
|
||||||
|
public TopLevelMenu(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlAttribute
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DialogModel> getDialogs() {
|
||||||
|
return dialogs;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue