1107 lines
38 KiB
Java
1107 lines
38 KiB
Java
|
/*
|
||
|
|
||
|
Copyright 2006 Rene Grothmann, modified by Eric Hakenholz
|
||
|
|
||
|
This file is part of C.a.R. software.
|
||
|
|
||
|
C.a.R. is a 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, version 3 of the License.
|
||
|
|
||
|
C.a.R. 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, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
*/
|
||
|
package rene.gui;
|
||
|
|
||
|
import eric.GUI.pipe_tools;
|
||
|
import eric.GUI.window.MenuBar;
|
||
|
import eric.GUI.window.tab_btn;
|
||
|
import eric.GUI.window.tab_main_panel;
|
||
|
import eric.JBrowserLauncher;
|
||
|
import eric.JLogoWindow;
|
||
|
import eric.JZirkelCanvas;
|
||
|
import eric.OS;
|
||
|
import eric.bar.JPropertiesBar;
|
||
|
import eric.controls.SliderSnap;
|
||
|
import java.awt.Color;
|
||
|
import java.awt.Desktop;
|
||
|
import java.awt.Font;
|
||
|
import java.awt.Frame;
|
||
|
import java.awt.GraphicsEnvironment;
|
||
|
import java.awt.Point;
|
||
|
import java.awt.Rectangle;
|
||
|
import java.awt.SystemColor;
|
||
|
import java.io.File;
|
||
|
import java.io.FileInputStream;
|
||
|
import java.io.FileOutputStream;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStream;
|
||
|
import java.net.URL;
|
||
|
import java.nio.channels.FileChannel;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.Enumeration;
|
||
|
import java.util.Locale;
|
||
|
import java.util.Properties;
|
||
|
import java.util.ResourceBundle;
|
||
|
import java.util.StringTokenizer;
|
||
|
import java.util.Vector;
|
||
|
import java.util.logging.Level;
|
||
|
import java.util.logging.Logger;
|
||
|
import java.util.regex.Matcher;
|
||
|
import java.util.regex.Pattern;
|
||
|
|
||
|
import javax.swing.JFrame;
|
||
|
import javax.swing.JOptionPane;
|
||
|
import javax.swing.SwingUtilities;
|
||
|
import javax.swing.filechooser.FileSystemView;
|
||
|
import rene.dialogs.Warning;
|
||
|
import rene.util.FileName;
|
||
|
import rene.util.parser.StringParser;
|
||
|
import rene.util.xml.XmlTag;
|
||
|
import rene.util.xml.XmlWriter;
|
||
|
import rene.gui.Global;
|
||
|
import rene.zirkel.ZirkelCanvas;
|
||
|
import rene.zirkel.ZirkelFrame;
|
||
|
import rene.zirkel.construction.Construction;
|
||
|
import rene.zirkel.expression.ExpressionColor;
|
||
|
import rene.zirkel.objects.ConstructionObject;
|
||
|
import rene.zirkel.objects.DriverObject;
|
||
|
import rene.zirkel.objects.UserFunctionObject;
|
||
|
|
||
|
/**
|
||
|
* The Global class.
|
||
|
* <p>
|
||
|
* This class will load a resource bundle with local support. It will set
|
||
|
* various things from this resource file.
|
||
|
*/
|
||
|
public class Global {
|
||
|
// Fonts:
|
||
|
|
||
|
static public Font NormalFont=null, FixedFont=null, BoldFont=null;
|
||
|
static final public String CONFIG=".carmetal_config";
|
||
|
static public String GlobalFont="Dialog";
|
||
|
private static ResourceBundle ericBundle;
|
||
|
private static ResourceBundle reneBundle;
|
||
|
static public String FontURL="";
|
||
|
static public String ChineseFontURL="http://db-maths.nuxit.net/CaRMetal/fonts/fireflysung.zip";
|
||
|
|
||
|
static public void makeFonts() {
|
||
|
NormalFont=createfont("normalfont", "SansSerif", 12, false);
|
||
|
FixedFont=createfont("fixedfont", "Monospaced", 12, false);
|
||
|
BoldFont=createfont("fixedfont", "Monospaced", 12, true);
|
||
|
isNewVersion=true;
|
||
|
}
|
||
|
|
||
|
static {
|
||
|
makeFonts();
|
||
|
}
|
||
|
|
||
|
static public Font createfont(final String name, final String def,
|
||
|
final int defsize, final boolean bold) {
|
||
|
final String fontname=getParameter(name+".name", def);
|
||
|
final String mode=getParameter(name+".mode", "plain");
|
||
|
if (bold||mode.equals("bold")) {
|
||
|
return new Font(fontname, Font.BOLD, getParameter(name+".size",
|
||
|
defsize));
|
||
|
} else if (mode.equals("italic")) {
|
||
|
return new Font(fontname, Font.ITALIC, getParameter(name+".size",
|
||
|
defsize));
|
||
|
} else {
|
||
|
return new Font(fontname, Font.PLAIN, getParameter(name+".size", defsize));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// For heavy objects dependencies :
|
||
|
static private Vector ObjectsToClearList=new Vector();
|
||
|
|
||
|
static public void doClearList() {
|
||
|
final Enumeration e=ObjectsToClearList.elements();
|
||
|
while (e.hasMoreElements()) {
|
||
|
final DriverObject dobj=(DriverObject) e.nextElement();
|
||
|
if (dobj.somethingChanged()) {
|
||
|
dobj.clearChanges();
|
||
|
}
|
||
|
}
|
||
|
ObjectsToClearList.clear();
|
||
|
}
|
||
|
|
||
|
static public void addClearList(final DriverObject oc) {
|
||
|
ObjectsToClearList.add(oc);
|
||
|
}
|
||
|
|
||
|
public static Enumeration names() {
|
||
|
if (reneBundle!=null) {
|
||
|
return reneBundle.getKeys();
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static String name(final String tag, final String def) {
|
||
|
String s;
|
||
|
if (reneBundle==null) {
|
||
|
return def;
|
||
|
}
|
||
|
try {
|
||
|
s=reneBundle.getString(tag);
|
||
|
} catch (final Exception e) {
|
||
|
s=def;
|
||
|
}
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
public static String name(final String tag) {
|
||
|
return name(tag, tag.substring(tag.lastIndexOf(".")+1));
|
||
|
}
|
||
|
|
||
|
static public String Loc(final String s) {
|
||
|
String rep=null;
|
||
|
try {
|
||
|
rep=ericBundle.getString(s);
|
||
|
} catch (Exception e1) {
|
||
|
try {
|
||
|
rep=reneBundle.getString(s);
|
||
|
} catch (Exception e2) {
|
||
|
}
|
||
|
}
|
||
|
return rep;
|
||
|
}
|
||
|
|
||
|
public static void initBundles() {
|
||
|
String lang=getParameter("language", "");
|
||
|
String country=getParameter("country", "");
|
||
|
if (!lang.equals("")) {
|
||
|
try {
|
||
|
Locale.setDefault(new Locale(lang, country));
|
||
|
} catch (final Exception ex) {
|
||
|
Locale.setDefault(new Locale("en", ""));
|
||
|
setParameter("language", "en");
|
||
|
setParameter("country", "");
|
||
|
}
|
||
|
}
|
||
|
ericBundle=ResourceBundle.getBundle("eric/docs/JZirkelProperties");
|
||
|
reneBundle=ResourceBundle.getBundle("rene/zirkel/docs/ZirkelProperties");
|
||
|
}
|
||
|
// Properties:
|
||
|
public static Properties P=new Properties();
|
||
|
static String ConfigName;
|
||
|
|
||
|
public static synchronized Enumeration properties() {
|
||
|
return P.keys();
|
||
|
}
|
||
|
|
||
|
public static synchronized void loadProperties(final InputStream in) {
|
||
|
try {
|
||
|
P=new Properties();
|
||
|
P.load(in);
|
||
|
in.close();
|
||
|
} catch (final Exception e) {
|
||
|
P=new Properties();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized boolean loadPropertiesFromResource(
|
||
|
final String filename) {
|
||
|
try {
|
||
|
final Object G=new Object();
|
||
|
final InputStream in=G.getClass().getResourceAsStream(filename);
|
||
|
P=new Properties();
|
||
|
P.load(in);
|
||
|
in.close();
|
||
|
} catch (final Exception e) {
|
||
|
P=new Properties();
|
||
|
return false;
|
||
|
}
|
||
|
ConfigName=filename;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public static synchronized boolean loadProperties(final String filename) {
|
||
|
ConfigName=filename;
|
||
|
try {
|
||
|
final FileInputStream in=new FileInputStream(filename);
|
||
|
P=new Properties();
|
||
|
P.load(in);
|
||
|
in.close();
|
||
|
} catch (final Exception e) {
|
||
|
P=new Properties();
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public static synchronized void loadProperties(final String dir,
|
||
|
final String filename) {
|
||
|
try {
|
||
|
final Properties p=System.getProperties();
|
||
|
ConfigName=dir+p.getProperty("file.separator")+filename;
|
||
|
loadProperties(ConfigName);
|
||
|
} catch (final Exception e) {
|
||
|
P=new Properties();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized void loadPropertiesInHome(final String filename) {
|
||
|
try {
|
||
|
final Properties p=System.getProperties();
|
||
|
loadProperties(p.getProperty("user.home"), filename);
|
||
|
} catch (final Exception e) {
|
||
|
P=new Properties();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized void clearProperties() {
|
||
|
P=new Properties();
|
||
|
}
|
||
|
|
||
|
public static synchronized void saveProperties(final String text) {
|
||
|
try {
|
||
|
final FileOutputStream out=new FileOutputStream(ConfigName);
|
||
|
P.store(out, text);
|
||
|
// P.save(out,text);
|
||
|
out.close();
|
||
|
} catch (final Exception e) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void saveProperties(final String text, final String filename) {
|
||
|
ConfigName=filename;
|
||
|
saveProperties(text);
|
||
|
}
|
||
|
|
||
|
public static synchronized void setParameter(final String key,
|
||
|
final boolean value) {
|
||
|
if (P==null) {
|
||
|
return;
|
||
|
}
|
||
|
if (value) {
|
||
|
P.put(key, "true");
|
||
|
} else {
|
||
|
P.put(key, "false");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized boolean getParameter(final String key,
|
||
|
final boolean def) {
|
||
|
try {
|
||
|
final String s=P.getProperty(key);
|
||
|
if (s.equals("true")) {
|
||
|
return true;
|
||
|
} else if (s.equals("false")) {
|
||
|
return false;
|
||
|
}
|
||
|
return def;
|
||
|
} catch (final Exception e) {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized String getParameter(final String key,
|
||
|
final String def) {
|
||
|
String res=def;
|
||
|
try {
|
||
|
res=P.getProperty(key);
|
||
|
} catch (final Exception e) {
|
||
|
}
|
||
|
if (res!=null) {
|
||
|
if (res.startsWith("$")) {
|
||
|
res=res.substring(1);
|
||
|
}
|
||
|
return res;
|
||
|
} else {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized void setParameter(final String key, String value) {
|
||
|
if (P==null) {
|
||
|
return;
|
||
|
}
|
||
|
if (value.length()>0&&Character.isSpaceChar(value.charAt(0))) {
|
||
|
value="$"+value;
|
||
|
}
|
||
|
P.put(key, value);
|
||
|
}
|
||
|
|
||
|
public static synchronized int getParameter(final String key, final int def) {
|
||
|
try {
|
||
|
return Integer.parseInt(getParameter(key, ""));
|
||
|
} catch (final Exception e) {
|
||
|
try {
|
||
|
final double x=new Double(getParameter(key, "")).doubleValue();
|
||
|
return (int) x;
|
||
|
} catch (final Exception ex) {
|
||
|
}
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized void setParameter(final String key,
|
||
|
final int value) {
|
||
|
setParameter(key, ""+value);
|
||
|
}
|
||
|
|
||
|
public static synchronized double getParameter(final String key,
|
||
|
final double def) {
|
||
|
try {
|
||
|
return new Double(getParameter(key, "")).doubleValue();
|
||
|
} catch (final Exception e) {
|
||
|
return def;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized void setParameter(final String key,
|
||
|
final double value) {
|
||
|
setParameter(key, ""+value);
|
||
|
}
|
||
|
|
||
|
static public synchronized Color getParameter(final String key,
|
||
|
final Color c) {
|
||
|
final String s=getParameter(key, "");
|
||
|
if (s.equals("")) {
|
||
|
return c;
|
||
|
}
|
||
|
final StringParser p=new StringParser(s);
|
||
|
p.replace(',', ' ');
|
||
|
int red, green, blue;
|
||
|
red=p.parseint();
|
||
|
green=p.parseint();
|
||
|
blue=p.parseint();
|
||
|
try {
|
||
|
return new Color(red, green, blue);
|
||
|
} catch (final RuntimeException e) {
|
||
|
return c;
|
||
|
}
|
||
|
}
|
||
|
static public synchronized ExpressionColor getParameter(final String key,
|
||
|
final ExpressionColor c, ConstructionObject o) {
|
||
|
final String s=getParameter(key, "");
|
||
|
if (s.equals("")) {
|
||
|
return c;
|
||
|
}
|
||
|
final StringParser p=new StringParser(s);
|
||
|
p.replace(',', ' ');
|
||
|
int red, green, blue;
|
||
|
red=p.parseint();
|
||
|
green=p.parseint();
|
||
|
blue=p.parseint();
|
||
|
try {
|
||
|
ExpressionColor exp=new ExpressionColor(o.getConstruction(), o);
|
||
|
exp.setColor(red, green, blue);
|
||
|
return exp;
|
||
|
} catch (final RuntimeException e) {
|
||
|
return c;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static public synchronized Color getParameter(final String key, int red,
|
||
|
int green, int blue) {
|
||
|
final String s=getParameter(key, "");
|
||
|
if (s.equals("")) {
|
||
|
return new Color(red, green, blue);
|
||
|
}
|
||
|
final StringParser p=new StringParser(s);
|
||
|
p.replace(',', ' ');
|
||
|
red=p.parseint();
|
||
|
green=p.parseint();
|
||
|
blue=p.parseint();
|
||
|
try {
|
||
|
return new Color(red, green, blue);
|
||
|
} catch (final RuntimeException e) {
|
||
|
return Color.black;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized void setParameter(final String key, final Color c) {
|
||
|
if (c!=null) {
|
||
|
setParameter(key, ""+c.getRed()+","+c.getGreen()+","+c.getBlue());
|
||
|
} else {
|
||
|
P.remove((Object) key);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Remove a specific Paramater.
|
||
|
*/
|
||
|
public static synchronized void removeParameter(final String key) {
|
||
|
P.remove((Object) key);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Remove all Parameters that start with the string.
|
||
|
*/
|
||
|
public static synchronized void removeAllParameters(final String start) {
|
||
|
final Enumeration e=P.keys();
|
||
|
while (e.hasMoreElements()) {
|
||
|
final String key=(String) e.nextElement();
|
||
|
if (key.startsWith(start)) {
|
||
|
P.remove((Object) key);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set default values for parameters resetDefaults("default.") is the same
|
||
|
* as: setParameter("xxx",getParameter("default.xxx","")); if "default.xxx"
|
||
|
* has a value.
|
||
|
*
|
||
|
* @param defaults
|
||
|
*/
|
||
|
public static synchronized void resetDefaults(final String defaults) {
|
||
|
final Enumeration e=P.keys();
|
||
|
while (e.hasMoreElements()) {
|
||
|
final String key=(String) e.nextElement();
|
||
|
if (key.startsWith(defaults)) {
|
||
|
setParameter(key.substring(defaults.length()), getParameter(
|
||
|
key, ""));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void resetDefaults() {
|
||
|
resetDefaults("default.");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return if I have such a parameter.
|
||
|
*/
|
||
|
public static synchronized boolean haveParameter(final String key) {
|
||
|
try {
|
||
|
final String res=P.getProperty(key);
|
||
|
if (res==null) {
|
||
|
return false;
|
||
|
}
|
||
|
} catch (final Exception e) {
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
// Warnings
|
||
|
static Frame F=null;
|
||
|
|
||
|
public static void warning(final String s) {
|
||
|
if (F==null) {
|
||
|
F=new Frame();
|
||
|
}
|
||
|
final Warning W=new Warning(F, s, name("warning"), false);
|
||
|
W.center();
|
||
|
W.setVisible(true);
|
||
|
// W.show();
|
||
|
}
|
||
|
|
||
|
static public boolean isApplet() {
|
||
|
return pipe_tools.isApplet();
|
||
|
}
|
||
|
|
||
|
// Java Version
|
||
|
public static double getJavaVersion() {
|
||
|
final String version=System.getProperty("java.version");
|
||
|
if (version==null) {
|
||
|
return 0.0;
|
||
|
}
|
||
|
double v=0.0;
|
||
|
final StringTokenizer t=new StringTokenizer(version, ".");
|
||
|
if (t.hasMoreTokens()) {
|
||
|
v=convert(t.nextToken());
|
||
|
} else {
|
||
|
return v;
|
||
|
}
|
||
|
if (t.hasMoreTokens()) {
|
||
|
v=v+convert(t.nextToken())/10;
|
||
|
} else {
|
||
|
return v;
|
||
|
}
|
||
|
if (t.hasMoreTokens()) {
|
||
|
v=v+convert(t.nextToken())/100;
|
||
|
}
|
||
|
return v;
|
||
|
}
|
||
|
|
||
|
public static double convert(final String s) {
|
||
|
try {
|
||
|
return Integer.parseInt(s);
|
||
|
} catch (final Exception e) {
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static synchronized String getUserDir() {
|
||
|
final String dir=System.getProperty("user.dir");
|
||
|
return FileName.canonical(dir);
|
||
|
}
|
||
|
public static Object ExitBlock=new Object();
|
||
|
|
||
|
public static synchronized void exit(final int i) {
|
||
|
synchronized (ExitBlock) {
|
||
|
System.exit(i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static public String getCDPLocaleNumber(final double x, final int prec) {
|
||
|
String s=String.format("%1."+prec+"f", x);
|
||
|
// add a space if number is positive :
|
||
|
if (!s.startsWith("-")) {
|
||
|
s=" "+s;
|
||
|
}
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
static public String getLocaleNumber(final double x, final int prec) {
|
||
|
String s=String.format("%1."+prec+"f", x);
|
||
|
// skip the last 0s of the number
|
||
|
s=s.replaceAll("(,+|\\.+)0+$", "");
|
||
|
s=s.replaceAll("(,+|\\.+)([0-9]*[1-9]+)0+$", "$1$2");
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
static public String getLocaleNumber(final double x, final String type) {
|
||
|
return getLocaleNumber(x, getParameter("digits."+type, 5));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if the current Country uses the comma as decimal separator This
|
||
|
* static method is used for inputs in the properties bar
|
||
|
*
|
||
|
* @return
|
||
|
*/
|
||
|
public static boolean isDecimalWithComma() {
|
||
|
return String.format("%1.1f", 2.2).contains(",");
|
||
|
}
|
||
|
static public ArrayList<String> StartupFiles=new ArrayList();
|
||
|
|
||
|
public static void openHomeDirectoryInDesktop() {
|
||
|
if (OS.isUnix()) {
|
||
|
try {
|
||
|
Runtime.getRuntime().exec("xdg-open "+getHomeDirectory());
|
||
|
return;
|
||
|
} catch (Exception ex) {
|
||
|
}
|
||
|
}
|
||
|
try {
|
||
|
Desktop.getDesktop().open(new File(getHomeDirectory()));
|
||
|
} catch (Exception ex) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static String getHomeDirectory() {
|
||
|
final String SP=System.getProperty("file.separator");
|
||
|
return FileSystemView.getFileSystemView().getDefaultDirectory()+SP+CONFIG+SP;
|
||
|
}
|
||
|
|
||
|
static public void deleteDirectory(File path) {
|
||
|
if( path.exists() ) {
|
||
|
File[] files = path.listFiles();
|
||
|
for(int i=0; i<files.length; i++) {
|
||
|
if(files[i].isDirectory()) {
|
||
|
deleteDirectory(files[i]);
|
||
|
files[i].delete();
|
||
|
}
|
||
|
else {
|
||
|
files[i].delete();
|
||
|
}
|
||
|
}
|
||
|
path.delete();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Old versions of carmetal ( <3.5 ) used to create a visible carmetal_config
|
||
|
// folder in the home directory. This method just rename this folder to an
|
||
|
// invisible ".carmetal_config".
|
||
|
public static void renameOldHomeDirectory() {
|
||
|
final String SP=System.getProperty("file.separator");
|
||
|
final String oldname=FileSystemView.getFileSystemView().getDefaultDirectory()+SP+"carmetal_config";
|
||
|
final String newname=FileSystemView.getFileSystemView().getDefaultDirectory()+SP+CONFIG;
|
||
|
File newDir=new File(newname);
|
||
|
File oldDir=new File(oldname);
|
||
|
if (oldDir.exists()) {
|
||
|
deleteDirectory(newDir);
|
||
|
oldDir.renameTo(new File(newname));
|
||
|
makeWindowConfigFolderInvisible();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// On windows plateform, dot character "." doesn't mean to hide a file
|
||
|
// we need to set the hidden flag for the carmetal_config folder :
|
||
|
public static void makeWindowConfigFolderInvisible() {
|
||
|
if (OS.isWindows()) {
|
||
|
final String SP=System.getProperty("file.separator");
|
||
|
final String newname=FileSystemView.getFileSystemView().getDefaultDirectory()+SP+CONFIG;
|
||
|
String comand="C:\\WINDOWS\\System32\\ATTRIB.EXE +H "+newname;
|
||
|
try {
|
||
|
Runtime.getRuntime().exec(comand);
|
||
|
} catch (IOException ex) {
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static public boolean isLanguage(final String lang, final String country) {
|
||
|
final String lng=Global.getParameter("language", Locale.getDefault().toString().substring(0, 2));
|
||
|
final String cnt=Global.getParameter("country", Locale.getDefault().getCountry().toString());
|
||
|
boolean rep=(lang.equals(lng));
|
||
|
rep=((rep)&&(country.equals(cnt)));
|
||
|
return rep;
|
||
|
}
|
||
|
|
||
|
static public URL getPath(final String s) {
|
||
|
URL myPath=null;
|
||
|
try {
|
||
|
myPath=JZirkelCanvas.class.getResource("/"+s);
|
||
|
} catch (final Exception e) {
|
||
|
}
|
||
|
return myPath;
|
||
|
}
|
||
|
|
||
|
public static void initObjectsProperties() {
|
||
|
setParameter("options.segment.color", getParameter(
|
||
|
"options.segment.color", 1));
|
||
|
setParameter("options.segment.colortype", getParameter(
|
||
|
"options.segment.colortype", 0));
|
||
|
setParameter("options.segment.shownames", getParameter(
|
||
|
"options.segment.shownames", false));
|
||
|
setParameter("options.segment.showvalues", getParameter(
|
||
|
"options.segment.showvalues", false));
|
||
|
setParameter("options.segment.large", getParameter(
|
||
|
"options.segment.large", false));
|
||
|
setParameter("options.segment.bold", getParameter(
|
||
|
"options.segment.bold", false));
|
||
|
setParameter("options.line.color", getParameter(
|
||
|
"options.line.color", 3));
|
||
|
setParameter("options.line.colortype", getParameter(
|
||
|
"options.line.colortype", 0));
|
||
|
setParameter("options.line.shownames", getParameter(
|
||
|
"options.line.shownames", false));
|
||
|
setParameter("options.line.showvalues", false);
|
||
|
setParameter("options.line.large", getParameter(
|
||
|
"options.line.large", false));
|
||
|
setParameter("options.line.bold", getParameter(
|
||
|
"options.line.bold", false));
|
||
|
setParameter("options.point.color", getParameter(
|
||
|
"options.point.color", 2));
|
||
|
setParameter("options.point.colortype", getParameter(
|
||
|
"options.point.colortype", 0));
|
||
|
setParameter("options.point.shownames", getParameter(
|
||
|
"options.point.shownames", false));
|
||
|
setParameter("options.point.large", getParameter(
|
||
|
"options.point.large", false));
|
||
|
setParameter("options.point.bold", getParameter(
|
||
|
"options.point.bold", false));
|
||
|
setParameter("options.point.showvalues", getParameter(
|
||
|
"options.point.showvalues", false));
|
||
|
setParameter("options.circle.color", getParameter(
|
||
|
"options.circle.color", 4));
|
||
|
setParameter("options.circle.colortype", getParameter(
|
||
|
"options.circle.colortype", 0));
|
||
|
setParameter("options.circle.shownames", getParameter(
|
||
|
"options.circle.shownames", false));
|
||
|
setParameter("options.circle.showvalues", getParameter(
|
||
|
"options.circle.showvalues", false));
|
||
|
setParameter("options.circle.filled", getParameter(
|
||
|
"options.circle.filled", false));
|
||
|
setParameter("options.circle.solid", getParameter(
|
||
|
"options.circle.solid", false));
|
||
|
setParameter("options.circle.large", getParameter(
|
||
|
"options.circle.large", false));
|
||
|
setParameter("options.circle.bold", getParameter(
|
||
|
"options.circle.bold", false));
|
||
|
setParameter("options.quadric.color", getParameter(
|
||
|
"options.quadric.color", 4));
|
||
|
setParameter("options.quadric.colortype", getParameter(
|
||
|
"options.quadric.colortype", 0));
|
||
|
setParameter("options.quadric.shownames", getParameter(
|
||
|
"options.quadric.shownames", false));
|
||
|
setParameter("options.quadric.showvalues", getParameter(
|
||
|
"options.quadric.showvalues", false));
|
||
|
setParameter("options.quadric.filled", getParameter(
|
||
|
"options.quadric.filled", false));
|
||
|
setParameter("options.quadric.solid", getParameter(
|
||
|
"options.quadric.solid", false));
|
||
|
setParameter("options.quadric.large", getParameter(
|
||
|
"options.quadric.large", false));
|
||
|
setParameter("options.quadric.bold", getParameter(
|
||
|
"options.quadric.bold", false));
|
||
|
setParameter("options.angle.color", getParameter(
|
||
|
"options.angle.color", 1));
|
||
|
setParameter("options.angle.colortype", getParameter(
|
||
|
"options.angle.colortype", 0));
|
||
|
setParameter("options.angle.shownames", getParameter(
|
||
|
"options.angle.shownames", false));
|
||
|
setParameter("options.angle.showvalues", getParameter(
|
||
|
"options.angle.showvalues", true));
|
||
|
setParameter("options.angle.filled", getParameter(
|
||
|
"options.angle.filled", true));
|
||
|
setParameter("options.angle.solid", getParameter(
|
||
|
"options.angle.solid", false));
|
||
|
setParameter("options.angle.large", getParameter(
|
||
|
"options.angle.large", false));
|
||
|
setParameter("options.angle.bold", getParameter(
|
||
|
"options.angle.bold", false));
|
||
|
setParameter("options.angle.obtuse", getParameter(
|
||
|
"options.angle.obtuse", false));
|
||
|
setParameter("options.area.color", getParameter(
|
||
|
"options.area.color", 1));
|
||
|
setParameter("options.area.colortype", getParameter(
|
||
|
"options.area.colortype", 2));
|
||
|
setParameter("options.area.shownames", getParameter(
|
||
|
"options.area.shownames", false));
|
||
|
setParameter("options.area.showvalues", getParameter(
|
||
|
"options.area.showvalues", false));
|
||
|
setParameter("options.area.filled", getParameter(
|
||
|
"options.area.filled", true));
|
||
|
setParameter("options.area.solid", getParameter(
|
||
|
"options.area.solid", false));
|
||
|
setParameter("options.text.color", getParameter(
|
||
|
"options.text.color", 1));
|
||
|
setParameter("options.text.colortype", getParameter(
|
||
|
"options.text.colortype", 1));
|
||
|
setParameter("options.text.shownames", getParameter(
|
||
|
"options.text.shownames", true));
|
||
|
setParameter("options.text.showvalues", getParameter(
|
||
|
"options.text.showvalues", true));
|
||
|
setParameter("options.locus.color", getParameter(
|
||
|
"options.locus.color", 1));
|
||
|
setParameter("options.locus.colortype", getParameter(
|
||
|
"options.locus.colortype", 0));
|
||
|
setParameter("options.locus.shownames", getParameter(
|
||
|
"options.locus.shownames", false));
|
||
|
setParameter("options.locus.showvalues", getParameter(
|
||
|
"options.locus.showvalues", false));
|
||
|
}
|
||
|
static public boolean isNewVersion=false;
|
||
|
|
||
|
static public boolean isNewVersion() {
|
||
|
return isNewVersion;
|
||
|
}
|
||
|
|
||
|
public static void initProperties() {
|
||
|
if (!getParameter("program.version", "").equals(
|
||
|
name("program.version"))) {
|
||
|
setParameter("program.newversion", true);
|
||
|
setParameter("program.version", name("program.version"));
|
||
|
setParameter("icons", ZirkelFrame.DefaultIcons);
|
||
|
setParameter("selectionsize", 8);
|
||
|
isNewVersion=true;
|
||
|
}
|
||
|
setParameter("comment", getParameter("comment", false));
|
||
|
setParameter("jsdumb", getParameter("jsdumb", true));
|
||
|
setParameter("iconpath", "/rene/zirkel/newicons/");
|
||
|
setParameter("icontype", "png");
|
||
|
if (getParameter("options.smallicons", false)) {
|
||
|
setParameter("iconsize", 24);
|
||
|
} else {
|
||
|
setParameter("iconsize", 32);
|
||
|
}
|
||
|
setParameter("save.includemacros", true);
|
||
|
setParameter("load.clearmacros", false);
|
||
|
setParameter("options.backups", false);
|
||
|
setParameter("options.visual", true);
|
||
|
setParameter("options.filedialog", false);
|
||
|
setParameter("options.restricted", true);
|
||
|
setParameter("options.smallicons", false);
|
||
|
setParameter("options.indicate", true);
|
||
|
setParameter("restricted", false);
|
||
|
setParameter("showgrid", false);
|
||
|
setParameter("simplegraphics", false);
|
||
|
setParameter("quality", true);
|
||
|
setParameter("export.jar", "CaRMetal.jar");
|
||
|
setParameter("iconpath", "/eric/GUI/icons/palette/");
|
||
|
setParameter("background.tile", getParameter(
|
||
|
"background.tile", false));
|
||
|
if (!haveParameter("options.germanpoints")&&Locale.getDefault().getLanguage().equals("de")) {
|
||
|
setParameter("options.germanpoints", true);
|
||
|
}
|
||
|
setPaletteZonePref(Loc("palette.file"));
|
||
|
setPaletteZonePref(Loc("palette.aspect"));
|
||
|
setPaletteZonePref(Loc("palette.function"));
|
||
|
setPaletteZonePref(Loc("palette.test"));
|
||
|
setPaletteZonePref(Loc("palette.controls"));
|
||
|
setPaletteZonePref(Loc("palette.grid"));
|
||
|
setPaletteZonePref(Loc("palette.history"));
|
||
|
setPaletteZonePref(Loc("palette.colors"));
|
||
|
setPaletteZonePref(Loc("palette.sizes"));
|
||
|
setPaletteZonePref(Loc("palette.prec"));
|
||
|
|
||
|
SliderSnap.init();
|
||
|
initObjectsProperties();
|
||
|
|
||
|
}
|
||
|
|
||
|
private static void setPaletteZonePref(String name){
|
||
|
setParameter("hidepalette."+name,getParameter("hidepalette."+name, true));
|
||
|
}
|
||
|
|
||
|
|
||
|
static double VARS[]={1, 2, 3, 4};
|
||
|
|
||
|
public static String Comma_To_Point(final String mynum,
|
||
|
final Construction C, final boolean check) {
|
||
|
if (C==null) {
|
||
|
return mynum;
|
||
|
}
|
||
|
String s=mynum.replace(",", ".");
|
||
|
s=s.replace(";", ",");
|
||
|
if (check) {
|
||
|
try {
|
||
|
final UserFunctionObject V_FONC=new UserFunctionObject(C);
|
||
|
V_FONC.setExpressions("x y z t", s.replace("invalid", "1"));
|
||
|
V_FONC.evaluateF(VARS);
|
||
|
} catch (final Exception ex) {
|
||
|
return mynum;
|
||
|
}
|
||
|
}
|
||
|
if (isDecimalWithComma()) {
|
||
|
return s;
|
||
|
} else {
|
||
|
return mynum;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
static public String AppPath() {
|
||
|
String mypath=System.getProperty("java.class.path");
|
||
|
|
||
|
mypath=mypath.split(System.getProperty("path.separator"))[0];
|
||
|
final String sep=System.getProperty("file.separator");
|
||
|
|
||
|
while (!(mypath.endsWith(sep))) {
|
||
|
mypath=mypath.substring(0, mypath.length()-1);
|
||
|
}
|
||
|
return mypath;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This function will copy files or directories from one location to
|
||
|
* another. note that the source and the destination must be mutually
|
||
|
* exclusive. This function can not be used to copy a directory to a sub
|
||
|
* directory of itself. The function will also have problems if the
|
||
|
* destination files already exist.
|
||
|
*
|
||
|
* @param src
|
||
|
* -- A File object that represents the source for the copy
|
||
|
* @param dest
|
||
|
* -- A File object that represnts the destination for the copy.
|
||
|
* @throws IOException
|
||
|
* if unable to copy.
|
||
|
*/
|
||
|
public static void copyFiles(final File src, final File dest)
|
||
|
throws IOException {
|
||
|
// Check to ensure that the source is valid...
|
||
|
if (!src.exists()) {
|
||
|
throw new IOException("copyFiles: Can not find source: "+src.getAbsolutePath()+".");
|
||
|
} else if (!src.canRead()) { // check to ensure we have rights to the
|
||
|
// source...
|
||
|
throw new IOException("copyFiles: No right to source: "+src.getAbsolutePath()+".");
|
||
|
}
|
||
|
// is this a directory copy?
|
||
|
if (src.isDirectory()) {
|
||
|
if (!dest.exists()) { // does the destination already exist?
|
||
|
// if not we need to make it exist if possible (note this is
|
||
|
// mkdirs not mkdir)
|
||
|
if (!dest.mkdirs()) {
|
||
|
throw new IOException(
|
||
|
"copyFiles: Could not create direcotry: "+dest.getAbsolutePath()+".");
|
||
|
}
|
||
|
}
|
||
|
// get a listing of files...
|
||
|
final String list[]=src.list();
|
||
|
// copy all the files in the list.
|
||
|
for (final String element : list) {
|
||
|
final File dest1=new File(dest, element);
|
||
|
final File src1=new File(src, element);
|
||
|
copyFiles(src1, dest1);
|
||
|
}
|
||
|
} else {
|
||
|
// This was not a directory, so lets just copy the file
|
||
|
FileInputStream fin=null;
|
||
|
|
||
|
FileOutputStream fout=null;
|
||
|
final byte[] buffer=new byte[4096]; // Buffer 4K at a time (you
|
||
|
// can change this).
|
||
|
int bytesRead;
|
||
|
try {
|
||
|
// open the files for input and output
|
||
|
fin=new FileInputStream(src);
|
||
|
fout=new FileOutputStream(dest);
|
||
|
// while bytesRead indicates a successful read, lets write...
|
||
|
while ((bytesRead=fin.read(buffer))>=0) {
|
||
|
fout.write(buffer, 0, bytesRead);
|
||
|
}
|
||
|
} catch (final IOException e) { // Error copying file...
|
||
|
final IOException wrapper=new IOException(
|
||
|
"copyFiles: Unable to copy file: "+src.getAbsolutePath()+"to"+dest.getAbsolutePath()+".");
|
||
|
wrapper.initCause(e);
|
||
|
wrapper.setStackTrace(e.getStackTrace());
|
||
|
throw wrapper;
|
||
|
} finally { // Ensure that the files are closed (if they were open).
|
||
|
if (fin!=null) {
|
||
|
fin.close();
|
||
|
}
|
||
|
if (fout!=null) {
|
||
|
fin.close();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void copyFile(final String inFile, final String outFile) {
|
||
|
FileChannel in=null;
|
||
|
FileChannel out=null;
|
||
|
try {
|
||
|
in=new FileInputStream(inFile).getChannel();
|
||
|
out=new FileOutputStream(outFile).getChannel();
|
||
|
|
||
|
in.transferTo(0, in.size(), out);
|
||
|
} catch (final Exception e) {
|
||
|
} finally {
|
||
|
if (in!=null) {
|
||
|
try {
|
||
|
in.close();
|
||
|
} catch (final Exception e) {
|
||
|
}
|
||
|
}
|
||
|
if (out!=null) {
|
||
|
try {
|
||
|
out.close();
|
||
|
} catch (final Exception e) {
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static String getOpenSaveDirectory() {
|
||
|
return getParameter("opensavedirectory", "");
|
||
|
}
|
||
|
|
||
|
public static void setOpenSaveDirectory(String s) {
|
||
|
setParameter("opensavedirectory", s);
|
||
|
}
|
||
|
static private Rectangle SCREEN=new Rectangle();
|
||
|
|
||
|
public static Rectangle getScreen() {
|
||
|
return (Rectangle) SCREEN.clone();
|
||
|
}
|
||
|
|
||
|
public static int getScreenX() {
|
||
|
return SCREEN.x;
|
||
|
}
|
||
|
|
||
|
public static int getScreenY() {
|
||
|
return SCREEN.y;
|
||
|
}
|
||
|
|
||
|
public static int getScreenW() {
|
||
|
return SCREEN.width;
|
||
|
}
|
||
|
|
||
|
public static int getScreenH() {
|
||
|
return SCREEN.height;
|
||
|
}
|
||
|
|
||
|
public static void DetectDesktopSize() {
|
||
|
// if (OS.isUnix()) {
|
||
|
// // Very dirty trick to solve a very dirty bug on linux java :
|
||
|
// final JFrame myframe=new JFrame();
|
||
|
// myframe.setUndecorated(true);
|
||
|
// myframe.pack();
|
||
|
// final int s=JFrame.ICONIFIED;
|
||
|
// myframe.setExtendedState(s);
|
||
|
// myframe.setVisible(true);
|
||
|
// myframe.setExtendedState(JFrame.MAXIMIZED_BOTH);
|
||
|
// while (myframe.getExtendedState()==s) {
|
||
|
// }
|
||
|
// try {
|
||
|
// SwingUtilities.invokeAndWait(new Runnable() {
|
||
|
//
|
||
|
// public void run() {
|
||
|
// SCREEN.x=myframe.getBounds().x+5;
|
||
|
// SCREEN.y=myframe.getBounds().y+5;
|
||
|
// SCREEN.width=myframe.getBounds().width-10;
|
||
|
// SCREEN.height=myframe.getBounds().height-10;
|
||
|
// if (SCREEN.x<0) {
|
||
|
// SCREEN.x=0;
|
||
|
// }
|
||
|
// myframe.dispose();
|
||
|
// }
|
||
|
// });
|
||
|
// } catch (Exception ex) {
|
||
|
// }
|
||
|
// } else {
|
||
|
// // this is much better on mac and windows :
|
||
|
// GraphicsEnvironment GE=GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||
|
// SCREEN=GE.getMaximumWindowBounds();
|
||
|
// }
|
||
|
// It seems now that all new jre's can handle this (8 octobre 2015) :
|
||
|
GraphicsEnvironment GE=GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||
|
SCREEN=GE.getMaximumWindowBounds();
|
||
|
}
|
||
|
|
||
|
public static void setLanguage(final String lang, final String country) {
|
||
|
try {
|
||
|
changeGlobalFont(lang);
|
||
|
Global.setParameter("language", lang);
|
||
|
Global.setParameter("country", country);
|
||
|
initBundles();
|
||
|
pipe_tools.getContent().rebuiltRightPanel();
|
||
|
MenuBar.reloadMenuBar();
|
||
|
//
|
||
|
// JGlobals.CreatePopertiesBar();
|
||
|
// this.Content.remove(GeneralMenuBar);
|
||
|
// GeneralMenuBar=new JGeneralMenuBar(ZF, this);
|
||
|
// this.Content.add(GeneralMenuBar, 1);
|
||
|
//
|
||
|
// this.ZContent.refreshlanguage();
|
||
|
//
|
||
|
// JPM.dispose();
|
||
|
// JPM=null;
|
||
|
// JPM=new JPaletteManager(ZF, this, IconSize());
|
||
|
// GeneralMenuBar.InitObjectsMenu();
|
||
|
// this.Content.revalidate();
|
||
|
// this.Content.repaint();
|
||
|
// this.ResizeAll();
|
||
|
// // this.pack();
|
||
|
// ZContent.macros.myJML.initMacrosTree();
|
||
|
// JPM.MainPalette.setVisible(true);
|
||
|
} catch (final Exception ex) {
|
||
|
// There were no unicode font for this language :
|
||
|
final int rep=JOptionPane.showConfirmDialog(null,
|
||
|
"Sorry, but the requested font is not installed"+" for this language.\n"+"This language will not be selected.\n\n"+"Do you want to download the necessary font ?",
|
||
|
"Font not installed", JOptionPane.YES_NO_OPTION);
|
||
|
if (rep==JOptionPane.OK_OPTION) {
|
||
|
JBrowserLauncher.openURL(FontURL);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static public void changeGlobalFont(final String lang) throws Exception {
|
||
|
GlobalFont="Dialog";
|
||
|
final Font myfont=new Font(GlobalFont, 0, 12);
|
||
|
if (lang.equals("zh")) {
|
||
|
final String chinesesample="\u4e00";
|
||
|
// if the standard font can't display chinese caracters :
|
||
|
if (!(myfont.canDisplayUpTo(chinesesample)==-1)) {
|
||
|
// if the chinese unicode font is installed :
|
||
|
if (isFontInstalled("AR PL New Sung")) {
|
||
|
GlobalFont="AR PL New Sung";
|
||
|
} else {
|
||
|
FontURL=ChineseFontURL;
|
||
|
throw new Exception();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static public boolean isFontInstalled(final String myfont) {
|
||
|
final Font UF=new Font("this is a weird unknown font", 0, 12);
|
||
|
final Font CF=new Font(myfont, 0, 12);
|
||
|
final boolean notInstalled=(UF.getFontName().equals(CF.getFontName()));
|
||
|
return (!notInstalled);
|
||
|
}
|
||
|
}
|