/*
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2006 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 org.gjt.sp.util.Log;
import org.gjt.sp.util.XMLUtilities;
import org.gjt.sp.util.IOUtilities;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Attributes;
import java.io.IOException;
/**
* The concrete RegisterSaver for jEdit.
* @author Matthieu Casanova
* @version $Id: FoldHandler.java 5568 2006-07-10 20:52:23Z kpouer $
*/
class JEditRegisterSaver implements RegisterSaver
{
//{{{ Constructor
JEditRegisterSaver()
{
String settingsDirectory = jEdit.getSettingsDirectory();
if(settingsDirectory != null)
{
registersXML = new SettingsXML(settingsDirectory, "registers");
}
} //}}}
//{{{ loadRegisters() method
public void loadRegisters()
{
if(registersXML == null)
return;
if(!registersXML.fileExists())
return;
Log.log(Log.MESSAGE,jEdit.class,"Loading " + registersXML);
RegistersHandler handler = new RegistersHandler();
try
{
Registers.setLoading(true);
registersXML.load(handler);
}
catch (IOException ioe)
{
Log.log(Log.ERROR, Registers.class, ioe);
}
finally
{
Registers.setLoading(false);
}
} //}}}
//{{{ saveRegisters() method
public void saveRegisters()
{
if(registersXML == null)
return;
if(registersXML.hasChangedOnDisk())
{
Log.log(Log.WARNING,Registers.class,registersXML
+ " changed on disk; will not save registers");
return;
}
Log.log(Log.MESSAGE,Registers.class,"Saving " + registersXML);
String lineSep = System.getProperty("line.separator");
SettingsXML.Saver out = null;
try
{
out = registersXML.openSaver();
out.writeXMLDeclaration();
out.write("<!DOCTYPE REGISTERS SYSTEM \"registers.dtd\">");
out.write(lineSep);
out.write("<REGISTERS>");
out.write(lineSep);
Registers.Register[] registers = Registers.getRegisters();
for(int i = 0; i < registers.length; i++)
{
Registers.Register register = registers[i];
if(register == null ||
i == '$' ||
i == '%' ||
register.toString().length() == 0)
continue;
out.write("<REGISTER NAME=\"");
if(i == '"')
out.write(""");
else
out.write((char)i);
out.write("\">");
out.write(XMLUtilities.charsToEntities(
register.toString(), false));
out.write("</REGISTER>");
out.write(lineSep);
}
out.write("</REGISTERS>");
out.write(lineSep);
out.finish();
}
catch(Exception e)
{
Log.log(Log.ERROR,Registers.class,e);
}
finally
{
IOUtilities.closeQuietly((Closeable)out);
}
} //}}}
//{{{ Private members
private SettingsXML registersXML;
//{{{ RegistersHandler class
private static class RegistersHandler extends DefaultHandler
{
//{{{ resolveEntity() method
@Override
public InputSource resolveEntity(String publicId, String systemId)
{
return XMLUtilities.findEntity(systemId, "registers.dtd", getClass());
} //}}}
//{{{ startElement() method
@Override
public void startElement(String uri, String localName,
String qName, Attributes attrs)
{
registerName = attrs.getValue("NAME");
inRegister = "REGISTER".equals(qName);
} //}}}
//{{{ endElement() method
@Override
public void endElement(String uri, String localName, String name)
{
if("REGISTER".equals(name))
{
if(registerName == null || registerName.length() != 1)
Log.log(Log.ERROR,this,"Malformed NAME: " + registerName);
else
Registers.setRegister(registerName.charAt(0),charData.toString());
inRegister = false;
charData.setLength(0);
}
} //}}}
//{{{ characters() method
@Override
public void characters(char[] ch, int start, int length)
{
if (inRegister)
charData.append(ch, start, length);
} //}}}
//{{{ Private members
private String registerName;
private final StringBuilder charData = new StringBuilder();
private boolean inRegister;
//}}}
} //}}}
//}}}
}