/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
Copyright (c) 2012-15 The Processing Foundation
Copyright (c) 2008-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 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.platform;
import java.awt.Desktop;
import java.io.File;
import java.net.URI;
import javax.swing.UIManager;
import com.sun.jna.Library;
import com.sun.jna.Native;
import processing.app.Base;
import processing.app.Preferences;
/**
* Used by Base for platform-specific tweaking, for instance finding the
* sketchbook location using the Windows registry, or OS X event handling.
*
* The methods in this implementation are used by default, and can be
* overridden by a subclass.
*
* These methods throw vanilla-flavored Exceptions, so that error handling
* occurs inside Platform (which will show warnings in some cases).
*
* There is currently no mechanism for adding new platforms, as the setup is
* not automated. We could use getProperty("os.arch") perhaps, but that's
* debatable (could be upper/lowercase, have spaces, etc.. basically we don't
* know if name is proper Java package syntax.)
*/
public class DefaultPlatform {
Base base;
public void initBase(Base base) {
this.base = base;
}
/**
* Set the default L & F. While I enjoy the bounty of the sixteen possible
* exception types that this UIManager method might throw, I feel that in
* just this one particular case, I'm being spoiled by those engineers
* at Sun, those Masters of the Abstractionverse. So instead, I'll pretend
* that I'm not offered eleven dozen ways to report to the user exactly what
* went wrong, and I'll bundle them all into a single catch-all "Exception".
* Because in the end, all I really care about is whether things worked or
* not. And even then, I don't care.
* @throws Exception Just like I said.
*/
public void setLookAndFeel() throws Exception {
String laf = Preferences.get("editor.laf");
if (laf == null || laf.length() == 0) { // normal situation
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} else {
UIManager.setLookAndFeel(laf);
}
}
/**
* Handle any platform-specific languages saving. This is necessary on OS X
* because of how bundles are handled, but perhaps your platform would like
* to Think Different too?
* @param languageCode 2-digit lowercase ISO language code
*/
public void saveLanguage(String languageCode) { }
/**
* This function should throw an exception or return a value.
* Do not return null.
*/
public File getSettingsFolder() throws Exception {
// otherwise make a .processing directory int the user's home dir
File home = new File(System.getProperty("user.home"));
return new File(home, ".processing");
}
/**
* @return if not overridden, a folder named "sketchbook" in user.home.
* @throws Exception so that subclasses can throw a fit
*/
public File getDefaultSketchbookFolder() throws Exception {
return new File(System.getProperty("user.home"), "sketchbook");
}
public void openURL(String url) throws Exception {
Desktop.getDesktop().browse(new URI(url));
}
public boolean openFolderAvailable() {
return Desktop.isDesktopSupported();
}
public void openFolder(File file) throws Exception {
Desktop.getDesktop().open(file);
}
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)Native.loadLibrary("c", CLibrary.class);
int setenv(String name, String value, int overwrite);
String getenv(String name);
int unsetenv(String name);
int putenv(String string);
}
public void setenv(String variable, String value) {
CLibrary clib = CLibrary.INSTANCE;
clib.setenv(variable, value, 1);
}
public String getenv(String variable) {
CLibrary clib = CLibrary.INSTANCE;
return clib.getenv(variable);
}
public int unsetenv(String variable) {
CLibrary clib = CLibrary.INSTANCE;
return clib.unsetenv(variable);
}
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public int getSystemDPI() {
return 96;
}
}