package agg.gui.saveload; import java.io.File; import java.util.Vector; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import agg.editor.impl.EdGraGra; import agg.gui.ProgressBar; import agg.gui.event.SaveEvent; import agg.gui.event.SaveEventListener; import agg.util.XMLHelper; import agg.xt_basis.GraGra; /** * @version $Id: GraGraSave.java,v 1.5 2010/09/23 08:22:04 olga Exp $ * @author $Author: olga $ */ public class GraGraSave { public GraGraSave(JFrame fr) { this(fr, "", ""); } public GraGraSave(JFrame fr, String dname, String fname) { this.saveListeners = new Vector<SaveEventListener>(); this.applFrame = fr; this.dirName = dname; this.fileName = fname; /* create a file chooser */ if (!this.dirName.equals("")) this.chooser = new JFileChooser(this.dirName); else this.chooser = new JFileChooser(System.getProperty("user.dir")); /* create file filters */ this.filterXML = new AGGFileFilter("ggx", "AGG Files XML (.ggx)"); this.chooser.addChoosableFileFilter(this.filterXML); /* set file filter */ this.chooser.setFileFilter(this.filterXML); /* create a progress bar */ this.bar = createProgressBar(); } public javax.swing.filechooser.FileFilter getFileFilter() { return this.chooser.getFileFilter(); } public void setFileFilter(javax.swing.filechooser.FileFilter filter) { this.chooser.setFileFilter(filter); } public void setExtensionFileFilter(ExtensionFileFilter filter) { this.chooser.setFileFilter(filter); } public boolean saveAs() { fireSave(new SaveEvent(this, SaveEvent.SAVE, "")); int returnVal = this.chooser.showSaveDialog(this.applFrame); this.dirName = this.chooser.getCurrentDirectory().toString(); if (returnVal == JFileChooser.APPROVE_OPTION) { if (this.chooser.getSelectedFile() != null && !this.chooser.getSelectedFile().getName().equals("")) { this.fileName = this.chooser.getSelectedFile().getName(); return save(); } else fireSave(new SaveEvent(this, SaveEvent.EMPTY_ERROR, "")); } else fireSave(new SaveEvent(this, SaveEvent.EMPTY_ERROR, "")); return false; } public boolean save() { if (this.gra == null) { fireSave(new SaveEvent(this, -1, "GraGra object is null")); return false; } fireSave(new SaveEvent(this, SaveEvent.SAVE, "")); if (this.dirName.equals("")) this.dirName = System.getProperty("user.dir"); // System.out.println(File.pathSeparator+" "+File.separator); if (!this.dirName.endsWith(File.separator)) this.dirName += File.separator; if (this.fileName.equals("")) { return saveAs(); } else { if (this.chooser.getFileFilter() == this.filterXML) { if (!this.fileName.endsWith(".ggx")) this.fileName = this.fileName.concat(".ggx"); } XMLHelper xmlh = new XMLHelper(); // this.fileName = XMLHelper.replaceGermanSpecialCh(this.fileName); xmlh.addTopObject(this.gra); if (xmlh.save_to_xml(this.dirName + this.fileName)) { this.gra.setDirName(this.dirName); this.gra.setFileName(this.fileName); this.gra.getTypeSet().setResourcesPath(this.dirName); this.gra.setChanged(false); fireSave(new SaveEvent(this, SaveEvent.SAVED, this.dirName + this.fileName)); } else { fireSave(new SaveEvent(this, SaveEvent.IO_ERROR, "Write file Error!" , this.dirName + this.fileName)); JOptionPane .showMessageDialog(this.applFrame, "Write file exception for the folder: "+this.dirName, " IO File Error", JOptionPane.ERROR_MESSAGE); return false; } return true; } } public boolean saveAsBase() { // System.out.println(">>> GraGraSave.saveAsBase "); fireSave(new SaveEvent(this, SaveEvent.SAVE, "")); int returnVal = this.chooser.showSaveDialog(this.applFrame); this.dirName = this.chooser.getCurrentDirectory().toString(); if (returnVal == JFileChooser.APPROVE_OPTION) { if (this.chooser.getSelectedFile() != null && !this.chooser.getSelectedFile().getName().equals("")) { this.fileName = this.chooser.getSelectedFile().getName(); return saveBase(); } else fireSave(new SaveEvent(this, SaveEvent.EMPTY_ERROR, "")); } else fireSave(new SaveEvent(this, SaveEvent.EMPTY_ERROR, "")); return false; } public boolean saveBase() { if (this.basis == null) { return false; } if (this.dirName.equals("")) this.dirName = System.getProperty("user.dir"); if (!this.dirName.endsWith(File.separator)) this.dirName += File.separator; if (this.fileName.equals("")) return saveAsBase(); else { if (this.chooser.getFileFilter() == this.filterXML) { if (!this.fileName.endsWith(".ggx")) this.fileName = this.fileName.concat(".ggx"); } // if (this.fileName.endsWith(".ggx")) { XMLHelper xmlh = new XMLHelper(); // this.fileName = XMLHelper.replaceGermanSpecialCh(this.fileName); xmlh.addTopObject(this.basis); if (xmlh.save_to_xml(this.dirName + this.fileName)) { fireSave(new SaveEvent(this, SaveEvent.SAVED, this.dirName + this.fileName)); return true; } else { fireSave(new SaveEvent(this, SaveEvent.IO_ERROR, "Write file Error!" , this.dirName + this.fileName)); JOptionPane .showMessageDialog(this.applFrame, "Write file exception for the folder: "+this.dirName, " IO File Error", JOptionPane.ERROR_MESSAGE); return false; } } // } // if XML // else if (this.chooser.getFileFilter() == filterAGG) { // // System.out.println("GraGraSave.save "+this.dirName+" "+this.fileName); // if (!this.fileName.endsWith(".agg")) // this.fileName = this.fileName.concat(".agg"); // } /* fireSave(new SaveEvent(this, SaveEvent.PROGRESS_BEGIN, this.bar .getContentPanel(), "")); this.bar.start(); File f = new File(this.dirName + this.fileName); FileOutputStream fos = null; ObjectOutputStream oos = null; int key = -1; try { fos = new FileOutputStream(f); oos = new ObjectOutputStream(fos); oos.writeObject(this.basis); oos.flush(); } catch (IOException iox) { key = SaveEvent.IO_ERROR; if (iox.getMessage() == null) { addMsg = ""; } else { addMsg = iox.getLocalizedMessage(); } } finally { if (fos != null) { addMsg = ""; try { fos.close(); key = SaveEvent.SAVED; } catch (IOException ex) { key = SaveEvent.CLOSE_ERROR; } } fireSave(new SaveEvent(this, SaveEvent.PROGRESS_FINISHED, this.bar .getContentPanel(), "")); fireSave(new SaveEvent(this, key, this.dirName + this.fileName, addMsg)); this.bar.finish(); this.bar.quit(); } */ } } public String getFileName() { return this.fileName; } public String getDirName() { return this.dirName; } public void setDirName(String directory) { if (!directory.equals("")) { this.dirName = directory; this.chooser = new JFileChooser(this.dirName); /* create file filters */ this.filterXML = new AGGFileFilter("ggx", "AGG Files XML (.ggx)"); this.chooser.addChoosableFileFilter(this.filterXML); /* set file filter */ this.chooser.setFileFilter(this.filterXML); } } public void setGraGra(EdGraGra gragra) { this.gra = gragra; } public void setGraGra(EdGraGra gragra, String dirname, String filename) { this.gra = gragra; if ((dirname != null) && !dirname.equals("")) this.dirName = dirname; this.fileName = filename; } public void setBaseGraGra(GraGra gragra) { this.basis = gragra; } public void setBaseGraGra(GraGra gragra, String dirname, String filename) { // System.out.println(">>> GraGraSave.setBaseGraGra "+gragra); this.basis = gragra; if ((dirname != null) && !dirname.equals("")) this.dirName = dirname; this.dirName = dirname; this.fileName = filename; } public EdGraGra getGraGra() { return this.gra; } public GraGra getBaseGraGra() { return this.basis; } public void setFrame(JFrame f) { this.applFrame = f; if (this.bar != null) this.bar.setFrame(f); } public synchronized void addSaveEventListener(SaveEventListener l) { if (!this.saveListeners.contains(l)) this.saveListeners.addElement(l); } public synchronized void removeSaveEventListener(SaveEventListener l) { if (this.saveListeners.contains(l)) this.saveListeners.removeElement(l); } private void fireSave(SaveEvent e) { for (int i = 0; i < this.saveListeners.size(); i++) { this.saveListeners.elementAt(i).saveEventOccurred(e); } } /* create a progress bar */ private ProgressBar createProgressBar() { ProgressBar pbar = new ProgressBar("Save"); pbar.setFrame(this.applFrame); pbar.setLabel("Saving File ..."); pbar.setFinishText("Saving done"); pbar.setToolTipText("Save Status"); pbar.setFinishAppend(false); LoadSaveStatus.setMaximum(1000); return pbar; } private ProgressBar bar; private Vector<SaveEventListener> saveListeners; private JFrame applFrame; private JFileChooser chooser; private ExtensionFileFilter filterXML; // private ExtensionFileFilter filterAGG; // private String addMsg; private EdGraGra gra; private GraGra basis; private String dirName = ""; private String fileName = ""; } // $Log: GraGraSave.java,v $ // Revision 1.5 2010/09/23 08:22:04 olga // tuning // // Revision 1.4 2010/03/08 15:43:56 olga // code optimizing // // Revision 1.3 2009/06/30 09:50:27 olga // agg.xt_basis.GraphObject: added: setObjectName(String), getObjectName() // agg.xt_basis.Node, Arc: changed: save, load the object name // agg.editor.impl.EdGraphObject: changed: String getTypeString() - contains object name if set // // workaround of Applicability of Rule Sequences and Object Flow // // Revision 1.2 2009/05/12 10:36:59 olga // CPA: bug fixed // Applicability of Rule Seq. : bug fixed // // Revision 1.1 2008/10/29 09:04:11 olga // new sub packages of the package agg.gui: typeeditor, editor, trafo, cpa, options, treeview, popupmenu, saveload // // Revision 1.5 2007/09/24 09:42:34 olga // AGG transformation engine tuning // // Revision 1.4 2007/09/10 13:05:28 olga // In this update: // - package xerces2.5.0 is not used anymore; // - class com.objectspace.jgl.Pair is replaced by the agg own generic class agg.util.Pair; // - bugs fixed in: usage of PACs in rules; match completion; // usage of static method calls in attr. conditions // - graph editing: added some new features // // Revision 1.3 2007/06/13 08:32:53 olga // Update: V161 // // Revision 1.2 2005/12/21 14:49:05 olga // GUI tuning // // Revision 1.1 2005/08/25 11:56:53 enrico // *** empty log message *** // // Revision 1.2 2005/06/20 13:37:03 olga // Up to now the version 1.2.8 will be prepared. // // Revision 1.1 2005/05/30 12:58:02 olga // Version with Eclipse // // Revision 1.9 2005/04/11 13:06:13 olga // Errors during CPA are corrected. // // Revision 1.8 2005/03/03 13:48:42 olga // - Match with NACs and attr. conditions with mixed variables - error corrected // - save/load class packages written by user // - PACs : creating T-equivalents - improved // - save/load matches of the rules (only one match of a rule) // - more friendly graph/rule editor GUI // - more syntactical checks in attr. editor // // Revision 1.7 2004/11/15 17:50:39 olga // Jetzt das Kombinieren von Grammars moeglich. // // Revision 1.6 2003/04/14 08:21:10 olga // Bei Save und Load ist Serializable Format rausgenommen. // // Revision 1.5 2003/03/20 13:35:18 olga // Delete TypeGraph neu // // Revision 1.4 2003/03/05 18:24:17 komm // sorted/optimized import statements // // Revision 1.3 2002/12/05 13:33:20 olga // GUI Verbesserung. // // Revision 1.2 2002/09/05 16:16:53 olga // Arbeit an GUI // // Revision 1.1.1.1 2002/07/11 12:17:10 olga // Imported sources // // Revision 1.14 2001/09/24 16:39:35 olga // Korrektur an LayerFunction und LayerGUI. // // Revision 1.13 2001/07/30 13:16:15 olga // Kleine GUI Korrektur. // // Revision 1.12 2001/03/14 17:31:45 olga // Korrektur wegen Layout und XML // // Revision 1.11 2001/03/08 11:00:05 olga // Das ist Stand nach der AGG GUI Reimplementierung // und Parser Anbindung. // // Revision 1.10 2000/12/21 10:53:56 olga // XML save / load Format fuer basis gragra eingefuegt. // // Revision 1.9 2000/12/21 09:49:04 olga // In dieser Version wurden XML und GUI Reimplementierung zusammen gefuehrt. // // Revision 1.8 2000/12/07 14:23:37 matzmich // XML-Kram // Man beachte: xerces (/home/tfs/gragra/AGG/LIB/Xerces/xerces.jar) wird // jetzt im CLASSPATH benoetigt. // // Revision 1.7.4.3 2000/12/04 13:26:03 olga // Erste Stufe der GUI Reimplementierung abgeschlossen: // - AGGAppl.java optimiert // - Print eingebaut (GraGraPrint.java) // - GraGraTreeView.java, GraGraEditor.java optimiert // - Event eingebaut // - GraTra umgestellt // // Revision 1.7.4.2 2000/11/09 17:54:42 olga // Fehlerbeseitigt im TypeEditor und bei den Kanten. // // Revision 1.7.4.1 2000/11/06 09:32:47 olga // Erste Version fuer neue GUI (Branch reimpl) // // Revision 1.7 2000/07/19 12:31:22 olga // Save Dialog geaendert. // // Revision 1.6 2000/01/04 13:52:18 shultzke // Progressbalken fuer das Laden und Speichern // integriert. //