/*
* Scute
*
* Homepage: http://hyperdata.org/scute
*
* License : http://www.apache.org/licenses/LICENSE-2.0
* See also license.txt or http://hyperdata.org/wiki/Scute:License
*
* Danny Ayers 2011
*/
package org.hyperdata.scute.autosave;
import java.awt.event.FocusEvent;
import java.awt.event.WindowEvent;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Timer;
import javax.swing.event.ChangeEvent;
import org.hyperdata.scute.cards.Card;
import org.hyperdata.scute.cards.CardsPanel;
import org.hyperdata.scute.main.Config;
import org.hyperdata.scute.main.ScratchPad;
import org.hyperdata.scute.main.Scute;
import org.hyperdata.scute.main.ScuteIF;
import org.hyperdata.scute.rdf.ModelContainer;
import org.hyperdata.scute.source.TextContainer;
/**
* see http://esw.w3.org/IntegrityIsJobOne
*
* Currently just saves stuff afresh every 6 seconds TODO could do with being
* intelligent about when things have changed
*
* TODO rationalize listeners
*
* @author danny
*
*/
public class AutoSave extends UserActivityAdapter { //
private Set<Saveable> saveables = new HashSet<Saveable>();
/** The text saver. */
private TextSaver textSaver;
private TextSaver scratchTextSaver;
private TextContainer scratchTextContainer;
/** The model timer. */
private final Timer timer = new Timer();
private ModelSaver modelSaver;
private ModelContainer workingModelContainer;
private TextContainer currentTextContainer;
public void addSaveable(Saveable saveable) {
saveables.add(saveable);
}
public void setCurrentTextContainer(TextContainer container) {
currentTextContainer = container;
System.out.println("CONTAINER =" + container);
rescheduleTextSaver();
}
/**
* Inits the model saver.
*
* @param container
* the container
*/
public void setWorkingModelContainer(ModelContainer container) {
workingModelContainer = container;
rescheduleModelSaver();
}
/**
* @param scratchPad
*/
public void setScratchTextContainer(TextContainer textContainer) {
scratchTextContainer = textContainer;
rescheduleScratchSaver();
}
/*
* (non-Javadoc)
*
* @see
* org.hyperdata.scute.main.UserActivityListener#activityOccurred(java.util
* .EventObject)
*/
@Override
public void activityOccurred(EventObject object) {
reschedule();
}
/*
* java.awt.event.FocusListener
*/
/*
* (non-Javadoc)
*
* @see java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent)
*/
@Override
public void focusGained(FocusEvent event) {
textSaver.save(); // save the old one
reschedule(); // start over
}
/**
* Effectively resets clock.
*/
public void reschedule() {
System.out.println("RESCHEDULE!!!");
timer.purge(); // clean queue
rescheduleTextSaver();
rescheduleModelSaver();
rescheduleScratchSaver();
}
private void rescheduleTextSaver() {
if (textSaver != null) {
textSaver.cancel();
}
textSaver = new TextSaver(currentTextContainer);
timer.schedule(textSaver, Config.self.getTextSaveDelay());
}
private void rescheduleModelSaver() {
if (modelSaver != null) {
modelSaver.cancel();
}
modelSaver = new ModelSaver(workingModelContainer);
timer.schedule(modelSaver, Config.self.getModelSaveDelay());
}
private void rescheduleScratchSaver() {
if (scratchTextSaver != null) {
scratchTextSaver.cancel();
}
scratchTextSaver = new TextSaver(scratchTextContainer);
timer.schedule(scratchTextSaver, Config.self.getTextSaveDelay());
}
/*
* (non-Javadoc)
*
* @see
* java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent)
*/
@Override
public void windowClosing(WindowEvent we) {
finishUp();
we.getWindow().dispose();
System.exit(0);
}
/**
* Restore previous state.
*
* @param rdfEditor
* the rdf editor
*/
public void restorePreviousState(ScuteIF scute) {
// System.out.println("Config.self.getSelectedView() ="
// + Config.self.getSelectedView());
scute.setSelectedCard(Config.self.getSelectedView());
// rdfEditor.setSelectedTab(Config.self.getSelectedTab());
// rdfEditor.setSourceText(getSavedText());
}
/**
* Gets the saved text.
*
* @return the saved text
*/
// private String getSavedText() {
// StringBuffer buffer = new StringBuffer("");
// int ch;
// try {
// FileInputStream fis = new FileInputStream(Config.TEXT_FILENAME);
// while ((ch = fis.read()) != -1) {
// buffer.append((char) ch);
// }
// fis.close();
// } catch (Exception e) {
// // error popup
// Log.exception(exception);;
// return "";
// }
// return buffer.toString();
// }
/**
* Finish up.
*/
private void finishUp() {
if (modelSaver != null) {
modelSaver.cancel(); // clean shutdown of timed operations
modelSaver.save(); // final saving
}
if (textSaver != null) {
textSaver.cancel();
textSaver.save();
}
if (scratchTextSaver != null) {
scratchTextSaver.cancel();
scratchTextSaver.save();
}
// this is belts & braces - everything should already have been saved
Iterator<Saveable> iterator = saveables.iterator();
while (iterator.hasNext()) {
iterator.next().save();
}
Config.self.setSync(true);
Config.self.saveNow();
}
/*
* (non-Javadoc)
*
* @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
*/
@Override
public void focusLost(FocusEvent arg0) {
}
/* javax.swing.event.ChangeListener */
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent
* )
*/
@Override
public void stateChanged(ChangeEvent event) {
CardsPanel cardsPanel = (CardsPanel) event.getSource();
String current = cardsPanel.getCurrentCardType();
Config.self.setSelectedView(current);
Card currentCard = cardsPanel.getCard(current);
if (currentCard instanceof TextContainer) {
setCurrentTextContainer((TextContainer) currentCard);
} else {
setCurrentTextContainer(null);
}
}
}