/**
*
*/
package org.goko.tools.editor.component.provider;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.ProgressMonitor;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.goko.core.common.exception.GkException;
/**
* @author Psyko
* @date 26 mai 2016
*/
public abstract class AbstractDocumentProvider implements IDocumentProvider, IDocumentListener{
/** The cached document */
private IDocument document;
/** Dirty state of the document */
private boolean dirty;
/** The list of listeners */
private List<IDocumentProviderListener> documentProviderListeners;
/**
*
*/
public AbstractDocumentProvider() {
documentProviderListeners = new CopyOnWriteArrayList<IDocumentProviderListener>();
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#getDocument()
*/
@Override
public IDocument getDocument() throws GkException {
if(document == null){
document = performGetDocument();
document.addDocumentListener(this);
}
return document;
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#saveDocument(javax.swing.ProgressMonitor)
*/
@Override
public void saveDocument(ProgressMonitor monitor) throws GkException {
performSaveDocument(monitor);
setDirty(false);
}
protected abstract IDocument performGetDocument() throws GkException;
protected abstract void performSaveDocument(ProgressMonitor monitor) throws GkException;
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#addDocumentProviderListener(org.goko.tools.editor.component.provider.IDocumentProviderListener)
*/
@Override
public void addDocumentProviderListener(IDocumentProviderListener listener) {
if(!documentProviderListeners.contains(listener)){
documentProviderListeners.add(listener);
}
}
public void removeAllDocumentProviderListener(){
documentProviderListeners.clear();
}
protected void notifyAboutToClose(){
for (IDocumentProviderListener listener : documentProviderListeners) {
listener.aboutToClose(this);
}
}
protected void notifyClosed(){
for (IDocumentProviderListener listener : documentProviderListeners) {
listener.onClosed(this);
}
}
protected void notifyDirtyChanged(){
for (IDocumentProviderListener listener : documentProviderListeners) {
listener.onDirtyChanged(this);
}
}
protected void notifyModifiableChanged(){
for (IDocumentProviderListener listener : documentProviderListeners) {
listener.onModifiableChanged(this);
}
}
/** (inheritDoc)
* @see org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.DocumentEvent)
*/
@Override
public void documentAboutToBeChanged(DocumentEvent event) { }
/** (inheritDoc)
* @see org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent)
*/
@Override
public void documentChanged(DocumentEvent event) {
setDirty(true);
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#getAnnotationModel()
*/
@Override
public IAnnotationModel getAnnotationModel() throws GkException{
return null;
}
/**
* @return the dirty
*/
public boolean isDirty() {
return dirty;
}
/**
* @param dirty the dirty to set
*/
public void setDirty(boolean dirty) {
boolean notify = (this.dirty != dirty);
this.dirty = dirty;
if(notify){
notifyDirtyChanged();
}
}
}