Skip to content

Commit bb4e9d0

Browse files
Added action to create new Arduino Sketch Project without having to convert an existing project
1 parent e2334cd commit bb4e9d0

File tree

5 files changed

+188
-1
lines changed

5 files changed

+188
-1
lines changed

META-INF/plugin.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,11 @@
9696
on how to target different products -->
9797
<depends>com.intellij.modules.clion</depends>
9898

99+
99100
<extensions defaultExtensionNs="com.intellij">
100101
<!-- Add your extensions here -->
102+
<!--<moduleType id="ARDUINO" implementationClass="io.github.francoiscambell.clionarduinoplugin.module.ArduinoModuleType"/>-->
103+
<!--<moduleBuilder builderClass="io.github.francoiscambell.clionarduinoplugin.module.ArduinoModuleBuilder"/>-->
101104
</extensions>
102105

103106
<application-components>
@@ -112,6 +115,7 @@
112115
<!-- Add your project components here -->
113116
</project-components>
114117

118+
115119
<actions>
116120
<!-- Add your actions here -->
117121
<action id="Sketch.New" class="io.github.francoiscambell.clionarduinoplugin.actions.NewSketchFile"
@@ -125,6 +129,13 @@
125129
icon="/io/github/francoiscambell/clionarduinoplugin/resources/icons/Arduino_Logo.png">
126130
<add-to-group group-id="ProjectViewPopupMenu" anchor="last"/>
127131
</action>
132+
<action id="SketchProject.New"
133+
class="io.github.francoiscambell.clionarduinoplugin.actions.NewArduinoProjectAction"
134+
text="New Arduino Sketch Project" description="Creates a new Arduino sketch project"
135+
icon="/io/github/francoiscambell/clionarduinoplugin/resources/icons/Arduino_Logo.png">
136+
<add-to-group group-id="FileMenu" anchor="first"/>
137+
<add-to-group group-id="WelcomeScreen.QuickStart" anchor="first"/>
138+
</action>
128139
</actions>
129140

130141
</idea-plugin>

src/io/github/francoiscambell/clionarduinoplugin/actions/ConvertToSketchProject.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public void actionPerformed(AnActionEvent e) {
3737
deleteBuildOutputDir(project);
3838

3939
CMakeSettings.getInstance(project).setAutoReloadEnabled(true);
40-
4140
}
4241

