/**
*
*/
package org.goko.tools.editor.component.provider;
import java.util.List;
import javax.swing.ProgressMonitor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
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.gcode.element.GCodeLine;
import org.goko.core.gcode.element.IGCodeProvider;
import org.goko.core.gcode.element.validation.IValidationElement;
import org.goko.core.gcode.rs274ngcv3.IRS274NGCService;
import org.goko.core.gcode.rs274ngcv3.context.GCodeContext;
import org.goko.core.gcode.rs274ngcv3.element.InstructionProvider;
import org.goko.core.gcode.service.IGCodeProviderRepository;
import org.goko.core.log.GkLog;
import org.goko.tools.editor.component.annotation.ErrorAnnotation;
/**
* @author Psyko
* @date 26 mai 2016
*/
public class GCodeProviderDocument extends AbstractGCodeDocumentProvider {
private static final GkLog LOG = GkLog.getLogger(GCodeProviderDocument.class);
private IGCodeProvider provider;
private IGCodeProviderRepository gcodeRepository;
private IRS274NGCService gcodeService;
private Document document;
/**
* @param source
*/
public GCodeProviderDocument(IGCodeProviderRepository gcodeRepository, IRS274NGCService gcodeService, IGCodeProvider provider) {
super();
this.provider = provider;
this.gcodeRepository = gcodeRepository;
this.gcodeService = gcodeService;
try {
this.gcodeRepository.addDeleteVetoableListener(this);
this.gcodeRepository.addListener(this);
} catch (GkException e) {
LOG.error(e);
}
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#isModifiable()
*/
@Override
public boolean isModifiable() throws GkException {
return false;
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#saveDocument(javax.swing.ProgressMonitor)
*/
@Override
public void performSaveDocument(ProgressMonitor monitor) throws GkException {
// Final document cannot be saved
}
/** (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 {
StringBuffer buffer = new StringBuffer();
GCodeContext context = new GCodeContext();
InstructionProvider instructionProvider = gcodeService.getInstructions(context , provider);
provider = gcodeService.getGCodeProvider(context , instructionProvider);
List<GCodeLine> lines = provider.getLines();
for (GCodeLine gCodeLine : lines) {
String strLine = gcodeService.render(gCodeLine);
if(StringUtils.isNotEmpty(strLine)){
buffer.append(strLine);
buffer.append(System.lineSeparator());
}
}
if(document == null){
document = new Document(buffer.toString());
}else{
document.set(buffer.toString());
}
return document;
}
/** (inheritDoc)
* @see org.goko.tools.editor.component.provider.IDocumentProvider#getDocumentName()
*/
@Override
public String getDocumentName() {
return "Rendered "+provider.getCode();
}
/** (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 {
this.gcodeRepository.removeDeleteVetoableListener(this);
this.gcodeRepository.removeListener(this);
}
/** (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.tools.editor.component.provider.AbstractDocumentProvider#isDirty()
*/
@Override
public boolean isDirty() {
return false;
}
/** (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 {
getGCodeDocument();
}
/** (inheritDoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 41;
int result = 1;
result = prime * result + ((provider == null) ? 0 : provider.hashCode());
return result;
}
/** (inheritDoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
GCodeProviderDocument other = (GCodeProviderDocument) obj;
if (provider == null) {
if (other.provider != null)
return false;
} else if (!provider.equals(other.provider))
return false;
return true;
}
}