| /* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ |
| |
| /* |
| SketchCode - data class for a single file inside a sketch |
| Part of the Processing project - http://processing.org |
| |
| Copyright (c) 2004-08 Ben Fry and Casey Reas |
| Copyright (c) 2001-04 Massachusetts Institute of Technology |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software Foundation, |
| Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| package processing.app; |
| |
| import java.io.*; |
| |
| import javax.swing.text.Document; |
| import javax.swing.undo.*; |
| import static processing.app.I18n._; |
| |
| |
| /** |
| * Represents a single tab of a sketch. |
| */ |
| public class SketchCode { |
| /** Pretty name (no extension), not the full file name */ |
| private String prettyName; |
| |
| /** File object for where this code is located */ |
| private File file; |
| |
| /** Extension for this file (no dots, and in lowercase). */ |
| private String extension; |
| |
| /** Text of the program text for this tab */ |
| private String program; |
| |
| /** Document object for this tab. Currently this is a SyntaxDocument. */ |
| private Document document; |
| |
| /** |
| * Undo Manager for this tab, each tab keeps track of their own |
| * Editor.undo will be set to this object when this code is the tab |
| * that's currently the front. |
| */ |
| private UndoManager undo = new UndoManager(); |
| |
| // saved positions from last time this tab was used |
| private int selectionStart; |
| private int selectionStop; |
| private int scrollPosition; |
| |
| private boolean modified; |
| |
| /** name of .java file after preproc */ |
| // private String preprocName; |
| /** where this code starts relative to the concat'd code */ |
| private int preprocOffset; |
| |
| |
| public SketchCode(File file, String extension) { |
| this.file = file; |
| this.extension = extension; |
| |
| makePrettyName(); |
| |
| try { |
| load(); |
| } catch (IOException e) { |
| System.err.println( |
| I18n.format(_("Error while loading code {0}"), file.getName())); |
| } |
| } |
| |
| |
| protected void makePrettyName() { |
| prettyName = file.getName(); |
| int dot = prettyName.indexOf('.'); |
| prettyName = prettyName.substring(0, dot); |
| } |
| |
| |
| public File getFile() { |
| return file; |
| } |
| |
| |
| protected boolean fileExists() { |
| return file.exists(); |
| } |
| |
| |
| protected boolean fileReadOnly() { |
| return !file.canWrite(); |
| } |
| |
| |
| protected boolean deleteFile() { |
| return file.delete(); |
| } |
| |
| |
| protected boolean renameTo(File what, String ext) { |
| boolean success = file.renameTo(what); |
| if (success) { |
| file = what; |
| extension = ext; |
| makePrettyName(); |
| } |
| return success; |
| } |
| |
| |
| protected void copyTo(File dest) throws IOException { |
| Base.saveFile(program, dest); |
| } |
| |
| |
| public String getFileName() { |
| return file.getName(); |
| } |
| |
| |
| public String getPrettyName() { |
| return prettyName; |
| } |
| |
| |
| public String getExtension() { |
| return extension; |
| } |
| |
| |
| public boolean isExtension(String what) { |
| return extension.equals(what); |
| } |
| |
| |
| public String getProgram() { |
| return program; |
| } |
| |
| |
| public void setProgram(String replacement) { |
| program = replacement; |
| } |
| |
| |
| public int getLineCount() { |
| return Base.countLines(program); |
| } |
| |
| |
| public void setModified(boolean modified) { |
| this.modified = modified; |
| } |
| |
| |
| public boolean isModified() { |
| return modified; |
| } |
| |
| |
| // public void setPreprocName(String preprocName) { |
| // this.preprocName = preprocName; |
| // } |
| // |
| // |
| // public String getPreprocName() { |
| // return preprocName; |
| // } |
| |
| |
| public void setPreprocOffset(int preprocOffset) { |
| this.preprocOffset = preprocOffset; |
| } |
| |
| |
| public int getPreprocOffset() { |
| return preprocOffset; |
| } |
| |
| |
| public void addPreprocOffset(int extra) { |
| preprocOffset += extra; |
| } |
| |
| |
| public Document getDocument() { |
| return document; |
| } |
| |
| |
| public void setDocument(Document d) { |
| document = d; |
| } |
| |
| |
| public UndoManager getUndo() { |
| return undo; |
| } |
| |
| |
| // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
| |
| |
| // TODO these could probably be handled better, since it's a general state |
| // issue that's read/write from only one location in Editor (on tab switch.) |
| |
| |
| public int getSelectionStart() { |
| return selectionStart; |
| } |
| |
| |
| public int getSelectionStop() { |
| return selectionStop; |
| } |
| |
| |
| public int getScrollPosition() { |
| return scrollPosition; |
| } |
| |
| |
| protected void setState(String p, int start, int stop, int pos) { |
| program = p; |
| selectionStart = start; |
| selectionStop = stop; |
| scrollPosition = pos; |
| } |
| |
| |
| // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
| |
| |
| /** |
| * Load this piece of code from a file. |
| */ |
| public void load() throws IOException { |
| program = Base.loadFile(file); |
| |
| if (program.indexOf('\uFFFD') != -1) { |
| System.err.println( |
| I18n.format( |
| _("\"{0}\" contains unrecognized characters." + |
| "If this code was created with an older version of Processing," + |
| "you may need to use Tools -> Fix Encoding & Reload to update" + |
| "the sketch to use UTF-8 encoding. If not, you may need to" + |
| "delete the bad characters to get rid of this warning."), |
| file.getName() |
| ) |
| ); |
| System.err.println(); |
| } |
| |
| setModified(false); |
| } |
| |
| |
| /** |
| * Save this piece of code, regardless of whether the modified |
| * flag is set or not. |
| */ |
| public void save() throws IOException { |
| // TODO re-enable history |
| //history.record(s, SketchHistory.SAVE); |
| |
| Base.saveFile(program, file); |
| setModified(false); |
| } |
| |
| |
| /** |
| * Save this file to another location, used by Sketch.saveAs() |
| */ |
| public void saveAs(File newFile) throws IOException { |
| Base.saveFile(program, newFile); |
| } |
| } |