/*
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2003, 2005 Slava Pestov
* Portions copyright (C) 2006, 2011 Matthieu Casanova
*
* 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 any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit;
import java.io.Closeable;
import java.io.File;
import java.util.List;
import java.util.LinkedList;
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import org.gjt.sp.jedit.buffer.KillRing;
import org.gjt.sp.util.Log;
import org.gjt.sp.util.XMLUtilities;
import org.gjt.sp.util.IOUtilities;
import javax.swing.*;
/**
* The basic KillRing of jEdit.
* @author Matthieu Casanova
* @version $Id: ParserRuleSet.java 5471 2006-06-22 06:31:23Z kpouer $
*/
class JEditKillRing extends KillRing
{
//{{{ Constructor
JEditKillRing()
{
String settingsDirectory = jEdit.getSettingsDirectory();
if(settingsDirectory != null)
{
killringXML = new SettingsXML(settingsDirectory, "killring");
}
} //}}}
//{{{ load() method
@Override
public void load()
{
if(killringXML == null)
return;
if(!killringXML.fileExists())
return;
Log.log(Log.MESSAGE,KillRing.class,"Loading " + killringXML);
KillRingHandler handler = new KillRingHandler();
try
{
killringXML.load(handler);
}
catch (OutOfMemoryError oem)
{
Log.log(Log.ERROR, this, "Unable to load entire Killring, too low memory, increase your jvm max heap size");
String start = jEdit.getProperty("killring.start");
String deleteKillRing = jEdit.getProperty("killring.delete");
String stop = jEdit.getProperty("killring.stop");
int selected = GUIUtilities.option(null, "killring.load-memoryerror", null,
JOptionPane.ERROR_MESSAGE,
new Object[]{start, deleteKillRing, stop}, start);
if (selected == 2)
{
System.exit(-1);
}
else if (selected == 1)
{
new File(MiscUtilities.constructPath(
jEdit.getSettingsDirectory(),"killring.xml")).delete();
return;
}
}
catch (IOException ioe)
{
Log.log(Log.ERROR, this, ioe);
}
reset(handler.list);
} //}}}
//{{{ save() method
@Override
public void save()
{
if(killringXML == null)
return;
if(killringXML.hasChangedOnDisk())
{
Log.log(Log.WARNING,KillRing.class,killringXML
+ " changed on disk; will not save killring"
+ " files");
return;
}
Log.log(Log.MESSAGE,KillRing.class,"Saving " + killringXML);
String lineSep = System.getProperty("line.separator");
SettingsXML.Saver out = null;
try
{
out = killringXML.openSaver();
out.writeXMLDeclaration("1.1");
out.write("<!DOCTYPE KILLRING SYSTEM \"killring.dtd\">");
out.write(lineSep);
out.write("<KILLRING>");
out.write(lineSep);
int size = getSize();
for(int i = size - 1; i >=0; i--)
{
out.write("<ENTRY>");
out.write(XMLUtilities.charsToEntities(
getElementAt(i).toString(),true));
out.write("</ENTRY>");
out.write(lineSep);
}
out.write("</KILLRING>");
out.write(lineSep);
out.finish();
}
catch(Exception e)
{
Log.log(Log.ERROR,KillRing.class,e);
}
finally
{
IOUtilities.closeQuietly((Closeable)out);
}
} //}}}
//{{{ Private members
private SettingsXML killringXML;
//{{{ KillRingHandler class
private static class KillRingHandler extends DefaultHandler
{
public List<String> list = new LinkedList<String>();
@Override
public InputSource resolveEntity(String publicId, String systemId)
{
return XMLUtilities.findEntity(systemId, "killring.dtd", getClass());
}
@Override
public void startElement(String uri, String localName,
String qName, Attributes attrs)
{
inEntry = qName.equals("ENTRY");
}
@Override
public void endElement(String uri, String localName, String name)
{
if(name.equals("ENTRY"))
{
list.add(charData.toString());
inEntry = false;
charData.setLength(0);
}
}
@Override
public void characters(char[] ch, int start, int length)
{
if (inEntry)
charData.append(ch, start, length);
}
@Override
public void processingInstruction(String target, String data)
{
if ("illegal-xml-character".equals(target))
{
char ch;
try
{
ch = (char)Integer.parseInt(data.trim());
}
catch (Exception e)
{
Log.log(Log.ERROR, this,
"Failed to get character from PI"
+ "\"" + target + "\""
+ " with \"" + data + "\""
+ ": " + e);
return;
}
characters(new char[] {ch}, 0, 1);
}
}
private final StringBuilder charData = new StringBuilder();
private boolean inEntry;
} //}}}
//}}}
}