1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-14 04:25:21 +02:00

Bug 480169 - Add proper support for platform libraries.

Change-Id: I3016ee6db3cd892f59b44d74d4181c30ca1b5b10
This commit is contained in:
Doug Schaefer 2015-10-20 22:53:17 -04:00
parent a88d0eb0d9
commit 12acb6f54e
5 changed files with 116 additions and 32 deletions

View file

@ -228,4 +228,18 @@ public class ArduinoLibrary {
return sources;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ArduinoLibrary) {
return getName().equals(((ArduinoLibrary) obj).getName());
} else {
return false;
}
}
@Override
public int hashCode() {
return getName().hashCode();
}
}

View file

@ -228,9 +228,18 @@ public class ArduinoManager {
}.getType();
Set<String> libraryNames = new Gson().fromJson(librarySetting, stringSet);
LibraryIndex index = ArduinoManager.instance.getLibraryIndex();
ArduinoPlatform platform = project.getActiveBuildConfig().getAdapter(ArduinoBuildConfiguration.class).getBoard()
.getPlatform();
List<ArduinoLibrary> libraries = new ArrayList<>(libraryNames.size());
for (String name : libraryNames) {
libraries.add(index.getLibrary(name));
ArduinoLibrary lib = index.getLibrary(name);
if (lib == null) {
lib = platform.getLibrary(name);
}
if (lib != null) {
libraries.add(lib);
}
}
return libraries;
}

View file

