1195 lines
42 KiB
Java
1195 lines
42 KiB
Java
|
|
||
|
/*
|
||
|
* To change this template, choose Tools | Templates
|
||
|
* and open the template in the editor.
|
||
|
*/
|
||
|
package eric;
|
||
|
|
||
|
import de.erichseifert.vectorgraphics2d.EPSGraphics2D;
|
||
|
import de.erichseifert.vectorgraphics2d.PDFGraphics2D;
|
||
|
import de.erichseifert.vectorgraphics2d.SVGGraphics2D;
|
||
|
import eric.GUI.palette.PaletteManager;
|
||
|
import eric.GUI.pipe_tools;
|
||
|
import eric.GUI.themes;
|
||
|
import eric.GUI.window.LeftPanel;
|
||
|
import eric.GUI.window.MainWindow;
|
||
|
import eric.GUI.window.Open_left_panel_btn;
|
||
|
import eric.GUI.window.Open_middle_panel_btn;
|
||
|
import eric.GUI.window.Open_right_panel_btn;
|
||
|
import eric.GUI.window.RightPanel;
|
||
|
import eric.GUI.window.tab_btn;
|
||
|
import eric.GUI.window.tab_main_panel;
|
||
|
import eric.bar.JPropertiesBar;
|
||
|
import eric.jobs.Base64Coder;
|
||
|
import java.awt.Color;
|
||
|
import java.awt.FileDialog;
|
||
|
import java.awt.Graphics;
|
||
|
import java.awt.Graphics2D;
|
||
|
import java.awt.Image;
|
||
|
import java.awt.Rectangle;
|
||
|
import java.awt.Toolkit;
|
||
|
import java.awt.datatransfer.Clipboard;
|
||
|
import java.awt.datatransfer.DataFlavor;
|
||
|
import java.awt.datatransfer.StringSelection;
|
||
|
import java.awt.datatransfer.Transferable;
|
||
|
import java.awt.datatransfer.UnsupportedFlavorException;
|
||
|
import java.awt.geom.AffineTransform;
|
||
|
import java.io.BufferedInputStream;
|
||
|
import java.io.BufferedOutputStream;
|
||
|
import java.io.BufferedReader;
|
||
|
import java.io.BufferedWriter;
|
||
|
import java.io.ByteArrayInputStream;
|
||
|
import java.io.ByteArrayOutputStream;
|
||
|
import java.io.File;
|
||
|
import java.io.FileInputStream;
|
||
|
import java.io.FileOutputStream;
|
||
|
import java.io.FileWriter;
|
||
|
import java.io.FilenameFilter;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStream;
|
||
|
import java.io.InputStreamReader;
|
||
|
import java.io.OutputStream;
|
||
|
import java.io.OutputStreamWriter;
|
||
|
import java.io.Writer;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.LinkedList;
|
||
|
import java.util.List;
|
||
|
import java.util.regex.Matcher;
|
||
|
import java.util.regex.Pattern;
|
||
|
import java.util.zip.GZIPOutputStream;
|
||
|
import java.util.zip.ZipEntry;
|
||
|
import java.util.zip.ZipInputStream;
|
||
|
import java.util.zip.ZipOutputStream;
|
||
|
import javax.swing.JFileChooser;
|
||
|
import javax.swing.JOptionPane;
|
||
|
import javax.swing.SwingUtilities;
|
||
|
import rene.dialogs.Warning;
|
||
|
import rene.gui.Global;
|
||
|
import rene.util.FileName;
|
||
|
import rene.util.ImageSelection;
|
||
|
import rene.util.PngEncoder;
|
||
|
import rene.zirkel.ZirkelCanvas;
|
||
|
import rene.zirkel.ZirkelFrame;
|
||
|
import rene.zirkel.construction.Construction;
|
||
|
import rene.zirkel.graphics.MainGraphics;
|
||
|
import rene.zirkel.objects.ConstructionObject;
|
||
|
import rene.zirkel.tools.SelectTool;
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @author erichake
|
||
|
*/
|
||
|
public class FileTools {
|
||
|
|
||
|
static private int dlogW=500;
|
||
|
static private int dlogH=400;
|
||
|
static private ArrayList<String> StartupFiles=new ArrayList<String>();
|
||
|
static private boolean isStartup=true;
|
||
|
static private ConstructionObject thekTortue, thekTortue3D; //Dibs
|
||
|
|
||
|
public static void addStartupFile(String filename) {
|
||
|
StartupFiles.add(filename);
|
||
|
}
|
||
|
|
||
|
public static boolean isStartup() {
|
||
|
return isStartup;
|
||
|
}
|
||
|
|
||
|
public static String getCurrentFileSource() throws Exception {
|
||
|
return JZirkelCanvas.getCurrentZC().getFileSource();
|
||
|
}
|
||
|
|
||
|
public static void setCurrentFileSource(String s) throws Exception {
|
||
|
JZirkelCanvas.getCurrentZC().setFileSource(s);
|
||
|
}
|
||
|
|
||
|
/*********************************************
|
||
|
* Simple file part : open and save zir files
|
||
|
*********************************************/
|
||
|
|
||
|
public static void copyAppletTag() {
|
||
|
String tag="<APPLET CODEBASE=\"http://db-maths.nuxit.net/\" ARCHIVE=\"CaRMetal.jar\" CODE=\"Main.class\" WIDTH=\"@width@\" HEIGHT=\"@height@\" ALIGN=\"CENTER\" MAYSCRIPT=\"true\">";
|
||
|
tag+="\n<PARAM NAME=\"source\" VALUE=\"@file_content@\">";
|
||
|
tag+="\n</APPLET>";
|
||
|
tag=tag.replace("@width@", ""+(pipe_tools.getWindowSize().width-2*themes.getVerticalBorderWidth()));
|
||
|
tag=tag.replace("@height@", ""+(pipe_tools.getWindowSize().height-themes.getMenuBarHeight()-themes.getTitleBarHeight()));
|
||
|
tag=tag.replace("@file_content@", getWorkBookSource());
|
||
|
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
|
||
|
StringSelection myclip = new StringSelection(tag);
|
||
|
clipboard.setContents(myclip, null);
|
||
|
}
|
||
|
|
||
|
|
||
|
public static void HTMLWorkBookExport() {
|
||
|
String str;
|
||
|
String content="";
|
||
|
|
||
|
if (!JZirkelCanvas.isWorkBook()) {
|
||
|
saveWorkBookAs();
|
||
|
}
|
||
|
;
|
||
|
|
||
|
if (JZirkelCanvas.isWorkBook()) {
|
||
|
saveWorkBook(JZirkelCanvas.getWorkBookFileName());
|
||
|
String targetpath=FileName.path(JZirkelCanvas.getWorkBookFileName());
|
||
|
String sep=System.getProperty("file.separator");
|
||
|
BufferedReader in;
|
||
|
try {
|
||
|
InputStream input=FileTools.class.getResourceAsStream("/eric/docs/applet.html");
|
||
|
in=new BufferedReader(new InputStreamReader(input));
|
||
|
while ((str=in.readLine())!=null) {
|
||
|
content+=str+"\n";
|
||
|
}
|
||
|
in.close();
|
||
|
} catch (final Exception e) {
|
||
|
return;
|
||
|
}
|
||
|
content=content.replace("@width@", ""+(pipe_tools.getWindowSize().width-2*themes.getVerticalBorderWidth()));
|
||
|
content=content.replace("@height@", ""+(pipe_tools.getWindowSize().height-themes.getMenuBarHeight()-themes.getTitleBarHeight()));
|
||
|
content=content.replace("@file@", FileName.filename(JZirkelCanvas.getWorkBookFileName()));
|
||
|
content=content.replace("@workbook@", FileName.filename(JZirkelCanvas.getWorkBookFileName()));
|
||
|
try {
|
||
|
File aFile=new File(targetpath+sep+"index.html");
|
||
|
Writer output=new BufferedWriter(new FileWriter(aFile));
|
||
|
output.write(content);
|
||
|
output.close();
|
||
|
} catch (Exception e) {
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void HTMLWorkBookExtExport() {
|
||
|
String str;
|
||
|
String content="";
|
||
|
|
||
|
if (!JZirkelCanvas.isWorkBook()) {
|
||
|
saveWorkBookAs();
|
||
|
}
|
||
|
;
|
||
|
|
||
|
if (JZirkelCanvas.isWorkBook()) {
|
||
|
// saveWorkBook(JZirkelCanvas.getWorkBookFileName());
|
||
|
String targetpath=FileName.path(JZirkelCanvas.getWorkBookFileName());
|
||
|
String sep=System.getProperty("file.separator");
|
||
|
BufferedReader in;
|
||
|
try {
|
||
|
InputStream input=FileTools.class.getResourceAsStream("/eric/docs/applet_ext.html");
|
||
|
in=new BufferedReader(new InputStreamReader(input));
|
||
|
while ((str=in.readLine())!=null) {
|
||
|
content+=str+"\n";
|
||
|
}
|
||
|
in.close();
|
||
|
} catch (final Exception e) {
|
||
|
return;
|
||
|
}
|
||
|
content=content.replace("@width@", ""+(pipe_tools.getWindowSize().width-2*themes.getVerticalBorderWidth()));
|
||
|
content=content.replace("@height@", ""+(pipe_tools.getWindowSize().height-themes.getMenuBarHeight()-themes.getTitleBarHeight()));
|
||
|
content=content.replace("@file_content@", getWorkBookSource());
|
||
|
try {
|
||
|
File aFile=new File(targetpath+sep+"index.html");
|
||
|
Writer output=new BufferedWriter(new FileWriter(aFile));
|
||
|
output.write(content);
|
||
|
output.close();
|
||
|
} catch (Exception e) {
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void SaveJarAndLaunchBrowser() {
|
||
|
|
||
|
JZirkelCanvas jzc=JZirkelCanvas.getCurrentJZF();
|
||
|
if (jzc==null) {
|
||
|
return;
|
||
|
}
|
||
|
if (JZirkelCanvas.getFileName()==null) {
|
||
|
return;
|
||
|
}
|
||
|
String targetpath=FileName.path(JZirkelCanvas.getFileName());
|
||
|
String targetfile="index.html";
|
||
|
|
||
|
final String sep=System.getProperty("file.separator");
|
||
|
final String mypath=Global.AppPath();
|
||
|
if (new File(mypath+"CaRMetal.jar").exists()) {
|
||
|
try {
|
||
|
final InputStream in=new FileInputStream(mypath+"CaRMetal.jar");
|
||
|
final OutputStream out=new FileOutputStream(targetpath+sep+"CaRMetal.jar");
|
||
|
final byte[] buf=new byte[1024];
|
||
|
int len;
|
||
|
while ((len=in.read(buf))>0) {
|
||
|
out.write(buf, 0, len);
|
||
|
out.flush();
|
||
|
}
|
||
|
out.close();
|
||
|
in.close();
|
||
|
|
||
|
JBrowserLauncher.openURL(targetpath+sep+targetfile);
|
||
|
|
||
|
} catch (final Exception ex) {
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static String getSwingOpenFile() {
|
||
|
String name=null;
|
||
|
final JFileChooser jfc=new JFileChooser(Global.getOpenSaveDirectory());
|
||
|
jfc.setDialogType(javax.swing.JFileChooser.OPEN_DIALOG);
|
||
|
jfc.setAcceptAllFileFilterUsed(false);
|
||
|
JFileFilter filter=new JFileFilter(Global.Loc("filedialog.js"), ".js");
|
||
|
jfc.addChoosableFileFilter(filter);
|
||
|
jfc.setFileFilter(filter);
|
||
|
filter=new JFileFilter(Global.Loc("filedialog.job"), ".job");
|
||
|
jfc.addChoosableFileFilter(filter);
|
||
|
filter=new JFileFilter(Global.Loc("filedialog.macrofilefilter"), ".mcr");
|
||
|
jfc.addChoosableFileFilter(filter);
|
||
|
filter=new JFileFilter(Global.Loc("filedialog.compressedfilefilter"), ".zirz");
|
||
|
jfc.addChoosableFileFilter(filter);
|
||
|
filter=new JFileFilter(Global.Loc("filedialog.workbook"), ".zirs");
|
||
|
jfc.addChoosableFileFilter(filter);
|
||
|
filter=new JFileFilter(Global.Loc("filedialog.filefilter"), ".zir");
|
||
|
jfc.addChoosableFileFilter(filter);
|
||
|
filter=new JFileFilter(Global.Loc("filedialog.allfiles"), ".zirs,.zir,.zirz,.mcr,.job,.js");
|
||
|
jfc.addChoosableFileFilter(filter);
|
||
|
final int rep=jfc.showOpenDialog(pipe_tools.getFrame());
|
||
|
if (rep==JFileChooser.APPROVE_OPTION) {
|
||
|
name=jfc.getSelectedFile().getAbsolutePath();
|
||
|
Global.setOpenSaveDirectory(FileName.path(name));
|
||
|
}
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
public static String getAWTOpenFile() {
|
||
|
String name="";
|
||
|
FileDialog fd=new FileDialog(pipe_tools.getFrame(),
|
||
|
Global.Loc("filedialog.open"),
|
||
|
FileDialog.LOAD);
|
||
|
fd.setFilenameFilter(new FilenameFilter() {
|
||
|
|
||
|
public boolean accept(File dir, String name) {
|
||
|
return (name.endsWith(".js")||name.endsWith(".mcr")||name.endsWith(".zir")||name.endsWith(".zirs")||name.endsWith(".zirz")||name.endsWith(".job")||name.endsWith(".jobz"));
|
||
|
}
|
||
|
});
|
||
|
fd.setDirectory(Global.getOpenSaveDirectory());
|
||
|
fd.setSize(dlogW, dlogH);
|
||
|
fd.pack();
|
||
|
fd.setVisible(true);
|
||
|
if (fd.getFile()!=null) {
|
||
|
Global.setOpenSaveDirectory(fd.getDirectory());
|
||
|
}
|
||
|
return canonicFileName(fd);
|
||
|
}
|
||
|
|
||
|
public static String getOpenFile() {
|
||
|
if (OS.isUnix()) {
|
||
|
return getSwingOpenFile();
|
||
|
} else {
|
||
|
return getAWTOpenFile();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static String getSwingSaveFile(boolean export) {
|
||
|
String name=null;
|
||
|
final JFileChooser jfc=new JFileChooser(Global.getOpenSaveDirectory());
|
||
|
jfc.setDialogType(javax.swing.JFileChooser.SAVE_DIALOG);
|
||
|
jfc.setAcceptAllFileFilterUsed(false);
|
||
|
JFileFilter filter;
|
||
|
if (export) {
|
||
|
filter=new JFileFilter(Global.Loc("filedialog.allexportfiles"), ".pdf,.eps,.svg,.png");
|
||
|
} else {
|
||
|
filter=new JFileFilter(Global.Loc("filedialog.allfiles"), ".zirs,.zir,.zirz,.mcr,.job");
|
||
|
}
|
||
|
|
||
|
jfc.addChoosableFileFilter(filter);
|
||
|
jfc.setFileFilter(filter);
|
||
|
final int rep=jfc.showSaveDialog(pipe_tools.getFrame());
|
||
|
System.out.println(jfc.getFileFilter().toString());
|
||
|
if (rep==JFileChooser.APPROVE_OPTION) {
|
||
|
name=jfc.getSelectedFile().getAbsolutePath();
|
||
|
Global.setOpenSaveDirectory(FileName.path(name));
|
||
|
}
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
public static String getAWTSaveFile(boolean export) {
|
||
|
String name="";
|
||
|
FileDialog fd=new FileDialog(pipe_tools.getFrame(),
|
||
|
Global.Loc("filedialog.save"),
|
||
|
FileDialog.SAVE);
|
||
|
if (export) {
|
||
|
fd.setFilenameFilter(new FilenameFilter() {
|
||
|
|
||
|
public boolean accept(File dir, String name) {
|
||
|
return (name.endsWith(".pdf")||name.endsWith(".eps")||name.endsWith(".svg")||name.endsWith(".png"));
|
||
|
}
|
||
|
});
|
||
|
} else {
|
||
|
fd.setFilenameFilter(new FilenameFilter() {
|
||
|
|
||
|
public boolean accept(File dir, String name) {
|
||
|
return (name.endsWith(".js")||name.endsWith(".mcr")||name.endsWith(".zir")||name.endsWith(".zirs")||name.endsWith(".zirz")||name.endsWith(".job")||name.endsWith(".jobz"));
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
fd.setDirectory(Global.getOpenSaveDirectory());
|
||
|
fd.setSize(dlogW, dlogH);
|
||
|
fd.pack();
|
||
|
fd.setVisible(true);
|
||
|
if (fd.getFile()!=null) {
|
||
|
Global.setOpenSaveDirectory(fd.getDirectory());
|
||
|
}
|
||
|
return canonicFileName(fd);
|
||
|
}
|
||
|
|
||
|
public static String getSaveFile(boolean export) {
|
||
|
if (OS.isUnix()) {
|
||
|
return getSwingSaveFile(export);
|
||
|
} else {
|
||
|
return getAWTSaveFile(export);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static String canonicFileName(FileDialog fd) {
|
||
|
if (fd.getFile()==null) {
|
||
|
return null;
|
||
|
}
|
||
|
String path=(fd.getDirectory().endsWith(System.getProperty("file.separator")))?fd.getDirectory():fd.getDirectory()+System.getProperty("file.separator");
|
||
|
path+=fd.getFile();
|
||
|
return path;
|
||
|
}
|
||
|
|
||
|
public static boolean validPreferencesFileName(String name) {
|
||
|
return name.endsWith("preferences.txt");
|
||
|
}
|
||
|
|
||
|
public static boolean validZirkelFileName(String name) {
|
||
|
String nme=name.toLowerCase();
|
||
|
return (nme.endsWith(".zir")||nme.endsWith(".zirz")||nme.endsWith(".job")||nme.endsWith(".jobz"));
|
||
|
}
|
||
|
|
||
|
public static boolean validImageFileName(String name) {
|
||
|
String nme=name.toLowerCase();
|
||
|
return (nme.endsWith(".tif")||nme.endsWith(".tiff")||nme.endsWith(".gif")||nme.endsWith(".png")||nme.endsWith(".jpg")||nme.endsWith(".jpeg"));
|
||
|
}
|
||
|
|
||
|
public static void openFile() {
|
||
|
final String filename=getOpenFile();
|
||
|
if (filename!=null) {
|
||
|
if (filename.endsWith(".zirs")) {
|
||
|
openWorkBook(filename);
|
||
|
} else if (filename.endsWith(".mcr")) {
|
||
|
openMacro(filename);
|
||
|
} else if (filename.endsWith(".zir")) {
|
||
|
openFile(filename, null, 0);
|
||
|
} else {
|
||
|
openScript(filename);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void doLoad(final String filename, final InputStream in, final int mode) {
|
||
|
JZirkelCanvas JZF=JZirkelCanvas.getCurrentJZF();
|
||
|
ZirkelFrame ZF=JZirkelCanvas.getCurrentZF();
|
||
|
final ZirkelCanvas ZC=JZirkelCanvas.getCurrentZC();
|
||
|
if (ZC!=null) {
|
||
|
ZC.setMode(mode);
|
||
|
ZF.setinfo("save");
|
||
|
ZC.getConstruction().BackgroundFile=null;
|
||
|
ZF.Background="";
|
||
|
ZC.grab(false);
|
||
|
rene.zirkel.construction.Count.resetAll();
|
||
|
ZF.doload(filename, in);
|
||
|
PaletteManager.initPaletteConsideringMode();
|
||
|
// PaletteManager.fixDPpalette();
|
||
|
ZC.getLocalPreferences();
|
||
|
rene.zirkel.construction.Count.resetAll();
|
||
|
|
||
|
pipe_tools.setWindowComponents();
|
||
|
SwingUtilities.invokeLater(new Runnable() {
|
||
|
|
||
|
public void run() {
|
||
|
ZC.JCM.readXmlTags();
|
||
|
PaletteManager.refresh();
|
||
|
PaletteManager.setSelected_with_clic("move", true);
|
||
|
ZC.runOnLoadScripts();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void doLoadNew3D(final String filename, final InputStream in, final int mode) {
|
||
|
JZirkelCanvas JZF=JZirkelCanvas.getCurrentJZF();
|
||
|
ZirkelFrame ZF=JZirkelCanvas.getCurrentZF();
|
||
|
final ZirkelCanvas ZC=JZirkelCanvas.getCurrentZC();
|
||
|
if (ZC!=null) {
|
||
|
ZC.setMode(mode);
|
||
|
ZF.setinfo("save");
|
||
|
ZC.getConstruction().BackgroundFile=null;
|
||
|
ZF.Background="";
|
||
|
ZC.grab(false);
|
||
|
rene.zirkel.construction.Count.resetAll();
|
||
|
ZF.doload(filename, in);
|
||
|
PaletteManager.initPaletteConsideringMode();
|
||
|
// PaletteManager.fixDPpalette();
|
||
|
ZC.getLocalPreferences();
|
||
|
rene.zirkel.construction.Count.resetAll();
|
||
|
|
||
|
pipe_tools.setWindowComponents();
|
||
|
SwingUtilities.invokeLater(new Runnable() {
|
||
|
|
||
|
public void run() {
|
||
|
ZC.JCM.readXmlTags();
|
||
|
PaletteManager.refresh();
|
||
|
PaletteManager.setSelected_with_clic("bi_3Dcoords", true);
|
||
|
ZC.runOnLoadScripts();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void openMacro(final String filename) {
|
||
|
try {
|
||
|
|
||
|
FileInputStream o=new FileInputStream(filename);
|
||
|
JZirkelCanvas.getCurrentZC().load(o, false, true);
|
||
|
o.close();
|
||
|
} catch (Exception ex) {
|
||
|
}
|
||
|
JZirkelCanvas.ActualiseMacroPanel();
|
||
|
}
|
||
|
|
||
|
private static void openScript(String filename) {
|
||
|
ZirkelCanvas ZC=JZirkelCanvas.getCurrentZC();
|
||
|
if (ZC==null) {
|
||
|
return;
|
||
|
}
|
||
|
if (filename==null) {
|
||
|
return;
|
||
|
}
|
||
|
ZC.openScriptFile(filename, true);
|
||
|
}
|
||
|
|
||
|
public static void openFile(final String filename, final InputStream in, final int mode) {
|
||
|
ZirkelCanvas ZC=JZirkelCanvas.getCurrentZC();
|
||
|
if (ZC==null) {
|
||
|
return;
|
||
|
}
|
||
|
if (filename==null) {
|
||
|
return;
|
||
|
}
|
||
|
if ((filename.endsWith(".zir"))||(filename.endsWith(".zirz"))) {
|
||
|
if (ZC.isEmpty()) {
|
||
|
tab_main_panel.setCurrentTabName(FileName.filename(filename), filename);
|
||
|
|
||
|
} else {
|
||
|
tab_main_panel.createTabAndCanvas(FileName.filename(filename), filename);
|
||
|
}
|
||
|
}
|
||
|
doLoad(filename, in, mode);
|
||
|
JZirkelCanvas.getCurrentJZF().setComments();
|
||
|
JZirkelCanvas.ActualiseMacroPanel();
|
||
|
|
||
|
}
|
||
|
|
||
|
public static void New3DWindow() {
|
||
|
InputStream o;
|
||
|
String Filename;
|
||
|
if (System.getProperty("user.language").equals("fr")) {
|
||
|
o=FileTools.class.getResourceAsStream("/base3D-fr.zir");
|
||
|
Filename="base3D-fr.zir";
|
||
|
}
|
||
|
else if (System.getProperty("user.language").equals("es")) {
|
||
|
o=FileTools.class.getResourceAsStream("/base3D-es.zir");
|
||
|
Filename="base3D-es.zir";
|
||
|
}
|
||
|
else {
|
||
|
o=FileTools.class.getResourceAsStream("/base3D.zir");
|
||
|
Filename="base3D.zir";
|
||
|
}
|
||
|
final ZirkelCanvas zc=JZirkelCanvas.getCurrentZC();
|
||
|
if (!zc.isEmpty()) {
|
||
|
tab_main_panel.newTabBtn();
|
||
|
}
|
||
|
doLoadNew3D(Filename, o, Construction.MODE_3D);
|
||
|
ZirkelFrame zf=JZirkelCanvas.getCurrentZF();
|
||
|
if (zf!=null) {
|
||
|
zf.Filename="";
|
||
|
}
|
||
|
SwingUtilities.invokeLater(new Runnable() {
|
||
|
@Override
|
||
|
public void run() {
|
||
|
if (zc!=null) {
|
||
|
zc.JCM.fix3Dcomments();
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public static void NewDPWindow() {
|
||
|
final InputStream o=FileTools.class.getResourceAsStream("/baseDP.zir");
|
||
|
final String Filename="baseDP.zir";
|
||
|
final ZirkelCanvas zc=JZirkelCanvas.getCurrentZC();
|
||
|
if (!zc.isEmpty()) {
|
||
|
tab_main_panel.newTabBtn();
|
||
|
|
||
|
}
|
||
|
doLoad(Filename, o, Construction.MODE_DP);
|
||
|
ZirkelFrame zf=JZirkelCanvas.getCurrentZF();
|
||
|
if (zf!=null) {
|
||
|
zf.Filename="";
|
||
|
}
|
||
|
// SwingUtilities.invokeLater(new Runnable() {
|
||
|
//
|
||
|
// public void run() {
|
||
|
//// if (zc!=null) {
|
||
|
//// zc.JCM.fixDPcomments();
|
||
|
//// }
|
||
|
// }
|
||
|
// });
|
||
|
}
|
||
|
|
||
|
public static void saveFileAs() {
|
||
|
//if (Media.getMedias().size()>0) {
|
||
|
if (Media.checkMedia()>0) {
|
||
|
JOptionPane.showMessageDialog(JZirkelCanvas.getCurrentZC(), Global.Loc("media.saveas"));
|
||
|
saveWorkBookAs();
|
||
|
} else {
|
||
|
String filename=getSaveFile(false);
|
||
|
if (filename!=null) {
|
||
|
saveFile(filename, false, ".zir", false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void saveFile() {
|
||
|
if (JZirkelCanvas.isWorkBook()) {
|
||
|
saveWorkBook(JZirkelCanvas.getWorkBookFileName());
|
||
|
//} else if (Media.getMedias().size()>0) {
|
||
|
} else if (Media.checkMedia()>0) {
|
||
|
JOptionPane.showMessageDialog(JZirkelCanvas.getCurrentZC(), Global.Loc("media.saveas"));
|
||
|
saveWorkBookAs();
|
||
|
} else {
|
||
|
if (JZirkelCanvas.getCurrentZC()==null) {
|
||
|
return;
|
||
|
}
|
||
|
ZirkelFrame ZF=JZirkelCanvas.getCurrentZF();
|
||
|
ZirkelCanvas ZC=JZirkelCanvas.getCurrentZC();
|
||
|
String filename=(ZF.haveFile())?ZF.Filename:getSaveFile(false);
|
||
|
if (filename!=null) {
|
||
|
saveFile(filename, false, ".zir", !ZF.haveFile());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static boolean ICanSave(final String Fname, final boolean ask) {
|
||
|
if (!ask) {
|
||
|
return true;
|
||
|
}
|
||
|
if (!new File(Fname).exists()) {
|
||
|
return true;
|
||
|
}
|
||
|
return (JOptionPane.showConfirmDialog(null, Global.Loc("filedialog.savemessage1")+Fname+Global.Loc("filedialog.savemessage2"), "",
|
||
|
JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION);
|
||
|
}
|
||
|
|
||
|
private static void doSave(ZirkelCanvas zc, String Filename, OutputStream o) {
|
||
|
try {
|
||
|
if (o==null) {
|
||
|
o=new FileOutputStream(Filename);
|
||
|
if (ZirkelFrame.isCompressed(Filename)) {
|
||
|
o=new GZIPOutputStream(o, 10000);
|
||
|
}
|
||
|
}
|
||
|
zc.save(o, true, true, false, true, zc.getMacros(), "");
|
||
|
o.close();
|
||
|
} catch (Exception e) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void saveFile(String Filename, final boolean restrict, final String ext, final boolean ask) {
|
||
|
if (JZirkelCanvas.getCurrentZC()==null) {
|
||
|
return;
|
||
|
}
|
||
|
if (Filename==null) {
|
||
|
return;
|
||
|
}
|
||
|
ZirkelFrame ZF=JZirkelCanvas.getCurrentZF();
|
||
|
ZirkelCanvas ZC=JZirkelCanvas.getCurrentZC();
|
||
|
thekTortue=ZC.getConstruction().find("kTortue"); // Dibs
|
||
|
if (thekTortue!=null) {
|
||
|
ZC.delete(thekTortue);
|
||
|
}
|
||
|
thekTortue3D=ZC.getConstruction().find("kTortue3D"); // Dibs
|
||
|
if (thekTortue3D!=null) {
|
||
|
ZC.delete(thekTortue3D);
|
||
|
}
|
||
|
if ((!Filename.endsWith(".zirz"))&&(!Filename.endsWith(".zir"))) {
|
||
|
Filename+=ext;
|
||
|
}
|
||
|
if (ICanSave(Filename, ask)) {
|
||
|
// SetMacrosProtectionForSaveProcess(macrostree.JML.MacroTreeTopNode);
|
||
|
OutputStream o;
|
||
|
try {
|
||
|
ZF.ZC.getConstruction().BackgroundFile=ZF.Background;
|
||
|
ZF.ZC.getConstruction().ResizeBackground=Global.getParameter(
|
||
|
"background.usesize", false);
|
||
|
doSave(ZF.ZC, Filename, null);
|
||
|
ZF.Filename=Filename;
|
||
|
if(!JZirkelCanvas.isWorkBook())
|
||
|
tab_main_panel.setCurrentTabName(FileName.filename(Filename), Filename);
|
||
|
} catch (final Exception e) {
|
||
|
final Warning w=new Warning(pipe_tools.getFrame(), Global.Loc("warning.save"),
|
||
|
FileName.chop(32, e.toString(), 64), Global.Loc("warning"), true);
|
||
|
w.center(null);
|
||
|
w.setVisible(true);
|
||
|
}
|
||
|
// ResetMacrosProtection(macrostree.JML.MacroTreeTopNode);
|
||
|
}
|
||
|
pipe_tools.TabHaveChanged(false);
|
||
|
}
|
||
|
|
||
|
/*********************************************
|
||
|
* Workbooks part : open and save zirs files
|
||
|
*********************************************/
|
||
|
public static String getConstruction(ZirkelCanvas zc) {
|
||
|
try {
|
||
|
final ByteArrayOutputStream out=new ByteArrayOutputStream();
|
||
|
doSave(zc, null, out);
|
||
|
return out.toString("utf-8");
|
||
|
} catch (Exception ex) {
|
||
|
return "Error";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void saveWorkBookAs() {
|
||
|
final String filename=getSaveFile(false);
|
||
|
if (filename!=null) {
|
||
|
saveWorkBook(filename);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static String getWorkBookSource() {
|
||
|
String backup="";
|
||
|
try {
|
||
|
ByteArrayOutputStream bout=new ByteArrayOutputStream();
|
||
|
// save the workbook into a byteArray stream :
|
||
|
saveWorkBook(bout);
|
||
|
// then save it into base64 format :
|
||
|
backup=new String(Base64Coder.encode(bout.toByteArray()));
|
||
|
|
||
|
// Make the base64 encoding url safe :
|
||
|
backup=backup.replace("+", "-");
|
||
|
backup=backup.replace("/", "_");
|
||
|
// remove base64 paddings :
|
||
|
backup=backup.replace("=", "");
|
||
|
|
||
|
} catch (Exception ex) {
|
||
|
}
|
||
|
return backup;
|
||
|
}
|
||
|
|
||
|
public static void setWorkBookSource(String s) {
|
||
|
try {
|
||
|
// base64 encoding is url safe. This restore the
|
||
|
// "official" syntax of the string :
|
||
|
s=s.replace("-", "+");
|
||
|
s=s.replace("_", "/");
|
||
|
// restore base64 paddings :
|
||
|
int reste=s.length()%4;
|
||
|
if (reste==2) {
|
||
|
s+="==";
|
||
|
} else if (reste==3) {
|
||
|
s+="=";
|
||
|
}
|
||
|
|
||
|
byte[] b=Base64Coder.decode(s);
|
||
|
ByteArrayInputStream bin=new ByteArrayInputStream(b);
|
||
|
openWorkBook(null, bin);
|
||
|
} catch (Exception ex) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void saveWorkBook(String filename) {
|
||
|
ZirkelCanvas ZC=JZirkelCanvas.getCurrentZC(); // Dibs
|
||
|
thekTortue=ZC.getConstruction().find("kTortue");
|
||
|
if (thekTortue!=null) {
|
||
|
ZC.delete(thekTortue);
|
||
|
}
|
||
|
thekTortue3D=ZC.getConstruction().find("kTortue3D"); // Dibs
|
||
|
if (thekTortue3D!=null) {
|
||
|
ZC.delete(thekTortue3D);
|
||
|
}
|
||
|
if (filename==null) {
|
||
|
return;
|
||
|
}
|
||
|
if (!filename.endsWith(".zirs")) {
|
||
|
filename+=".zirs";
|
||
|
}
|
||
|
try {
|
||
|
saveWorkBook(new FileOutputStream(filename));
|
||
|
// set workbook mode :
|
||
|
JZirkelCanvas.setWorkBookFileName(filename, true);
|
||
|
} catch (Exception ex) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void saveWorkBook(OutputStream output) {
|
||
|
try {
|
||
|
// Create the ZIP file
|
||
|
|
||
|
ZipOutputStream out=new ZipOutputStream(output);
|
||
|
|
||
|
// Save the workbook :
|
||
|
|
||
|
Progress_Bar.create(Global.Loc("progressbar.workbooksavemessage"), 0, tab_main_panel.getBTNSsize()-1);
|
||
|
|
||
|
for (int i=0; i<tab_main_panel.getBTNSsize(); i++) {
|
||
|
tab_btn btn=tab_main_panel.getBTN(i);
|
||
|
btn.setToolTip(btn.getTabName()+".zir");
|
||
|
ZirkelCanvas ZC=btn.getPanel().getZC();
|
||
|
out.putNextEntry(new ZipEntry(btn.getTabName()+".zir"));
|
||
|
|
||
|
|
||
|
if (btn.getPanel().getByteArrayInputFile()==null) {
|
||
|
ByteArrayOutputStream file=new ByteArrayOutputStream();
|
||
|
doSave(ZC, null, file);
|
||
|
out.write(file.toByteArray());
|
||
|
} else {
|
||
|
out.write(btn.getPanel().getByteArrayInputFile());
|
||
|
}
|
||
|
out.flush();
|
||
|
out.closeEntry();
|
||
|
Progress_Bar.nextValue();
|
||
|
}
|
||
|
for (int i=0; i<Media.getMedias().size(); i++) {
|
||
|
out.putNextEntry(new ZipEntry(Media.getMedias().get(i).getImageFileName()));
|
||
|
out.write(Media.getMedias().get(i).getImageBytes());
|
||
|
}
|
||
|
out.putNextEntry(new ZipEntry("preferences.txt"));
|
||
|
out.write(createPreferencesFile());
|
||
|
|
||
|
Progress_Bar.close();
|
||
|
|
||
|
out.close();
|
||
|
} catch (IOException e) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static byte[] createPreferencesFile() {
|
||
|
String file="** COMMON PART (APPLET and Application) :\n";
|
||
|
file+="\n";
|
||
|
file+="showcomments="+Global.getParameter("comment", true)+"\n";
|
||
|
file+="showpalette="+RightPanel.isPanelVisible()+"\n";
|
||
|
file+="showleftpanel="+LeftPanel.isPanelVisible()+"\n";
|
||
|
file+="showtabs="+(tab_main_panel.getBTNSsize()>1)+"\n";
|
||
|
file+="showstatus="+(tab_main_panel.getBTNSsize()>1)+"\n";
|
||
|
file+="currenttab="+(tab_main_panel.getActiveBtnPos()+1);
|
||
|
file+="\n\n\n";
|
||
|
file+="** APPLICATION SPECIFIC PART :\n";
|
||
|
file+="\n";
|
||
|
file+="window_width="+pipe_tools.getWindowSize().width+"\n";
|
||
|
file+="window_height="+pipe_tools.getWindowSize().height+"\n";
|
||
|
file+="\n";
|
||
|
return file.getBytes();
|
||
|
}
|
||
|
|
||
|
public static void openWorkBook() {
|
||
|
final String filename=getOpenFile();
|
||
|
if (filename!=null) {
|
||
|
openWorkBook(filename);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void openWorkBook(String filename) {
|
||
|
try {
|
||
|
openWorkBook(filename, new FileInputStream(filename));
|
||
|
} catch (Exception ex) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// OpenWork book from Application :
|
||
|
public static void openWorkBook(String filename, InputStream in) {
|
||
|
try {
|
||
|
|
||
|
ZipInputStream zpf=new ZipInputStream(new BufferedInputStream(in));
|
||
|
String prefsFileContent=null;
|
||
|
|
||
|
// remember last tab button :
|
||
|
tab_btn lastbtn=tab_main_panel.getLastBtn();
|
||
|
// remember last tab position before adding new ones :
|
||
|
int last_tab_pos=tab_main_panel.getBTNSsize()-1;
|
||
|
|
||
|
ZipEntry entry;
|
||
|
while ((entry=zpf.getNextEntry())!=null) {
|
||
|
|
||
|
int size;
|
||
|
byte[] buffer=new byte[2048];
|
||
|
|
||
|
ByteArrayOutputStream bos=new ByteArrayOutputStream();
|
||
|
|
||
|
while ((size=zpf.read(buffer, 0, buffer.length))!=-1) {
|
||
|
bos.write(buffer, 0, size);
|
||
|
}
|
||
|
bos.flush();
|
||
|
bos.close();
|
||
|
|
||
|
if (validZirkelFileName(entry.getName())) {
|
||
|
tab_btn curbtn=tab_main_panel.addBtn(entry.getName());
|
||
|
curbtn.getPanel().setInputFile(bos.toByteArray());
|
||
|
} else if (validImageFileName(entry.getName())) {
|
||
|
Media.createMedia(entry.getName(), bos.toByteArray());
|
||
|
} else if (validPreferencesFileName(entry.getName())) {
|
||
|
prefsFileContent=bos.toString("UTF-8");
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// set workbook mode :
|
||
|
if (filename!=null) {
|
||
|
JZirkelCanvas.setWorkBookFileName(filename, false);
|
||
|
}
|
||
|
|
||
|
if (prefsFileContent!=null) {
|
||
|
applyWorkBookPreferences(prefsFileContent, last_tab_pos);
|
||
|
} else {
|
||
|
tab_main_panel.setActiveBtn(1);
|
||
|
tab_main_panel.showActiveBtn();
|
||
|
}
|
||
|
|
||
|
// if last tab canvas is empty, then remove it :
|
||
|
if ((lastbtn.getPanel().getZC().isEmpty())&&(lastbtn.getPanel().getByteArrayInputFile()==null)) {
|
||
|
tab_main_panel.removeBtn(lastbtn);
|
||
|
}
|
||
|
|
||
|
// I know, this is weird, but it work's (for palette display) :
|
||
|
pipe_tools.setWindowComponents();
|
||
|
pipe_tools.setWindowComponents();
|
||
|
Open_left_panel_btn.setmode();
|
||
|
Open_middle_panel_btn.setmode();
|
||
|
Open_right_panel_btn.setmode();
|
||
|
JGeneralMenuBar.initToggleItems();
|
||
|
tab_main_panel.initToggleItems();
|
||
|
} catch (Exception e) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* inside the workbook zirs archive, "preferences.txt" contains properties with
|
||
|
* following structure : <property>=<value>
|
||
|
* @param prefs : content of the "preferences.txt" file
|
||
|
* @param property : the property we want to read
|
||
|
* @return the value of the property
|
||
|
*/
|
||
|
public static String getPref(String prefs, String property) {
|
||
|
Matcher m=Pattern.compile("\\Q"+property+"=\\E(\\w+)\\W", Pattern.MULTILINE).matcher(prefs);
|
||
|
if (m.find()) {
|
||
|
return m.group(1);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Read and apply workbook preferences : "preferences.txt" inside the "zirs" archive
|
||
|
* @param prefs : content of the "preferences.txt" file
|
||
|
* @param last_tab_pos : last tab position before adding the zirs
|
||
|
*/
|
||
|
public static void applyWorkBookPreferences(final String prefs, int last_tab_pos) {
|
||
|
|
||
|
int tabnum=last_tab_pos;
|
||
|
try {
|
||
|
tabnum+=Integer.parseInt(getPref(prefs, "currenttab"));
|
||
|
} catch (Exception e) {
|
||
|
tabnum=last_tab_pos;
|
||
|
}
|
||
|
|
||
|
tab_main_panel.setActiveBtn(tabnum);
|
||
|
tab_main_panel.showActiveBtn();
|
||
|
|
||
|
Global.setParameter("comment", "true".equals(getPref(prefs, "showcomments")));
|
||
|
RightPanel.showPanel("true".equals(getPref(prefs, "showpalette")));
|
||
|
LeftPanel.showPanel("true".equals(getPref(prefs, "showleftpanel")));
|
||
|
if (pipe_tools.isApplet()) {
|
||
|
themes.setShowTabs("true".equals(getPref(prefs, "showtabs")));
|
||
|
themes.setShowStatus("true".equals(getPref(prefs, "showstatus")));
|
||
|
} else {
|
||
|
themes.setShowTabs(true);
|
||
|
themes.setShowStatus(true);
|
||
|
}
|
||
|
try {
|
||
|
int w=Integer.parseInt(getPref(prefs, "window_width"));
|
||
|
int h=Integer.parseInt(getPref(prefs, "window_height"));
|
||
|
pipe_tools.setAndCheckWindowSize(w, h);
|
||
|
} catch (Exception e) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static byte[] copyToByteArray(InputStream in) {
|
||
|
int BUFFER_SIZE=4096;
|
||
|
ByteArrayOutputStream out=new ByteArrayOutputStream(BUFFER_SIZE);
|
||
|
try {
|
||
|
int byteCount=0;
|
||
|
byte[] buffer=new byte[BUFFER_SIZE];
|
||
|
int bytesRead=-1;
|
||
|
while ((bytesRead=in.read(buffer))!=-1) {
|
||
|
out.write(buffer, 0, bytesRead);
|
||
|
byteCount+=bytesRead;
|
||
|
}
|
||
|
out.flush();
|
||
|
in.close();
|
||
|
out.close();
|
||
|
} catch (IOException e) {
|
||
|
}
|
||
|
return out.toByteArray();
|
||
|
}
|
||
|
|
||
|
public static void open(String filename) {
|
||
|
if ((filename.endsWith(".mcr"))) {
|
||
|
openMacro(filename);
|
||
|
} else if ((filename.endsWith(".zirs"))) {
|
||
|
openWorkBook(filename);
|
||
|
} else {
|
||
|
openFile(filename, null, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void OpenStartupFiles() {
|
||
|
for (int i=0; i<StartupFiles.size(); i++) {
|
||
|
final String filename=(String) StartupFiles.get(i);
|
||
|
open(filename);
|
||
|
}
|
||
|
StartupFiles.clear();
|
||
|
}
|
||
|
|
||
|
public static void FirstRun() {
|
||
|
if (isStartup) {
|
||
|
JPropertiesBar.CreatePropertiesBar();
|
||
|
MainWindow mw=new MainWindow();
|
||
|
|
||
|
PaletteManager.init();
|
||
|
PaletteManager.setSelected_with_clic("point", true);
|
||
|
JLogoWindow.DisposeLogoWindow();
|
||
|
JZirkelCanvas.ActualiseMacroPanel();
|
||
|
}
|
||
|
SwingUtilities.invokeLater(new Runnable() {
|
||
|
|
||
|
public void run() {
|
||
|
OpenStartupFiles();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
isStartup=false;
|
||
|
}
|
||
|
/******************************************************
|
||
|
****************** EXPORT PART ***********************
|
||
|
******************************************************/
|
||
|
// Export graphique (vers PNG, PDF ou EPS ou SVG) :
|
||
|
final public static int PNG=0, EPS=1, PDF=2, SVG=3;
|
||
|
|
||
|
static String fileExtension(String filename, String ext) {
|
||
|
String myext=null;
|
||
|
myext=(filename.toLowerCase().endsWith(ext))?"":ext;
|
||
|
return myext;
|
||
|
}
|
||
|
|
||
|
public static void exportGraphicFile(int FileType) {
|
||
|
String filename=getSaveFile(true);
|
||
|
if (filename!=null) {
|
||
|
exportGraphicFile(FileType, filename);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void exportGraphicFile(int FileType, String filename) {
|
||
|
|
||
|
ZirkelCanvas ZC=JZirkelCanvas.getCurrentZC();
|
||
|
if (ZC==null) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Construction c=ZC.getConstruction();
|
||
|
int oldW=ZC.IW, oldH=ZC.IH;
|
||
|
|
||
|
ZC.startWaiting();
|
||
|
|
||
|
float Scale=1.0f;
|
||
|
Image Ipng=null; // Seulement pour l'export PNG
|
||
|
|
||
|
// cruel dilemne : pour les png et le copier traditionnel, on peut :
|
||
|
// 1- imposer de conserver l'échelle et alors les images passent moins bien sur un site
|
||
|
// 2- donner la priorité au pixel et alors bien sûr l'echelle n'est plus respectée dans
|
||
|
// un traitement de texte par exemple.
|
||
|
// if (true) {
|
||
|
if (FileType!=PNG) {
|
||
|
double scale11;
|
||
|
if ((FileType==SVG)||(FileType==PDF)) {
|
||
|
//Echelle 1unité:1cm pour les svg et pdf :
|
||
|
scale11=10.0/ZC.getConstruction().getPixel();
|
||
|
} else {
|
||
|
//Echelle 1unité:1cm pour les fichiers png et eps :
|
||
|
scale11=720.0/(25.4*ZC.getConstruction().getPixel());
|
||
|
}
|
||
|
|
||
|
// Faire en sorte que l'espacement entre deux lignes verticales
|
||
|
// consécutives de la grille corresponde à 1cm à l'impression :
|
||
|
Scale=(float) (scale11/ZC.getGridSize());
|
||
|
|
||
|
// Petit réajustement de l'echelle au rapport pixels/pixels.
|
||
|
Scale=1.0f*Math.round(Scale*oldW)/oldW;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// On calcule les (X,Y,W,H) du rectangle de sélection. Ici,
|
||
|
// il s'agit de la fenêtre entière :
|
||
|
double RX=0;
|
||
|
double RY=0;
|
||
|
double RW=Math.round(Scale*oldW);
|
||
|
double RH=Math.round(Scale*oldH);
|
||
|
|
||
|
// Si l'outil de sélection est actif, on réajuste les (X,Y,W,H)
|
||
|
// pour qu'ils correspondent au rectangle de sélection courant :
|
||
|
if (ZC.getTool() instanceof SelectTool) {
|
||
|
ZC.hideCopyRectangle();
|
||
|
Rectangle r=ZC.getCopyRectangle();
|
||
|
RX=1.0*r.x*RW/oldW;
|
||
|
RY=1.0*r.y*RH/oldH;
|
||
|
RW=1.0*r.width*RW/oldW;
|
||
|
RH=1.0*r.height*RH/oldH;
|
||
|
}
|
||
|
|
||
|
ZC.scaleLocalPreferences(Scale);
|
||
|
|
||
|
ZC.IW=Math.round(Scale*oldW);
|
||
|
ZC.IH=Math.round(Scale*oldH);
|
||
|
|
||
|
Graphics2D G2D=null;
|
||
|
switch (FileType) {
|
||
|
case EPS:
|
||
|
G2D=new EPSGraphics2D(0, 0, RW, RH);
|
||
|
filename=(filename!=null)?filename+fileExtension(filename, ".eps"):null;
|
||
|
break;
|
||
|
case PDF:
|
||
|
G2D=new PDFGraphics2D(0, 0, RW, RH);
|
||
|
filename=(filename!=null)?filename+fileExtension(filename, ".pdf"):null;
|
||
|
break;
|
||
|
case SVG:
|
||
|
G2D=new SVGGraphics2D(0, 0, RW, RH);
|
||
|
filename=(filename!=null)?filename+fileExtension(filename, ".svg"):null;
|
||
|
break;
|
||
|
case PNG:
|
||
|
Ipng=ZC.createImage((int)RW, (int)RH);
|
||
|
G2D=(Graphics2D) Ipng.getGraphics();
|
||
|
filename=(filename!=null)?filename+fileExtension(filename, ".png"):null;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
MainGraphics IG=new MainGraphics(G2D, ZC);
|
||
|
IG.setSize(ZC.IW, ZC.IH);
|
||
|
|
||
|
if (FileType!=SVG){
|
||
|
IG.clearRect(0, 0, ZC.IW, ZC.IH, ZC.getBackground());
|
||
|
}
|
||
|
ZC.recompute();
|
||
|
ZC.validate();
|
||
|
ZC.forceComputeHeavyObjects();
|
||
|
|
||
|
// Avant de peindre, on réalise la translation qui amène en
|
||
|
// (0,0) le coin supérieur gauche du rectangle de sélection :
|
||
|
G2D.translate(-RX, -RY);
|
||
|
|
||
|
// On peint :
|
||
|
ZC.dopaint(IG);
|
||
|
ZC.endWaiting();
|
||
|
|
||
|
|
||
|
if (filename!=null) {
|
||
|
// Il s'agit d'une exportation (fichier) :
|
||
|
if (FileType==PNG) {
|
||
|
try {
|
||
|
final BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(filename));
|
||
|
final PngEncoder png=new PngEncoder(Ipng, PngEncoder.NO_ALPHA, 0, 9);
|
||
|
png.setDPI(72);
|
||
|
out.write(png.pngEncode());
|
||
|
out.close();
|
||
|
} catch (final Exception e) {
|
||
|
// warning(e.toString());
|
||
|
}
|
||
|
} else {
|
||
|
String CharsetName=(FileType==PDF)?"ISO-8859-1":"UTF-8";
|
||
|
try {
|
||
|
Writer out=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), CharsetName));
|
||
|
out.write(G2D.toString());
|
||
|
out.close();
|
||
|
} catch (IOException e) {
|
||
|
System.out.println("bug !!!");
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
// Il s'agit d'un "copier vers" :
|
||
|
Transferable pdft=null;
|
||
|
switch (FileType) {
|
||
|
case EPS:
|
||
|
pdft=new CopyTransferable(G2D.toString(), "application/postscript", "UTF-8");
|
||
|
break;
|
||
|
case PDF:
|
||
|
pdft=new CopyTransferable(G2D.toString(), "application/pdf", "ISO-8859-1");
|
||
|
break;
|
||
|
case SVG:
|
||
|
pdft=new CopyTransferable(G2D.toString(), "image/svg+xml", "UTF-8");
|
||
|
break;
|
||
|
case PNG:
|
||
|
pdft=new ImageSelection(Ipng);
|
||
|
break;
|
||
|
}
|
||
|
if (pdft!=null) {
|
||
|
Clipboard clip=Toolkit.getDefaultToolkit().getSystemClipboard();
|
||
|
clip.setContents(pdft, null);
|
||
|
}
|
||
|
}
|
||
|
ZC.getLocalPreferences();
|
||
|
ZC.IW=oldW;
|
||
|
ZC.IH=oldH;
|
||
|
if (ZC.getTool() instanceof SelectTool) {
|
||
|
ZC.showCopyRectangle();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
class CopyTransferable implements Transferable {
|
||
|
|
||
|
public final DataFlavor MY_FLAVOUR;
|
||
|
private final DataFlavor[] flavors;
|
||
|
private final String filecontent;
|
||
|
private final String Charset;
|
||
|
|
||
|
public CopyTransferable(String f, String filetype, String charset) {
|
||
|
filecontent=f;
|
||
|
Charset=charset;
|
||
|
MY_FLAVOUR=new DataFlavor(filetype, null);
|
||
|
flavors=new DataFlavor[]{MY_FLAVOUR};
|
||
|
}
|
||
|
|
||
|
public Object getTransferData(DataFlavor flavor)
|
||
|
throws UnsupportedFlavorException, IOException {
|
||
|
if (MY_FLAVOUR.equals(flavor)) {
|
||
|
return new ByteArrayInputStream(filecontent.getBytes(Charset));
|
||
|
} else {
|
||
|
throw new UnsupportedFlavorException(flavor);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public DataFlavor[] getTransferDataFlavors() {
|
||
|
return flavors;
|
||
|
}
|
||
|
|
||
|
public boolean isDataFlavorSupported(DataFlavor flavor) {
|
||
|
DataFlavor[] flavors=getTransferDataFlavors();
|
||
|
for (int i=0; i<flavors.length; i++) {
|
||
|
if (flavors[i].equals(flavor)) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
}
|