Skip to content

Commit 09279df

Browse files
authored
Merge pull request #641 from tonihele/bugfix/issue-640
Fix adding custom controls and app states to scenes in Gradle projects
2 parents d688e6c + cf7f9f0 commit 09279df

File tree

3 files changed

+153
-110
lines changed

3 files changed

+153
-110
lines changed

jme3-core/src/com/jme3/gde/core/appstates/NewAppStateVisualPanel1.java

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@
3232
package com.jme3.gde.core.appstates;
3333

3434
import java.io.IOException;
35+
import java.util.ArrayList;
36+
import java.util.Collections;
3537
import java.util.EnumSet;
36-
import java.util.LinkedList;
3738
import java.util.List;
3839
import java.util.Set;
3940
import javax.lang.model.element.TypeElement;
@@ -54,6 +55,7 @@
5455
import org.netbeans.api.project.ProjectUtils;
5556
import org.netbeans.api.project.SourceGroup;
5657
import org.netbeans.api.project.Sources;
58+
import org.openide.filesystems.FileObject;
5759
import org.openide.util.Exceptions;
5860

5961
@SuppressWarnings({"unchecked", "rawtypes"})
@@ -83,37 +85,56 @@ private void scanControls() {
8385
}
8486

8587
private List<String> getSources() {
86-
Sources sources = ProjectUtils.getSources(proj);
87-
final List<String> list = new LinkedList<>();
88-
if (sources != null) {
88+
Project root = ProjectUtils.rootOf(proj);
89+
Set<Project> containedProjects = ProjectUtils.getContainedProjects(root, true);
90+
List<Project> projects = new ArrayList<>();
91+
projects.add(root);
92+
if (containedProjects != null) {
93+
projects.addAll(containedProjects);
94+
}
95+
if (projects.isEmpty()) {
96+
return Collections.emptyList();
97+
}
98+
99+
List<String> list = new ArrayList<>();
100+
for (Project project : projects) {
101+
Sources sources = ProjectUtils.getSources(project);
102+
if (sources == null) {
103+
continue;
104+
}
105+
89106
SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
90-
if (groups != null) {
91-
for (SourceGroup sourceGroup : groups) {
92-
ClasspathInfo cpInfo = ClasspathInfo.create(
93-
ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.BOOT),
94-
ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.COMPILE),
95-
ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.SOURCE)
96-
);
97-
98-
Set<SearchScope> set = EnumSet.of(ClassIndex.SearchScope.SOURCE);
99-
Set<ElementHandle<TypeElement>> types = cpInfo.getClassIndex().getDeclaredTypes("", NameKind.PREFIX, set);
100-
for (ElementHandle<TypeElement> elementHandle : types) {
101-
JavaSource js = JavaSource.create(cpInfo);
102-
try {
103-
js.runUserActionTask((CompilationController control) -> {
104-
control.toPhase(JavaSource.Phase.RESOLVED);
105-
TypeElement elem = elementHandle.resolve(control);
106-
if (elem != null && doesInheritFromAppState(elem, control.getTypes())) {
107-
list.add(elem.getQualifiedName().toString());
108-
}
109-
}, false);
110-
} catch (IOException ioe) {
111-
Exceptions.printStackTrace(ioe);
112-
}
107+
if (groups == null) {
108+
continue;
109+
}
110+
111+
for (SourceGroup sourceGroup : groups) {
112+
FileObject rootFolder = sourceGroup.getRootFolder();
113+
ClasspathInfo cpInfo = ClasspathInfo.create(
114+
ClassPath.getClassPath(rootFolder, ClassPath.BOOT),
115+
ClassPath.getClassPath(rootFolder, ClassPath.COMPILE),
116+
ClassPath.getClassPath(rootFolder, ClassPath.SOURCE)
117+
);
118+
119+
Set<SearchScope> set = EnumSet.of(ClassIndex.SearchScope.SOURCE);
120+
Set<ElementHandle<TypeElement>> types = cpInfo.getClassIndex().getDeclaredTypes("", NameKind.PREFIX, set);
121+
for (ElementHandle<TypeElement> elementHandle : types) {
122+
JavaSource js = JavaSource.create(cpInfo);
123+
try {
124+
js.runUserActionTask((CompilationController control) -> {
125+
control.toPhase(JavaSource.Phase.RESOLVED);
126+
TypeElement elem = elementHandle.resolve(control);
127+
if (elem != null && doesInheritFromAppState(elem, control.getTypes())) {
128+
list.add(elem.getQualifiedName().toString());
129+
}
130+
}, false);
131+
} catch (IOException ioe) {
132+
Exceptions.printStackTrace(ioe);
113133
}
114134
}
115135
}
116136
}
137+
117138
return list;
118139
}
119140

jme3-core/src/com/jme3/gde/core/assets/ProjectAssetManager.java

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -166,30 +166,30 @@ private void loadClassLoader() {
166166
}
167167
SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
168168
List<URL> urls = new LinkedList<>();
169-
for (SourceGroup sourceGroup : groups) {
170-
ClassPath path = ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.EXECUTE);
171-
if (path == null) {
172-
continue;
173-
}
174-
175-
classPaths.add(path);
176-
path.addPropertyChangeListener(classPathListener);
177-
FileObject[] roots = path.getRoots();
178-
for (FileObject fileObject : roots) {
179-
if (!fileObject.equals(getAssetFolder())) {
180-
fileObject.addRecursiveListener(listener);
181-
logger.log(Level.FINE, "Add classpath:{0}", fileObject);
182-
classPathItems.add(new ClassPathItem(fileObject, listener));
183-
urls.add(fileObject.toURL());
169+
for (SourceGroup sourceGroup : groups) {
170+
ClassPath path = ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.EXECUTE);
171+
if (path == null) {
172+
continue;
184173
}
185-
if (fileObject.toURL().toExternalForm().startsWith("jar")) {
186-
logger.log(Level.FINE, "Add locator:{0}", fileObject.toURL());
187-
jarItems.add(fileObject);
188-
registerLocator(fileObject.toURL().toExternalForm(),
189-
"com.jme3.asset.plugins.UrlLocator");
174+
175+
classPaths.add(path);
176+
path.addPropertyChangeListener(classPathListener);
177+
FileObject[] roots = path.getRoots();
178+
for (FileObject fileObject : roots) {
179+
if (!fileObject.equals(getAssetFolder())) {
180+
fileObject.addRecursiveListener(listener);
181+
logger.log(Level.FINE, "Add classpath:{0}", fileObject);
182+
classPathItems.add(new ClassPathItem(fileObject, listener));
183+
urls.add(fileObject.toURL());
184+
}
185+
if (fileObject.toURL().toExternalForm().startsWith("jar")) {
186+
logger.log(Level.FINE, "Add locator:{0}", fileObject.toURL());
187+
jarItems.add(fileObject);
188+
registerLocator(fileObject.toURL().toExternalForm(),
189+
"com.jme3.asset.plugins.UrlLocator");
190+
}
190191
}
191192
}
192-
}
193193

194194
loadGradleClassLoader(urls);
195195

@@ -223,7 +223,7 @@ private void loadGradleClassLoader(List<URL> urls) {
223223
for (File file : runtimeFiles) {
224224
// logger.info(file.getName() + " : " + file.getAbsolutePath());
225225
FileObject fo = FileUtil.toFileObject(file);
226-
if (fo != null && !fo.isFolder()) {
226+
if (fo != null) {
227227
logger.info(fo.toURL().toExternalForm());
228228
if (!fo.equals(getAssetFolder())) {
229229
fo.addRecursiveListener(listener);

jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/NewCustomControlVisualPanel1.java

Lines changed: 83 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@
3131
*/
3232
package com.jme3.gde.core.sceneexplorer.nodes.actions.impl;
3333

34+
import java.util.ArrayList;
35+
import java.util.Collections;
3436
import java.util.EnumSet;
37+
import java.util.HashSet;
3538
import java.util.Iterator;
36-
import java.util.LinkedList;
3739
import java.util.List;
3840
import java.util.Set;
3941
import javax.lang.model.element.TypeElement;
@@ -53,8 +55,10 @@
5355
import org.netbeans.api.java.source.JavaSource.Phase;
5456
import org.netbeans.api.java.source.Task;
5557
import org.netbeans.api.project.Project;
58+
import org.netbeans.api.project.ProjectUtils;
5659
import org.netbeans.api.project.SourceGroup;
5760
import org.netbeans.api.project.Sources;
61+
import org.openide.filesystems.FileObject;
5862
import org.openide.util.Exceptions;
5963

6064
@SuppressWarnings({"unchecked", "rawtypes"})
@@ -84,74 +88,92 @@ private void scanControls() {
8488
}
8589

8690
private List<String> getSources() {
87-
Sources sources = proj.getLookup().lookup(Sources.class);
88-
final List<String> list = new LinkedList<String>();
89-
if (sources != null) {
91+
Project root = ProjectUtils.rootOf(proj);
92+
Set<Project> containedProjects = ProjectUtils.getContainedProjects(root, true);
93+
List<Project> projects = new ArrayList<>();
94+
projects.add(root);
95+
if (containedProjects != null) {
96+
projects.addAll(containedProjects);
97+
}
98+
if (projects.isEmpty()) {
99+
return Collections.emptyList();
100+
}
101+
102+
Set<String> list = new HashSet<>();
103+
for (Project project : projects) {
104+
Sources sources = project.getLookup().lookup(Sources.class);
105+
if (sources == null) {
106+
continue;
107+
}
108+
90109
SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
91-
if (groups != null) {
92-
for (SourceGroup sourceGroup : groups) {
93-
final ClasspathInfo cpInfo = ClasspathInfo.create(ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.BOOT),
94-
ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.COMPILE),
95-
ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.SOURCE));
96-
97-
Set<SearchScope> set = EnumSet.of(ClassIndex.SearchScope.SOURCE);
98-
Set<ElementHandle<TypeElement>> types = cpInfo.getClassIndex().getDeclaredTypes("", NameKind.PREFIX, set);
99-
for (Iterator<ElementHandle<TypeElement>> it = types.iterator(); it.hasNext();) {
100-
final ElementHandle<TypeElement> elementHandle = it.next();
101-
JavaSource js = JavaSource.create(cpInfo);
102-
try {
103-
js.runUserActionTask(new Task<CompilationController>() {
104-
@Override
105-
public void run(CompilationController control)
106-
throws Exception {
107-
control.toPhase(Phase.RESOLVED);
108-
//TODO: check with proper casting check.. gotta get TypeMirror of Control interface..
109-
// TypeUtilities util = control.getTypeUtilities();//.isCastable(Types., null)
110-
// util.isCastable(null, null);
111-
TypeElement elem = elementHandle.resolve(control);
112-
if (elem == null)
113-
return;
114-
115-
String elementName = elem.getQualifiedName().toString();
116-
117-
if (list.contains(elementName)) /* No duplicates */
118-
return;
119-
120-
do {
121-
//Check if it implements control interface
122-
for (TypeMirror typeMirror : elem.getInterfaces()) {
123-
String interfaceName = typeMirror.toString();
124-
if ("com.jme3.scene.control.Control".equals(interfaceName)) {
125-
if (!list.contains(elementName))
126-
list.add(elementName);
127-
break;
128-
}
129-
}
130-
//Check if it is an AbstractControl
131-
String className = elem.toString();
132-
if ("com.jme3.scene.control.AbstractControl".equals(className)) {
133-
if (!list.contains(elementName))
134-
list.add(elementName);
135-
}
110+
if (groups == null) {
111+
continue;
112+
}
136113

137-
TypeMirror superClass = elem.getSuperclass();
138-
if (superClass == null || superClass.getKind() == TypeKind.NONE) {
139-
break;
140-
}
114+
for (SourceGroup sourceGroup : groups) {
115+
FileObject rootFolder = sourceGroup.getRootFolder();
116+
final ClasspathInfo cpInfo = ClasspathInfo.create(ClassPath.getClassPath(rootFolder, ClassPath.BOOT),
117+
ClassPath.getClassPath(rootFolder, ClassPath.COMPILE),
118+
ClassPath.getClassPath(rootFolder, ClassPath.SOURCE));
119+
120+
Set<SearchScope> set = EnumSet.of(ClassIndex.SearchScope.SOURCE);
121+
Set<ElementHandle<TypeElement>> types = cpInfo.getClassIndex().getDeclaredTypes("", NameKind.PREFIX, set);
122+
for (Iterator<ElementHandle<TypeElement>> it = types.iterator(); it.hasNext();) {
123+
final ElementHandle<TypeElement> elementHandle = it.next();
124+
JavaSource js = JavaSource.create(cpInfo);
125+
try {
126+
js.runUserActionTask(new Task<CompilationController>() {
127+
@Override
128+
public void run(CompilationController control)
129+
throws Exception {
130+
control.toPhase(Phase.RESOLVED);
131+
//TODO: check with proper casting check.. gotta get TypeMirror of Control interface..
132+
// TypeUtilities util = control.getTypeUtilities();//.isCastable(Types., null)
133+
// util.isCastable(null, null);
134+
TypeElement elem = elementHandle.resolve(control);
135+
if (elem == null) {
136+
return;
137+
}
141138

142-
elem = (TypeElement)((DeclaredType)superClass).asElement(); // Iterate deeper
143-
} while (elem != null);
139+
String elementName = elem.getQualifiedName().toString();
140+
141+
if (list.contains(elementName)) /* No duplicates */ {
142+
return;
144143
}
145-
}, false);
146-
} catch (Exception ioe) {
147-
Exceptions.printStackTrace(ioe);
148-
}
149-
}
150144

145+
do {
146+
//Check if it implements control interface
147+
for (TypeMirror typeMirror : elem.getInterfaces()) {
148+
String interfaceName = typeMirror.toString();
149+
if ("com.jme3.scene.control.Control".equals(interfaceName) && !list.contains(elementName)) {
150+
list.add(elementName);
151+
break;
152+
}
153+
}
154+
//Check if it is an AbstractControl
155+
String className = elem.toString();
156+
if ("com.jme3.scene.control.AbstractControl".equals(className) && !list.contains(elementName)) {
157+
list.add(elementName);
158+
}
159+
160+
TypeMirror superClass = elem.getSuperclass();
161+
if (superClass == null || superClass.getKind() == TypeKind.NONE) {
162+
break;
163+
}
164+
165+
elem = (TypeElement) ((DeclaredType) superClass).asElement(); // Iterate deeper
166+
} while (elem != null);
167+
}
168+
}, false);
169+
} catch (Exception ioe) {
170+
Exceptions.printStackTrace(ioe);
171+
}
151172
}
152173
}
153174
}
154-
return list;
175+
176+
return new ArrayList<>(list);
155177
}
156178

157179
public void load(Project proj) {

0 commit comments

Comments
 (0)