mirror of
https://github.com/processing/processing4.git
synced 2026-02-03 13:49:18 +01:00
462 lines
14 KiB
Java
462 lines
14 KiB
Java
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
|
|
/*
|
|
PdePreferences - controls user preferences
|
|
Part of the Processing project - http://Proce55ing.net
|
|
|
|
Copyright (c) 2001-03
|
|
Ben Fry, Massachusetts Institute of Technology and
|
|
Casey Reas, Interaction Design Institute Ivrea
|
|
|
|
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
|
|
*/
|
|
|
|
import java.awt.*;
|
|
import java.awt.event.*;
|
|
import java.io.*;
|
|
import java.net.*;
|
|
import java.util.*;
|
|
import java.util.zip.*;
|
|
|
|
import javax.swing.*;
|
|
import javax.swing.border.*;
|
|
import javax.swing.event.*;
|
|
import javax.swing.text.*;
|
|
import javax.swing.undo.*;
|
|
|
|
/*
|
|
#ifndef RXTX
|
|
import javax.comm.*;
|
|
#else
|
|
import gnu.io.*;
|
|
#endif
|
|
*/
|
|
|
|
|
|
/*
|
|
need to bring all the prefs into here
|
|
PdeEditor with its sketch.properties
|
|
and PdeBase with pde.properties
|
|
|
|
on first run:
|
|
processing.properties is created in user.home
|
|
it contains the contents of
|
|
pde.properties + pde_platform.properties
|
|
and then begins writing additional sketch.properties stuff
|
|
*/
|
|
public class PdePreferences extends JComponent {
|
|
|
|
// gui variables
|
|
|
|
static final int BIG = 13;
|
|
static final int BETWEEN = 13;
|
|
static final int SMALL = 6;
|
|
|
|
JFrame frame;
|
|
int wide, high;
|
|
|
|
JCheckBox newSketchPrompt;
|
|
JTextField sketchbookLocation;
|
|
|
|
|
|
// data model
|
|
|
|
Properties properties;
|
|
|
|
|
|
public PdePreferences() {
|
|
|
|
// load preferences
|
|
|
|
properties = new Properties();
|
|
try {
|
|
//properties.load(new FileInputStream("lib/pde.properties"));
|
|
//#URL where = getClass().getResource("PdeBase.class");
|
|
//System.err.println(where);
|
|
//System.getProperties().list(System.err);
|
|
//System.err.println("userdir = " + System.getProperty("user.dir"));
|
|
|
|
if (PdeBase.platform == PdeBase.MACOSX) {
|
|
//String pkg = "Proce55ing.app/Contents/Resources/Java/";
|
|
//properties.load(new FileInputStream(pkg + "pde.properties"));
|
|
//properties.load(new FileInputStream(pkg + "pde.properties_macosx"));
|
|
properties.load(new FileInputStream("lib/pde.properties"));
|
|
properties.load(new FileInputStream("lib/pde_macosx.properties"));
|
|
|
|
} else if (PdeBase.platform == PdeBase.MACOS9) {
|
|
properties.load(new FileInputStream("lib/pde.properties"));
|
|
properties.load(new FileInputStream("lib/pde_macos9.properties"));
|
|
|
|
} else {
|
|
// under win95, current dir not set properly
|
|
// so using a relative url like "lib/" won't work
|
|
properties.load(getClass().getResource("pde.properties").openStream());
|
|
String platformProps = "pde_" + platforms[platform] + ".properties";
|
|
properties.load(getClass().getResource(platformProps).openStream());
|
|
}
|
|
//properties.list(System.out);
|
|
|
|
} catch (Exception e) {
|
|
System.err.println("Error reading pde.properties");
|
|
e.printStackTrace();
|
|
//System.exit(1);
|
|
}
|
|
|
|
|
|
// setup frame for the prefs
|
|
|
|
frame = new JFrame("Preferences");
|
|
frame.setResizable(false);
|
|
|
|
Container pain = this;
|
|
//Container pain = frame.getContentPane();
|
|
pain.setLayout(null);
|
|
|
|
int top = BIG;
|
|
int left = BIG;
|
|
int right = 0;
|
|
|
|
JLabel label;
|
|
JButton button;
|
|
JComboBox combo;
|
|
Dimension d, d2, d3;
|
|
int h, v, vmax;
|
|
|
|
|
|
// [ ] Prompt for name and folder when creating new sketch
|
|
|
|
newSketchPrompt =
|
|
new JCheckBox("Prompt for name when creating a new sketch");
|
|
pain.add(newSketchPrompt);
|
|
d = newSketchPrompt.getPreferredSize();
|
|
newSketchPrompt.setBounds(left, top, d.width, d.height);
|
|
right = Math.max(right, left + d.width);
|
|
top += d.height + BETWEEN;
|
|
|
|
|
|
// Sketchbook location: [...............................] [ Browse ]
|
|
|
|
label = new JLabel("Sketchbook location:");
|
|
pain.add(label);
|
|
d = label.getPreferredSize();
|
|
|
|
sketchbookLocation = new JTextField(18);
|
|
pain.add(sketchbookLocation);
|
|
d2 = sketchbookLocation.getPreferredSize();
|
|
|
|
button = new JButton("Browse");
|
|
pain.add(button);
|
|
d3 = button.getPreferredSize();
|
|
|
|
// take max height of all components to vertically align em
|
|
vmax = Math.max(Math.max(d.height, d2.height), d3.height);
|
|
label.setBounds(left, top + (vmax-d.height)/2,
|
|
d.width, d.height);
|
|
h = left + d.width + BETWEEN;
|
|
sketchbookLocation.setBounds(h, top + (vmax-d2.height)/2,
|
|
d2.width, d2.height);
|
|
h += d2.width + BETWEEN;
|
|
button.setBounds(h, top + (vmax-d3.height)/2,
|
|
d3.width, d3.height);
|
|
|
|
right = Math.max(right, h + d3.width + BIG);
|
|
top += vmax + BETWEEN;
|
|
|
|
|
|
// Default serial port: [ COM1 + ]
|
|
|
|
/*
|
|
label = new JLabel("Default serial port:");
|
|
pain.add(label);
|
|
d = label.getPreferredSize();
|
|
|
|
Vector list = buildPortList();
|
|
combo = new JComboBox(list);
|
|
pain.add(combo);
|
|
d2 = combo.getPreferredSize();
|
|
|
|
if (list.size() == 0) {
|
|
label.setEnabled(false);
|
|
combo.setEnabled(false);
|
|
|
|
} else {
|
|
String defaultName = PdeBase.get("serial.port", "unspecified");
|
|
combo.setSelectedItem(defaultName);
|
|
}
|
|
|
|
vmax = Math.max(d.height, d2.height);
|
|
label.setBounds(left, top + (vmax-d.height)/2,
|
|
d.width, d.height);
|
|
h = left + d.width + BETWEEN;
|
|
combo.setBounds(h, top + (vmax-d2.height)/2,
|
|
d2.width, d2.height);
|
|
right = Math.max(right, h + d2.width + BIG);
|
|
top += vmax + BETWEEN;
|
|
*/
|
|
|
|
|
|
// [ ] Use external editor
|
|
|
|
|
|
//
|
|
|
|
String blather =
|
|
"More preferences are in the 'lib' folder inside text files\n" +
|
|
"named pde.properties and pde_" +
|
|
PdeBase.platforms[PdeBase.platform] + ".properties";
|
|
|
|
JTextArea textarea = new JTextArea(blather);
|
|
textarea.setBorder(new EmptyBorder(SMALL, SMALL, SMALL, SMALL));
|
|
textarea.setFont(new Font("Dialog", Font.PLAIN, 12));
|
|
pain.add(textarea);
|
|
|
|
//pain.add(label);
|
|
d = textarea.getPreferredSize();
|
|
textarea.setBounds(left, top, d.width, d.height);
|
|
top += d.height + BETWEEN;
|
|
|
|
//
|
|
|
|
wide = right + BIG;
|
|
high = top + BIG;
|
|
setSize(wide, high);
|
|
|
|
Container content = frame.getContentPane();
|
|
content.setLayout(new BorderLayout());
|
|
content.add(this, BorderLayout.CENTER);
|
|
|
|
frame.pack();
|
|
|
|
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
|
|
frame.setLocation((screen.width - wide) / 2,
|
|
(screen.height - high) / 2);
|
|
|
|
//
|
|
|
|
frame.addWindowListener(new WindowAdapter() {
|
|
public void windowClosing(WindowEvent e) {
|
|
handleQuit();
|
|
}
|
|
});
|
|
//frame.show();
|
|
}
|
|
|
|
|
|
public void showFrame() {
|
|
frame.show();
|
|
}
|
|
|
|
|
|
// open the last-used sketch, etc
|
|
public void apply() {
|
|
}
|
|
|
|
|
|
public void init() {
|
|
// load the last program that was in use
|
|
|
|
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
|
|
int windowX = -1, windowY = 0, windowW = 0, windowH = 0;
|
|
|
|
Properties skprops = new Properties();
|
|
try {
|
|
if (PdeBase.platform == PdeBase.MACOSX) {
|
|
//String pkg = "Proce55ing.app/Contents/Resources/Java/";
|
|
//skprops.load(new FileInputStream(pkg + "sketch.properties"));
|
|
skprops.load(new FileInputStream("lib/sketch.properties"));
|
|
|
|
} else if (PdeBase.platform == PdeBase.MACOS9) {
|
|
skprops.load(new FileInputStream("lib/sketch.properties"));
|
|
|
|
} else {
|
|
skprops.load(getClass().getResource("sketch.properties").openStream());
|
|
}
|
|
|
|
windowX = Integer.parseInt(skprops.getProperty("window.x", "-1"));
|
|
windowY = Integer.parseInt(skprops.getProperty("window.y", "-1"));
|
|
windowW = Integer.parseInt(skprops.getProperty("window.w", "-1"));
|
|
windowH = Integer.parseInt(skprops.getProperty("window.h", "-1"));
|
|
|
|
// if screen size has changed, the window coordinates no longer
|
|
// make sense, so don't use them unless they're identical
|
|
int screenW = Integer.parseInt(skprops.getProperty("screen.w", "-1"));
|
|
int screenH = Integer.parseInt(skprops.getProperty("screen.h", "-1"));
|
|
|
|
if ((screen.width != screenW) || (screen.height != screenH)) {
|
|
// probably not valid for this machine, so invalidate sizing
|
|
windowX = -1;
|
|
}
|
|
|
|
String name = skprops.getProperty("sketch.name");
|
|
String path = skprops.getProperty("sketch.directory");
|
|
String user = skprops.getProperty("user.name");
|
|
|
|
String what = path + File.separator + name + ".pde";
|
|
|
|
if (windowX != -1) {
|
|
String dividerLocation =
|
|
skprops.getProperty("editor.divider.location");
|
|
if (dividerLocation != null) {
|
|
splitPane.setDividerLocation(Integer.parseInt(dividerLocation));
|
|
}
|
|
}
|
|
|
|
if (new File(what).exists()) {
|
|
userName = user;
|
|
skOpen(path, name);
|
|
|
|
} else {
|
|
userName = "default";
|
|
skNew();
|
|
}
|
|
|
|
String serialPort = skprops.getProperty("serial.port");
|
|
if (serialPort != null) {
|
|
PdeBase.properties.put("serial.port", serialPort);
|
|
}
|
|
|
|
boolean ee = new Boolean(skprops.getProperty("editor.external", "false")).booleanValue();
|
|
setExternalEditor(ee);
|
|
|
|
} catch (Exception e) {
|
|
// this exception doesn't matter, it's just the normal course of things
|
|
// the app reaches here when no sketch.properties file exists
|
|
//e.printStackTrace();
|
|
|
|
// indicator that this is the first time this feller has used p5
|
|
PdeBase.firstTime = true;
|
|
|
|
// even if folder for 'default' user doesn't exist, or
|
|
// sketchbook itself is missing, mkdirs() will make it happy
|
|
userName = "default";
|
|
|
|
// doesn't exist, not available, make my own
|
|
skNew();
|
|
}
|
|
|
|
if (windowX == -1) {
|
|
//System.out.println("using defaults for window size");
|
|
windowW = PdeBase.getInteger("window.width", 500);
|
|
windowH = PdeBase.getInteger("window.height", 500);
|
|
windowX = (screen.width - windowW) / 2;
|
|
windowY = (screen.height - windowH) / 2;
|
|
}
|
|
//PdeBase.frame.setBounds(windowX, windowY, windowW, windowH);
|
|
base.setBounds(windowX, windowY, windowW, windowH);
|
|
//rebuildSketchbookMenu(PdeBase.sketchbookMenu);
|
|
}
|
|
|
|
/*
|
|
externalEditorItem = new CheckboxMenuItem("Use External Editor");
|
|
externalEditorItem.addItemListener(new ItemListener() {
|
|
public void itemStateChanged(ItemEvent e) {
|
|
//System.out.println(e);
|
|
if (e.getStateChange() == ItemEvent.SELECTED) {
|
|
editor.setExternalEditor(true);
|
|
} else {
|
|
editor.setExternalEditor(false);
|
|
}
|
|
}
|
|
});
|
|
menu.add(externalEditorItem);
|
|
*/
|
|
|
|
|
|
public Dimension getPreferredSize() {
|
|
return new Dimension(wide, high);
|
|
}
|
|
|
|
|
|
/*
|
|
class SerialMenuListener implements ItemListener {
|
|
//public SerialMenuListener() { }
|
|
|
|
public void itemStateChanged(ItemEvent e) {
|
|
int count = serialMenu.getItemCount();
|
|
for (int i = 0; i < count; i++) {
|
|
((CheckboxMenuItem)serialMenu.getItem(i)).setState(false);
|
|
}
|
|
CheckboxMenuItem item = (CheckboxMenuItem)e.getSource();
|
|
item.setState(true);
|
|
String name = item.getLabel();
|
|
//System.out.println(item.getLabel());
|
|
PdeBase.properties.put("serial.port", name);
|
|
//System.out.println("set to " + get("serial.port"));
|
|
}
|
|
}
|
|
*/
|
|
|
|
|
|
/*
|
|
protected Vector buildPortList() {
|
|
// get list of names for serial ports
|
|
// have the default port checked (if present)
|
|
Vector list = new Vector();
|
|
|
|
//SerialMenuListener listener = new SerialMenuListener();
|
|
boolean problem = false;
|
|
|
|
// if this is failing, it may be because
|
|
// lib/javax.comm.properties is missing.
|
|
// java is weird about how it searches for java.comm.properties
|
|
// so it tends to be very fragile. i.e. quotes in the CLASSPATH
|
|
// environment variable will hose things.
|
|
try {
|
|
//System.out.println("building port list");
|
|
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
|
|
while (portList.hasMoreElements()) {
|
|
CommPortIdentifier portId =
|
|
(CommPortIdentifier) portList.nextElement();
|
|
//System.out.println(portId);
|
|
|
|
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
|
|
//if (portId.getName().equals(port)) {
|
|
String name = portId.getName();
|
|
//CheckboxMenuItem mi =
|
|
//new CheckboxMenuItem(name, name.equals(defaultName));
|
|
|
|
//mi.addItemListener(listener);
|
|
//serialMenu.add(mi);
|
|
list.addElement(name);
|
|
}
|
|
}
|
|
} catch (UnsatisfiedLinkError e) {
|
|
e.printStackTrace();
|
|
problem = true;
|
|
|
|
} catch (Exception e) {
|
|
System.out.println("exception building serial menu");
|
|
e.printStackTrace();
|
|
}
|
|
|
|
//if (serialMenu.getItemCount() == 0) {
|
|
//System.out.println("dimming serial menu");
|
|
//serialMenu.setEnabled(false);
|
|
//}
|
|
|
|
// only warn them if this is the first time
|
|
if (problem && PdeBase.firstTime) {
|
|
JOptionPane.showMessageDialog(this, //frame,
|
|
"Serial port support not installed.\n" +
|
|
"Check the readme for instructions\n" +
|
|
"if you need to use the serial port. ",
|
|
"Serial Port Warning",
|
|
JOptionPane.WARNING_MESSAGE);
|
|
}
|
|
return list;
|
|
}
|
|
*/
|
|
}
|