public static List<File> discover(File folder) { List<File> libraries = new ArrayList<File>(); String[] folderNames = folder.list(junkFolderFilter); // if a bad folder or something like that, this might come back null if (folderNames != null) { // alphabetize list, since it's not always alpha order // replaced hella slow bubble sort with this feller for 0093 Arrays.sort(folderNames, String.CASE_INSENSITIVE_ORDER); for (String potentialName : folderNames) { File baseFolder = new File(folder, potentialName); File libraryFolder = new File(baseFolder, "library"); File libraryJar = new File(libraryFolder, potentialName + ".jar"); // If a .jar file of the same prefix as the folder exists // inside the 'library' subfolder of the sketch if (libraryJar.exists()) { String sanityCheck = Sketch.sanitizeName(potentialName); if (sanityCheck.equals(potentialName)) { libraries.add(baseFolder); } else { String mess = "The library \"" + potentialName + "\" cannot be used.\n" + "Library names must contain only basic letters and numbers.\n" + "(ASCII only and no spaces, and it cannot start with a number)"; Messages.showMessage("Ignoring bad library name", mess); continue; } } } } return libraries; }
/** Start a sketch in tweak mode */ public Runner handleTweak(Sketch sketch, RunnerListener listener, final boolean present) throws SketchException { final JavaEditor editor = (JavaEditor) listener; if (isSketchModified(sketch)) { editor.deactivateRun(); Messages.showMessage( Language.text("menu.file.save"), Language.text("tweak_mode.save_before_tweak")); return null; } // first try to build the unmodified code JavaBuild build = new JavaBuild(sketch); // String appletClassName = build.build(false); String appletClassName = build.build(true); if (appletClassName == null) { // unmodified build failed, so fail return null; } // if compilation passed, modify the code and build again // save the original sketch code of the user editor.initBaseCode(); // check for "// tweak" comment in the sketch boolean requiresTweak = SketchParser.containsTweakComment(editor.baseCode); // parse the saved sketch to get all (or only with "//tweak" comment) numbers final SketchParser parser = new SketchParser(editor.baseCode, requiresTweak); // add our code to the sketch final boolean launchInteractive = editor.automateSketch(sketch, parser); build = new JavaBuild(sketch); appletClassName = build.build(false); if (appletClassName != null) { final Runner runtime = new Runner(build, listener); new Thread( new Runnable() { public void run() { // these block until finished if (present) { runtime.present(null); } else { runtime.launch(null); } // next lines are executed when the sketch quits if (launchInteractive) { editor.initEditorCode(parser.allHandles, false); editor.stopTweakMode(parser.allHandles); } } }) .start(); if (launchInteractive) { // replace editor code with baseCode editor.initEditorCode(parser.allHandles, false); editor.updateInterface(parser.allHandles, parser.colorBoxes); editor.startTweakMode(); } return runtime; } return null; }