4342
private void deleteMainCpp(Project project) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.francoiscambell.clionarduinoplugin.actions;
2+
3+
import com.intellij.openapi.actionSystem.*;
4+
import com.intellij.openapi.wm.impl.welcomeScreen.*;
5+
import io.github.francoiscambell.clionarduinoplugin.resources.icons.*;
6+
import io.github.francoiscambell.clionarduinoplugin.wizards.*;
7+
8+
/**
9+
* Created by francois on 15-08-14.
10+
*/
11+
public class NewArduinoProjectAction extends AnAction {
12+
public void update(AnActionEvent event) {
13+
Presentation presentation = event.getPresentation();
14+
if (ActionPlaces.isMainMenuOrActionSearch(event.getPlace())) {
15+
presentation.setIcon(null);
16+
}
17+
18+
if (NewWelcomeScreen.isNewWelcomeScreen(event)) {
19+
event.getPresentation().setIcon(ArduinoIcon.ARDUINO_ICON);
20+
}
21+
22+
}
23+
24+
@Override
25+
public void actionPerformed(AnActionEvent e) {
26+
NewArduinoProjectWizard wizard = new NewArduinoProjectWizard();
27+
wizard.runWizard();
28+
}
29+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.github.francoiscambell.clionarduinoplugin.wizards;
2+
3+
import com.jetbrains.cidr.cpp.cmake.projectWizard.*;
4+
5+
/**
6+
* Created by francois on 15-08-14.
7+
*/
8+
public class NewArduinoProjectStepAdapter extends NewCMakeProjectStepAdapter {
9+
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package io.github.francoiscambell.clionarduinoplugin.wizards;
2+
3+
import com.intellij.ide.*;
4+
import com.intellij.openapi.command.*;
5+
import com.intellij.openapi.editor.*;
6+
import com.intellij.openapi.fileEditor.*;
7+
import com.intellij.openapi.project.*;
8+
import com.intellij.openapi.ui.*;
9+
import com.intellij.openapi.util.io.*;
10+
import com.intellij.openapi.vfs.*;
11+
import com.intellij.psi.*;
12+
import com.intellij.psi.codeStyle.*;
13+
import com.jetbrains.cidr.cpp.*;
14+
import com.jetbrains.cidr.cpp.cmake.projectWizard.*;
15+
import com.jetbrains.cidr.cpp.cmake.workspace.*;
16+
import com.jetbrains.cidr.lang.*;
17+
import com.jetbrains.cidr.lang.formatting.*;
18+
import com.jetbrains.cidr.lang.parser.*;
19+
import com.jetbrains.cidr.lang.psi.*;
20+
import com.jetbrains.cidr.lang.util.*;
21+
import io.github.francoiscambell.clionarduinoplugin.resources.*;
22+
23+
import java.io.*;
24+
25+
/**
26+
* Created by francois on 15-08-14.
27+
*/
28+
public class NewArduinoProjectWizard extends CMakeProjectWizard {
29+
private NewArduinoProjectStepAdapter adapter = new NewArduinoProjectStepAdapter();
30+
31+
public NewArduinoProjectWizard() {
32+
super("New Arduino Sketch Project", "NewArduinoSketchProject");
33+
initWithStep(adapter);
34+
}
35+
36+
@Override
37+
protected boolean tryFinish() {
38+
String var1 = this.adapter.getLocation();
39+
File var2 = new File(var1);
40+
if (var2.exists()) {
41+
String[] var3 = var2.list(new FilenameFilter() {
42+
public boolean accept(File var1, String var2) {
43+
return !".DS_Store".equalsIgnoreCase(var2) && !"Thumbs.db".equalsIgnoreCase(var2);
44+
}
45+
});
46+
if (var3 != null && var3.length > 0) {
47+
int var4 = Messages.showYesNoDialog(String
48+
.format("Directory \'%s\' already exists and not empty.\nWould you like to continue?", new Object[]{var1}), "Project Directory Already Exists", Messages
49+
.getQuestionIcon());
50+
if (var4 != 0) {
51+
return false;
52+
}
53+
}
54+
} else {
55+
try {
56+
VfsUtil.createDirectories(var1);
57+
} catch (RuntimeException var6) {
58+
var6.printStackTrace();
59+
throw var6;
60+
} catch (IOException var7) {
61+
return false;
62+
}
63+
}
64+
65+
String var8 = var2.getParent();
66+
if (var8 != null) {
67+
RecentProjectsManager.getInstance().setLastProjectCreationLocation(var8);
68+
}
69+
70+
try {
71+
createProject(this.adapter.getName(), var1);
72+
return true;
73+
} catch (IOException var5) {
74+
CPPLog.LOG.warn(var5);
75+
return false;
76+
}
77+
}
78+
79+
public static String createProject(String var0, String var1) throws IOException {
80+
File var2 = new File(var1);
81+
File var3 = new File(var2, "CMakeLists.txt");
82+
if (!var3.exists() && !var3.createNewFile()) {
83+
throw new IOException("Cannot create file " + var3);
84+
} else {
85+
var0 = FileUtil.sanitizeFileName(var0);
86+
FileUtil.writeToFile(var3, getCMakeListsFileHeader(var0) + "set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/ArduinoToolchain.cmake)");
87+
File var4 = new File(var2, var0 + ".ino");
88+
if (!var4.exists() && !var4.createNewFile()) {
89+
throw new IOException("Cannot create file " + var4);
90+
} else {
91+
FileUtil.writeToFile(var4, Strings.DEFAULT_ARDUINO_SKETCH_CONTENTS);
92+
return var0;
93+
}
94+
}
95+
}
96+
97+
@Override
98+
protected void doRunWizard() {
99+
VirtualFile var1 = LocalFileSystem.getInstance().refreshAndFindFileByPath(this.adapter.getLocation());
100+
refreshProjectDir(var1);
101+
final VirtualFile var2 = var1.findChild("CMakeLists.txt");
102+
CPPLog.LOG.assertTrue(var2 != null);
103+
final VirtualFile var3 = var1.findChild(this.adapter.getLocation() + ".ino");
104+
CPPLog.LOG.assertTrue(var3 != null);
105+
final Project var4 = CMakeWorkspace.openProject(var2, (Project) null, false);
106+
if (var4 != null) {
107+
runPostWriteAction(var4, new Runnable() {
108+
public void run() {
109+
NewArduinoProjectWizard.a(var4, var3);
110+
CMakeProjectWizard.reformatMakeFile(var4, var2);
111+
}
112+
});
113+
(new OpenFileDescriptor(var4, var2)).navigate(false);
114+
(new OpenFileDescriptor(var4, var3)).navigate(true);
115+
}
116+
}
117+
118+
private static void a(final Project var0, final VirtualFile var1) {
119+
WriteCommandAction.runWriteCommandAction(var0, new Runnable() {
120+
public void run() {
121+
NewArduinoProjectWizard.doReformatMainFile(var0, var1);
122+
}
123+
});
124+
}
125+
126+
static void doReformatMainFile(Project var0, VirtualFile var1) {
127+
FileDocumentManager var2 = FileDocumentManager.getInstance();
128+
Document var3 = var2.getDocument(var1);
129+
CPPLog.LOG.assertTrue(var3 != null);
130+
String var4 = var3.getText();
131+
OCCodeFragment var5 = OCElementFactory
132+
.codeFragment(var4, var0, (PsiElement) null, OCTokenTypes.OC_FILE, false, false, OCLanguageKind.CPP);
133+
var5.putUserData(OCFormattingModelBuilder.ALWAYS_CREATE_FULL_MODEL, Boolean.valueOf(true));
134+
CodeStyleManager.getInstance(var0).reformat(var5);
135+
String var6 = var5.getText();
136+
var3.setText(var6);
137+
var2.saveDocument(var3);
138+
}
139+
}

0 commit comments

Comments
 (0)