|
2 | 2 |
|
3 | 3 | import com.intellij.openapi.actionSystem.*; |
4 | 4 | import com.intellij.openapi.application.*; |
5 | | -import com.intellij.openapi.command.*; |
6 | | -import com.intellij.openapi.editor.*; |
7 | 5 | import com.intellij.openapi.project.*; |
8 | 6 | import com.intellij.openapi.vfs.*; |
9 | | -import com.intellij.psi.*; |
| 7 | +import com.jetbrains.cidr.cpp.cmake.*; |
| 8 | +import com.jetbrains.cidr.cpp.cmake.workspace.*; |
| 9 | +import io.github.francoiscambell.clionarduinoplugin.*; |
10 | 10 | import io.github.francoiscambell.clionarduinoplugin.resources.*; |
11 | | -import org.apache.sanselan.util.*; |
| 11 | +import org.apache.commons.io.*; |
12 | 12 |
|
13 | 13 | import java.io.*; |
14 | 14 |
|
15 | 15 | /** |
16 | 16 | * Created by francois on 15-08-03. |
17 | 17 | */ |
18 | 18 | public class ConvertToSketchProject extends AnAction { |
| 19 | + |
19 | 20 | public void actionPerformed(AnActionEvent e) { |
20 | | - // TODO: insert action logic here |
21 | 21 | final Project project = e.getRequiredData(CommonDataKeys.PROJECT); |
22 | | - final PsiDirectory projectRootDirectory = PsiManager.getInstance(project).findDirectory(project.getBaseDir()); |
23 | | - PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project); |
24 | | - |
25 | 22 | final String projectName = project.getName(); |
26 | | - Application app = ApplicationManager.getApplication(); |
| 23 | + final CMakeListsEditor cMakeListsEditor = CMakeListsEditor.getInstance(project); |
27 | 24 |
|
28 | | - PsiFile cmakeListsPsiFile = projectRootDirectory.findFile("CMakeLists.txt"); |
29 | | - final Document cmakeListsDocument = psiDocumentManager.getDocument(cmakeListsPsiFile); |
30 | | - final int endOfFirstLine = cmakeListsDocument.getCharsSequence().toString().indexOf('\n'); |
31 | | - app.runWriteAction(new Runnable() { |
32 | | - @Override |
33 | | - public void run() { |
34 | | - CommandProcessor.getInstance().executeCommand(project, new Runnable() { |
35 | | - @Override |
36 | | - public void run() { |
37 | | - cmakeListsDocument |
38 | | - .insertString(endOfFirstLine, "\nset(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/ArduinoToolchain.cmake)"); |
39 | | - cmakeListsDocument.insertString(0, "set(PROJECT_NAME " + projectName + ")\n"); |
| 25 | + deleteMainCpp(project); |
40 | 26 |
|
41 | | - } |
42 | | - }, null, null, cmakeListsDocument); |
43 | | - } |
44 | | - }); |
| 27 | + cMakeListsEditor.clear(); |
| 28 | + cMakeListsEditor.minVersion("3.2"); |
| 29 | + cMakeListsEditor.set("CMAKE_TOOLCHAIN_FILE", "${CMAKE_SOURCE_DIR}/cmake/ArduinoToolchain.cmake"); |
| 30 | + cMakeListsEditor.set("PROJECT_NAME", projectName); |
| 31 | + cMakeListsEditor.project("${PROJECT_NAME}"); |
| 32 | + cMakeListsEditor.blankLine(); |
| 33 | + cMakeListsEditor.set("${CMAKE_PROJECT_NAME}_SKETCH", getMainSketchFile(project).getName()); |
| 34 | + cMakeListsEditor.method("generate_arduino_firmware", "${CMAKE_PROJECT_NAME}"); |
| 35 | + |
| 36 | + ArduinoToolchainFiles.copyToProject(project); |
| 37 | + deleteBuildOutputDir(project); |
| 38 | + |
| 39 | + CMakeSettings.getInstance(project).setAutoReloadEnabled(true); |
45 | 40 |
|
46 | | - PsiFile mainInoFile = projectRootDirectory.findFile(projectName + ".ino"); |
47 | | - PsiFile mainPdeFile = projectRootDirectory.findFile(projectName + ".pde"); |
48 | | - if (mainInoFile == null && mainPdeFile == null) { |
49 | | - app.runWriteAction(new Runnable() { |
| 41 | + } |
| 42 | + |
| 43 | + private void deleteMainCpp(Project project) { |
| 44 | + final VirtualFile mainCpp = project.getBaseDir().findChild(Strings.MAIN_CPP_FILENAME); |
| 45 | + if (mainCpp != null) { |
| 46 | + ApplicationManager.getApplication().runWriteAction(new Runnable() { |
50 | 47 | @Override |
51 | 48 | public void run() { |
52 | | - PsiFile mainProjectFile = projectRootDirectory.createFile(projectName + ".ino"); |
53 | | - final Document mainProjectDocument = PsiDocumentManager.getInstance(project) |
54 | | - .getDocument(mainProjectFile); |
55 | | - CommandProcessor.getInstance().executeCommand(project, new Runnable() { |
56 | | - @Override |
57 | | - public void run() { |
58 | | - mainProjectDocument |
59 | | - .setText("#include <Arduino.h>\n\nvoid setup() {\n\n}\n\nvoid loop() {\n\n}"); |
60 | | - } |
61 | | - }, null, null, mainProjectDocument); |
| 49 | + try { |
| 50 | + mainCpp.delete(this); |
| 51 | + } catch (IOException e) { |
| 52 | + e.printStackTrace(); |
| 53 | + } |
62 | 54 | } |
63 | 55 | }); |
64 | 56 | } |
| 57 | + } |
65 | 58 |
|
66 | | - app.runWriteAction(new Runnable() { |
67 | | - @Override |
68 | | - public void run() { |
69 | | - if (projectRootDirectory.findSubdirectory("build") == null) { |
70 | | - projectRootDirectory.createSubdirectory("build"); |
71 | | - } |
72 | | - } |
73 | | - }); |
74 | | - |
75 | | - app.runWriteAction(new Runnable() { |
76 | | - @Override |
77 | | - public void run() { |
78 | | - CommandProcessor.getInstance().executeCommand(project, new Runnable() { |
79 | | - @Override |
80 | | - public void run() { |
81 | | - cmakeListsDocument.insertString(cmakeListsDocument |
82 | | - .getTextLength(), "\nset(${CMAKE_PROJECT_NAME}_SKETCH ${CMAKE_PROJECT_NAME}.ino)\ngenerate_arduino_firmware(${CMAKE_PROJECT_NAME})\n"); |
83 | | - } |
84 | | - }, null, null, cmakeListsDocument); |
85 | | - } |
86 | | - }); |
87 | | - |
88 | | - app.runWriteAction(new Runnable() { |
89 | | - @Override |
90 | | - public void run() { |
91 | | - PsiDirectory cmakeDirectory = projectRootDirectory.createSubdirectory("cmake"); |
92 | | - PsiDirectory platformDirectory = cmakeDirectory.createSubdirectory("Platform"); |
93 | | - |
94 | | - PsiFile arduinoToolchain = cmakeDirectory.createFile("ArduinoToolchain.cmake"); |
95 | | - PsiFile arduino = platformDirectory.createFile("Arduino.cmake"); |
96 | | - |
97 | | - VirtualFile arduinoToolchainVirtualFile = arduinoToolchain.getVirtualFile(); |
98 | | - VirtualFile arduinoVirtualFile = arduino.getVirtualFile(); |
| 59 | + public void deleteBuildOutputDir(Project project) { |
| 60 | + try { |
| 61 | + FileUtils.deleteDirectory(CMakeWorkspace.getInstance(project).getProjectGeneratedDir()); |
| 62 | + } catch (IOException e1) { |
| 63 | + e1.printStackTrace(); |
| 64 | + } |
| 65 | + } |
99 | 66 |
|
100 | | - try { |
101 | | - OutputStream arduinoToolchainOutputStream = arduinoToolchainVirtualFile.getOutputStream(null); |
102 | | - OutputStream arduinoOutputStream = arduinoVirtualFile.getOutputStream(null); |
| 67 | + public VirtualFile getMainSketchFile(Project project) { |
| 68 | + VirtualFile projectBaseDir = project.getBaseDir(); |
| 69 | + String projectName = project.getName(); |
103 | 70 |
|
104 | | - IOUtils.copyStreamToStream(ArduinoToolchainFiles.ARDUINO_TOOLCHAIN_CMAKE, arduinoToolchainOutputStream); |
105 | | - IOUtils.copyStreamToStream(ArduinoToolchainFiles.ARDUINO_CMAKE, arduinoOutputStream); |
106 | | - } catch (IOException e1) { |
107 | | - e1.printStackTrace(); |
108 | | - } |
| 71 | + VirtualFile mainInoFile = projectBaseDir.findChild(projectName + Strings.DOT_INO_EXT); |
| 72 | + if (mainInoFile == null) { |
| 73 | + VirtualFile mainPdeFile = projectBaseDir.findChild(projectName + Strings.DOT_PDE_EXT); |
| 74 | + if (mainPdeFile == null) { |
| 75 | + return ArduinoSketchFileCreator |
| 76 | + .createSketchFileWithName(project, projectBaseDir, projectName + Strings.DOT_INO_EXT); |
| 77 | + } else { |
| 78 | + return mainPdeFile; |
109 | 79 | } |
110 | | - }); |
111 | | - |
| 80 | + } else { |
| 81 | + return mainInoFile; |
| 82 | + } |
112 | 83 | } |
113 | 84 | } |
0 commit comments