/**
*
*/
package org.goko.tools.macro.document;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.swing.ProgressMonitor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.goko.core.common.exception.GkException;
import org.goko.core.common.exception.GkTechnicalException;
import org.goko.core.gcode.element.IGCodeProvider;
import org.goko.core.gcode.element.IGCodeProviderSource;
import org.goko.core.gcode.element.validation.IValidationElement;
import org.goko.core.log.GkLog;
import org.goko.tools.editor.component.annotation.ErrorAnnotation;
import org.goko.tools.editor.component.provider.AbstractGCodeDocumentProvider;
import org.goko.tools.macro.bean.GCodeMacro;
import org.goko.tools.macro.service.DefaultGCodeMacroService;
public class GCodeMacroDocument extends AbstractGCodeDocumentProvider {
private static final GkLog LOG = GkLog.getLogger(GCodeMacroDocument.class);
private DefaultGCodeMacroService macroService;
private GCodeMacro macro;
private IGCodeProvider provider;
/**
* @param macroService
* @param macro
* @param provider
*/
public GCodeMacroDocument(DefaultGCodeMacroService macroService, GCodeMacro macro, IGCodeProvider provider) {
super();
this.macroService = macroService;
this.macro = macro;
this.provider = provider;
try {
macroService.addDeleteVetoableListener(this);
} catch (GkException e) {
LOG.error(e);
}
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#isModifiable()
*/
@Override
public boolean isModifiable() throws GkException {
return getSource().canWrite() && !provider.isLocked();
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#saveDocument(javax.swing.ProgressMonitor)
*/
@Override
public void performSaveDocument(ProgressMonitor monitor) throws GkException {
if(isModifiable()){
getSource().write(IOUtils.toInputStream(getDocument().get()));
// Notify the macro service
macroService.updateGCodeMacro(macro);
}
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.AbstractGCodeDocumentProvider#addAnnotations(org.eclipse.jface.text.source.IAnnotationModel)
*/
@Override
protected void addAnnotations(IAnnotationModel annotationModel) throws GkException {
List<IValidationElement> elements = provider.getValidationElements();
if(CollectionUtils.isNotEmpty(elements)){
for (IValidationElement elt : elements) {
ErrorAnnotation error = new ErrorAnnotation(elt.getDescription());
int lineOffset = 0;
try {
lineOffset = getDocument().getLineOffset(elt.getLocation().getLine());
} catch (BadLocationException e) {
}
Position position = new Position(lineOffset + elt.getLocation().getColumn(), elt.getLength());
annotationModel.addAnnotation(error, position);
}
}
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.AbstractGCodeDocumentProvider#getGCodeDocument()
*/
@Override
public IDocument getGCodeDocument() throws GkException {
if(getSource() != null){
InputStream inputStream = getSource().openInputStream();
try {
IDocument document = new Document(IOUtils.toString(inputStream));
return document;
} catch (IOException e) {
throw new GkTechnicalException(e);
}finally {
IOUtils.closeQuietly(inputStream);
}
}
return null;
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#getDocumentName()
*/
@Override
public String getDocumentName() {
return provider.getCode();
}
/**
* Utility getter on the source of the provider
* @return IGCodeProviderSource
* @throws GkException GkException
*/
private IGCodeProviderSource getSource() throws GkException {
return provider.getSource();
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#onGCodeProviderCreate(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void onGCodeProviderCreate(IGCodeProvider provider) throws GkException { }
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#afterGCodeProviderDelete(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void afterGCodeProviderDelete(IGCodeProvider provider) throws GkException { }
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#beforeGCodeProviderDelete(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void beforeGCodeProviderDelete(IGCodeProvider provider) throws GkException {
if(ObjectUtils.equals(provider.getId(), this.provider.getId())){
notifyClosed();
}
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#onGCodeProviderLocked(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void onGCodeProviderLocked(IGCodeProvider provider) throws GkException {
notifyModifiableChanged();
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#onGCodeProviderUnlocked(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void onGCodeProviderUnlocked(IGCodeProvider provider) throws GkException {
notifyModifiableChanged();
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#onGCodeProviderUpdate(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void onGCodeProviderUpdate(IGCodeProvider provider) throws GkException { }
}