@ -51,6 +51,7 @@ public class ArduinoPlatform {
private HierarchicalProperties boardsProperties;
private Properties platformProperties;
private Map<String, String> menus = new HashMap<>();
private Map<String, ArduinoLibrary> libraries;
void setOwner(ArduinoPackage pkg) {
this.pkg = pkg;
@ -218,6 +219,39 @@ public class ArduinoPlatform {
return sources;
}
private void initLibraries() throws CoreException {
libraries = new HashMap<>();
File[] libraryDirs = getInstallPath().resolve("libraries").toFile().listFiles(); //$NON-NLS-1$
if (libraryDirs != null) {
for (File libraryDir : libraryDirs) {
Path propsPath = libraryDir.toPath().resolve("library.properties"); //$NON-NLS-1$
if (propsPath.toFile().exists()) {
try {
ArduinoLibrary lib = new ArduinoLibrary(propsPath);
libraries.put(lib.getName(), lib);
} catch (IOException e) {
throw new CoreException(
new Status(IStatus.ERROR, Activator.getId(), "Loading " + propsPath, e)); //$NON-NLS-1$
}
}
}
}
}
public synchronized Collection<ArduinoLibrary> getLibraries() throws CoreException {
if (libraries == null && isInstalled()) {
initLibraries();
}
return libraries.values();
}
public synchronized ArduinoLibrary getLibrary(String name) throws CoreException {
if (libraries == null && isInstalled()) {
initLibraries();
}
return libraries != null ? libraries.get(name) : null;
}
public IStatus install(IProgressMonitor monitor) {
// Check if we're installed already
if (isInstalled()) {
@ -253,9 +287,6 @@ public class ArduinoPlatform {
return status;
}
// Reload the library index to pick up platform libraries
ArduinoManager.instance.loadLibraryIndex(false);
return Status.OK_STATUS;
}

View file

@ -1,8 +1,6 @@
package org.eclipse.cdt.arduino.core.internal.board;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@ -22,25 +20,6 @@ public class LibraryIndex {
private Map<String, ArduinoLibrary> latestLibs = new HashMap<>();
public void resolve() throws IOException {
// Add in platform libraries
for (PackageIndex index : ArduinoManager.instance.getPackageIndices()) {
for (ArduinoPackage pkg : index.getPackages()) {
for (ArduinoPlatform platform : pkg.getPlatforms()) {
if (platform.isInstalled()) {
File[] libraryDirs = platform.getInstallPath().resolve("libraries").toFile().listFiles(); //$NON-NLS-1$
if (libraryDirs != null) {
for (File libraryDir : libraryDirs) {
Path propsPath = libraryDir.toPath().resolve("library.properties"); //$NON-NLS-1$
if (propsPath.toFile().exists()) {
libraries.add(new ArduinoLibrary(propsPath));
}
}
}
}
}
}
}
for (ArduinoLibrary library : libraries) {
String name = library.getName();

View file

@ -6,7 +6,9 @@ import java.util.List;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoLibrary;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform;
import org.eclipse.cdt.arduino.core.internal.board.LibraryIndex;
import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuildConfiguration;
import org.eclipse.cdt.arduino.ui.internal.Activator;
import org.eclipse.cdt.arduino.ui.internal.Messages;
import org.eclipse.core.resources.IProject;
@ -33,7 +35,7 @@ import org.eclipse.ui.dialogs.PropertyPage;
public class LibrariesPropertyPage extends PropertyPage {
private static class ContentProvider implements ITreeContentProvider {
private class ContentProvider implements ITreeContentProvider {
private LibraryIndex index;
@Override
@ -51,6 +53,13 @@ public class LibrariesPropertyPage extends PropertyPage {
return !index.getCategories().isEmpty();
} else if (element instanceof String) { // category
return !index.getLibraries((String) element).isEmpty();
} else if (element instanceof ArduinoPlatform) {
try {
return !((ArduinoPlatform) element).getLibraries().isEmpty();
} catch (CoreException e) {
Activator.log(e);
return false;
}
} else if (element instanceof ArduinoLibrary) {
return false;
} else {
@ -61,8 +70,22 @@ public class LibrariesPropertyPage extends PropertyPage {
@Override
public Object getParent(Object element) {
if (element instanceof ArduinoLibrary) {
return ((ArduinoLibrary) element).getCategory();
} else if (element instanceof String) {
ArduinoLibrary lib = (ArduinoLibrary) element;
String category = lib.getCategory();
if (category != null) {
return category;
}
try {
ArduinoPlatform platform = getPlatform();
if (platform.getLibrary(lib.getName()) != null) {
return platform;
}
} catch (CoreException e) {
Activator.log(e);
}
return null;
} else if (element instanceof String || element instanceof ArduinoPlatform) {
return index;
} else {
return null;
@ -71,15 +94,32 @@ public class LibrariesPropertyPage extends PropertyPage {
@Override
public Object[] getElements(Object inputElement) {
return ((LibraryIndex) inputElement).getCategories().toArray(new String[0]);
List<Object> categories = new ArrayList<>();
try {
ArduinoPlatform platform = getPlatform();
categories.add(platform);
} catch (CoreException e) {
Activator.log(e);
}
categories.addAll(((LibraryIndex) inputElement).getCategories());
return categories.toArray();
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof String) {
return index.getLibraries((String) parentElement).toArray(new ArduinoLibrary[0]);
} else if (parentElement instanceof ArduinoPlatform) {
try {
return ((ArduinoPlatform) parentElement).getLibraries().toArray();
} catch (CoreException e) {
Activator.log(e);
return new Object[0];
}
} else {
return null;
return new Object[0];
}
}
}
@ -94,6 +134,8 @@ public class LibrariesPropertyPage extends PropertyPage {
public String getColumnText(Object element, int columnIndex) {
if (element instanceof String) {
return columnIndex == 0 ? (String) element : null;
} else if (element instanceof ArduinoPlatform) {
return columnIndex == 0 ? ((ArduinoPlatform) element).getName() : null;
} else if (element instanceof ArduinoLibrary) {
switch (columnIndex) {
case 0:
@ -139,6 +181,7 @@ public class LibrariesPropertyPage extends PropertyPage {
}
}
}, true) {
@Override
protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
return new ContainerCheckedTreeViewer(parent, style);
@ -171,8 +214,16 @@ public class LibrariesPropertyPage extends PropertyPage {
} catch (CoreException e) {
Activator.log(e);
}
return comp;
}
private IProject getProject() {
return getElement().getAdapter(IProject.class);
}
private ArduinoPlatform getPlatform() throws CoreException {
return getProject().getActiveBuildConfig().getAdapter(ArduinoBuildConfiguration.class).getBoard().getPlatform();
}
@Override
@ -187,7 +238,7 @@ public class LibrariesPropertyPage extends PropertyPage {
}
}
try {
ArduinoManager.instance.setLibraries(getElement().getAdapter(IProject.class), libs);
ArduinoManager.instance.setLibraries(getProject(), libs);
} catch (CoreException e) {
Activator.log(e);
}