/** * Add a file to the sketch. * * <p>Supported code files will be copied to the sketch folder. All other files will be copied to * the "data" folder (which is created if it does not exist yet). * * @return true if successful. */ public boolean addFile(File sourceFile) { String filename = sourceFile.getName(); File destFile = null; boolean isData = false; boolean replacement = false; if (FileUtils.hasExtension(sourceFile, Sketch.EXTENSIONS)) { destFile = new File(sketch.getFolder(), filename); } else { sketch.prepareDataFolder(); destFile = new File(sketch.getDataFolder(), filename); isData = true; } // check whether this file already exists if (destFile.exists()) { Object[] options = {tr("OK"), tr("Cancel")}; String prompt = I18n.format(tr("Replace the existing version of {0}?"), filename); int result = JOptionPane.showOptionDialog( editor, prompt, tr("Replace"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if (result == JOptionPane.YES_OPTION) { replacement = true; } else { return false; } } // If it's a replacement, delete the old file first, // otherwise case changes will not be preserved. // http://dev.processing.org/bugs/show_bug.cgi?id=969 if (replacement) { boolean muchSuccess = destFile.delete(); if (!muchSuccess) { Base.showWarning( tr("Error adding file"), I18n.format(tr("Could not delete the existing ''{0}'' file."), filename), null); return false; } } // make sure they aren't the same file if (isData && sourceFile.equals(destFile)) { Base.showWarning( tr("You can't fool me"), tr( "This file has already been copied to the\n" + "location from which where you're trying to add it.\n" + "I ain't not doin nuthin'."), null); return false; } // in case the user is "adding" the code in an attempt // to update the sketch's tabs if (!sourceFile.equals(destFile)) { try { Base.copyFile(sourceFile, destFile); } catch (IOException e) { Base.showWarning( tr("Error adding file"), I18n.format(tr("Could not add ''{0}'' to the sketch."), filename), e); return false; } } if (!isData) { int tabIndex; if (replacement) { tabIndex = editor.findTabIndex(destFile); editor.getTabs().get(tabIndex).reload(); } else { SketchFile sketchFile; try { sketchFile = sketch.addFile(destFile.getName()); editor.addTab(sketchFile, null); } catch (IOException e) { // This does not pass on e, to prevent showing a backtrace for // "normal" errors. Base.showWarning(tr("Error"), e.getMessage(), null); return false; } tabIndex = editor.findTabIndex(sketchFile); } editor.selectTab(tabIndex); } return true; }
/** * This is called upon return from entering a new file name. (that is, from either newCode or * renameCode after the prompt) This code is almost identical for both the newCode and renameCode * cases, so they're kept merged except for right in the middle where they diverge. */ protected void nameCode(String newName) { // make sure the user didn't hide the sketch folder ensureExistence(); newName = newName.trim(); if (newName.equals("")) return; if (newName.charAt(0) == '.') { Base.showWarning(tr("Problem with rename"), tr("The name cannot start with a period."), null); return; } FileUtils.SplitFile split = FileUtils.splitFilename(newName); if (split.extension.equals("")) split.extension = Sketch.DEFAULT_SKETCH_EXTENSION; if (!Sketch.EXTENSIONS.contains(split.extension)) { String msg = I18n.format(tr("\".{0}\" is not a valid extension."), split.extension); Base.showWarning(tr("Problem with rename"), msg, null); return; } // Sanitize name split.basename = BaseNoGui.sanitizeName(split.basename); newName = split.join(); if (renamingCode) { SketchFile current = editor.getCurrentTab().getSketchFile(); if (current.isPrimary()) { if (!split.extension.equals(Sketch.DEFAULT_SKETCH_EXTENSION)) { Base.showWarning( tr("Problem with rename"), tr("The main file cannot use an extension"), null); return; } // Primary file, rename the entire sketch final File parent = sketch.getFolder().getParentFile(); File newFolder = new File(parent, split.basename); try { sketch.renameTo(newFolder); } catch (IOException e) { // This does not pass on e, to prevent showing a backtrace for // "normal" errors. Base.showWarning(tr("Error"), e.getMessage(), null); return; } editor.base.rebuildSketchbookMenus(); } else { // Non-primary file, rename just that file try { current.renameTo(newName); } catch (IOException e) { // This does not pass on e, to prevent showing a backtrace for // "normal" errors. Base.showWarning(tr("Error"), e.getMessage(), null); return; } } } else { // creating a new file SketchFile file; try { file = sketch.addFile(newName); editor.addTab(file, ""); } catch (IOException e) { // This does not pass on e, to prevent showing a backtrace for // "normal" errors. Base.showWarning(tr("Error"), e.getMessage(), null); return; } editor.selectTab(editor.findTabIndex(file)); } // update the tabs editor.header.rebuild(); }