/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
Copyright (c) 2013 The Processing Foundation
Copyright (c) 2011-12 Ben Fry and Casey Reas
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
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.contrib;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import processing.app.Base;
import processing.app.Library;
import processing.app.Messages;
import processing.app.Util;
import processing.app.ui.Editor;
public enum ContributionType {
LIBRARY, MODE, TOOL, EXAMPLES;
public String toString() {
switch (this) {
case LIBRARY:
return "library";
case MODE:
return "mode";
case TOOL:
return "tool";
case EXAMPLES:
return "examples";
}
return null; // should be unreachable
};
/**
* Get this type name as a purtied up, capitalized version.
* @return Mode for mode, Tool for tool, etc.
*/
public String getTitle() {
String lower = toString();
return Character.toUpperCase(lower.charAt(0)) + lower.substring(1);
}
public String getPluralTitle() {
switch (this) {
case LIBRARY:
return "Libraries";
case MODE:
return "Modes";
case TOOL:
return "Tools";
case EXAMPLES:
return "Examples";
}
return null; // should be unreachable
}
// public String getFolderName() {
// return toString();
// /*
// switch (this) {
// case LIBRARY:
// return "libraries";
// case TOOL:
// return "tools";
// case MODE:
// return "modes";
// case EXAMPLES:
// return "examples";
// }
// return null; // should be unreachable
// */
// }
/** Get the name of the properties file for this type of contribution. */
public String getPropertiesName() {
return toString() + ".properties";
}
public File createTempFolder() throws IOException {
return Util.createTempFolder(toString(), "tmp", getSketchbookFolder());
}
public File[] listTempFolders() throws IOException {
File base = getSketchbookFolder();
return base.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
String name = file.getName();
return (file.isDirectory() &&
name.startsWith(toString()) && name.endsWith("tmp"));
}
});
}
public boolean isTempFolderName(String name) {
return name.startsWith(toString()) && name.endsWith("tmp");
}
// public String getTempPrefix() {
// return toString();
// }
//
//
// public String getTempSuffix() {
// return "tmp";
// }
// public String getPropertiesName() {
// return toString() + ".properties";
// }
static public ContributionType fromName(String s) {
if (s != null) {
if ("library".equalsIgnoreCase(s)) {
return LIBRARY;
}
if ("mode".equalsIgnoreCase(s)) {
return MODE;
}
if ("tool".equalsIgnoreCase(s)) {
return TOOL;
}
if ("examples".equalsIgnoreCase(s)) {
return EXAMPLES;
}
}
return null;
}
public File getSketchbookFolder() {
switch (this) {
case LIBRARY:
return Base.getSketchbookLibrariesFolder();
case TOOL:
return Base.getSketchbookToolsFolder();
case MODE:
return Base.getSketchbookModesFolder();
case EXAMPLES:
return Base.getSketchbookExamplesFolder();
}
return null;
}
boolean isCandidate(File potential) {
return (potential.isDirectory() &&
new File(potential, toString()).exists() &&
!isTempFolderName(potential.getName()));
}
/**
* Return a list of directories that have the necessary subfolder for this
* contribution type. For instance, a list of folders that have a 'mode'
* subfolder if this is a ModeContribution.
*/
public File[] listCandidates(File folder) {
return folder.listFiles(new FileFilter() {
public boolean accept(File potential) {
return isCandidate(potential);
}
});
}
/**
* Return the first directory that has the necessary subfolder for this
* contribution type. For instance, the first folder that has a 'mode'
* subfolder if this is a ModeContribution.
*/
File findCandidate(File folder) {
File[] folders = listCandidates(folder);
if (folders.length == 0) {
return null;
} else if (folders.length > 1) {
Messages.log("More than one " + toString() + " found inside " + folder.getAbsolutePath());
}
return folders[0];
}
/**
* Returns true if the type of contribution requires the PDE to restart
* when being added or removed.
*/
boolean requiresRestart() {
return this == ContributionType.TOOL || this == ContributionType.MODE;
}
LocalContribution load(Base base, File folder) {
switch (this) {
case LIBRARY:
//return new Library(folder);
return Library.load(folder);
case TOOL:
return ToolContribution.load(folder);
case MODE:
return ModeContribution.load(base, folder);
case EXAMPLES:
return ExamplesContribution.load(folder);
}
return null;
}
ArrayList<LocalContribution> listContributions(Editor editor) {
ArrayList<LocalContribution> contribs = new ArrayList<LocalContribution>();
switch (this) {
case LIBRARY:
contribs.addAll(editor.getMode().contribLibraries);
break;
case TOOL:
contribs.addAll(editor.getBase().getToolContribs());
break;
case MODE:
contribs.addAll(editor.getBase().getModeContribs());
break;
case EXAMPLES:
contribs.addAll(editor.getBase().getExampleContribs());
break;
}
return contribs;
}
File getBackupFolder() {
return new File(getSketchbookFolder(), "old");
}
File createBackupFolder(StatusPanel status) {
File backupFolder = getBackupFolder();
// if (backupFolder.isDirectory()) {
// status.setErrorMessage("First remove the folder named \"old\" from the " +
// getFolderName() + " folder in the sketchbook.");
// return null;
// }
if (!backupFolder.exists() && !backupFolder.mkdirs()) {
status.setErrorMessage("Could not create a backup folder in the " +
"sketchbook " + toString() + " folder.");
return null;
}
return backupFolder;
}
// /**
// * Create a filter for a specific contribution type.
// * @param type The type, or null for a generic update checker.
// */
// Contribution.Filter createFilter2() {
// return new Contribution.Filter() {
// public boolean matches(Contribution contrib) {
// return contrib.getType() == ContributionType.this;
// }
// };
// }
// static Contribution.Filter createUpdateFilter() {
// return new Contribution.Filter() {
// public boolean matches(Contribution contrib) {
// if (contrib instanceof LocalContribution) {
// return ContributionListing.getInstance().hasUpdates(contrib);
// }
// return false;
// }
// };
// }
}