1
0
mirror of https://github.com/arduino/Arduino.git synced 2025-02-18 12:54:25 +01:00
Matthijs Kooijman f7fdd08695 Do not show invalid sketch filename warnings on reload
With this commit, any warnings about invalid sketch filenames are not
shown when the sketch is reloaded. This reloading happens whenever the
IDE window is focused, so re-logging warnings all the time isn't really
helpful, so this hides them.
2016-08-26 16:42:44 +02:00

228 lines
6.0 KiB
Java

package processing.app;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import processing.app.helpers.FileUtils;
import static processing.app.I18n.tr;
public class SketchData {
public static final List<String> SKETCH_EXTENSIONS = Arrays.asList("ino", "pde");
public static final List<String> OTHER_ALLOWED_EXTENSIONS = Arrays.asList("c", "cpp", "h", "hh", "hpp", "s");
public static final List<String> EXTENSIONS = Stream.concat(SKETCH_EXTENSIONS.stream(), OTHER_ALLOWED_EXTENSIONS.stream()).collect(Collectors.toList());
/**
* main pde file for this sketch.
*/
private File primaryFile;
/**
* folder that contains this sketch
*/
private File folder;
/**
* data folder location for this sketch (may not exist yet)
*/
private File dataFolder;
/**
* code folder location for this sketch (may not exist yet)
*/
private File codeFolder;
/**
* Name of sketch, which is the name of main file (without .pde or .java
* extension)
*/
private String name;
private List<SketchCode> codes = new ArrayList<SketchCode>();
private static final Comparator<SketchCode> CODE_DOCS_COMPARATOR = new Comparator<SketchCode>() {
@Override
public int compare(SketchCode x, SketchCode y) {
if (x.isPrimary() && !y.isPrimary())
return -1;
if (y.isPrimary() && !x.isPrimary())
return 1;
return x.getFileName().compareTo(y.getFileName());
}
};
/**
* Create a new SketchData object, and looks at the sketch directory
* on disk to get populate the list of files in this sketch.
*
* @param file
* The primary file for this sketch.
*/
SketchData(File file) throws IOException {
primaryFile = file;
// get the name of the sketch by chopping .pde or .java
// off of the main file name
String mainFilename = primaryFile.getName();
int suffixLength = getDefaultExtension().length() + 1;
name = mainFilename.substring(0, mainFilename.length() - suffixLength);
folder = new File(file.getParent());
codeFolder = new File(folder, "code");
dataFolder = new File(folder, "data");
codes = listSketchFiles(true);
}
static public File checkSketchFile(File file) {
// check to make sure that this .pde file is
// in a folder of the same name
String fileName = file.getName();
File parent = file.getParentFile();
String parentName = parent.getName();
String pdeName = parentName + ".pde";
File altPdeFile = new File(parent, pdeName);
String inoName = parentName + ".ino";
File altInoFile = new File(parent, inoName);
if (pdeName.equals(fileName) || inoName.equals(fileName))
return file;
if (altPdeFile.exists())
return altPdeFile;
if (altInoFile.exists())
return altInoFile;
return null;
}
/**
* Reload the list of files. This checks the sketch directory on disk,
* to see if any files were added or removed. This does *not* check
* the contents of the files, just their presence.
*
* @return true when the list of files was changed, false when it was
* not.
*/
public boolean reload() throws IOException {
List<SketchCode> reloaded = listSketchFiles(false);
if (!reloaded.equals(codes)) {
codes = reloaded;
return true;
}
return false;
}
/**
* Scan this sketch's directory for files that should be loaded as
* part of this sketch. Doesn't modify this SketchData instance, just
* returns a filtered and sorted list of File objects ready to be
* passed to the SketchCode constructor.
*
* @param showWarnings
* When true, any invalid filenames will show a warning.
*/
private List<SketchCode> listSketchFiles(boolean showWarnings) throws IOException {
Set<SketchCode> result = new TreeSet<>(CODE_DOCS_COMPARATOR);
for (File file : FileUtils.listFiles(folder, false, EXTENSIONS)) {
if (BaseNoGui.isSanitaryName(file.getName())) {
result.add(new SketchCode(file, file.equals(primaryFile)));
} else if (showWarnings) {
System.err.println(I18n.format(tr("File name {0} is invalid: ignored"), file.getName()));
}
}
if (result.size() == 0)
throw new IOException(tr("No valid code files found"));
return new ArrayList<>(result);
}
public void save() throws IOException {
for (SketchCode code : getCodes()) {
if (code.isModified())
code.save();
}
}
public int getCodeCount() {
return codes.size();
}
public SketchCode[] getCodes() {
return codes.toArray(new SketchCode[0]);
}
/**
* Returns the default extension for this editor setup.
*/
public String getDefaultExtension() {
return "ino";
}
/**
* Returns a file object for the primary .pde of this sketch.
*/
public File getPrimaryFile() {
return primaryFile;
}
/**
* Returns path to the main .pde file for this sketch.
*/
public String getMainFilePath() {
return primaryFile.getAbsolutePath();
//return code[0].file.getAbsolutePath();
}
public void addCode(SketchCode sketchCode) {
codes.add(sketchCode);
}
protected void replaceCode(SketchCode newCode) {
for (SketchCode code : codes) {
if (code.getFileName().equals(newCode.getFileName())) {
codes.set(codes.indexOf(code), newCode);
return;
}
}
}
protected void sortCode() {
Collections.sort(codes, CODE_DOCS_COMPARATOR);
}
public SketchCode getCode(int i) {
return codes.get(i);
}
protected void removeCode(SketchCode which) {
if (!codes.remove(which))
System.err.println("removeCode: internal error.. could not find code");
}
public int indexOfCode(SketchCode who) {
return codes.indexOf(who);
}
public String getName() {
return name;
}
public File getFolder() {
return folder;
}
public File getDataFolder() {
return dataFolder;
}
public File getCodeFolder() {
return codeFolder;
}
}