/*******************************************************************************
* Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package com.cisco.yangide.editor.editors.text;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.reconciler.DirtyRegion;
import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import com.cisco.yangide.core.YangCorePlugin;
import com.cisco.yangide.core.dom.Module;
import com.cisco.yangide.core.model.YangFile;
import com.cisco.yangide.core.model.YangFileInfo;
import com.cisco.yangide.core.model.YangModelManager;
import com.cisco.yangide.core.parser.IYangValidationListener;
import com.cisco.yangide.core.parser.YangParserUtil;
import com.cisco.yangide.editor.editors.YangEditor;
/**
* @author Konstantin Zaitsev
* @date Jul 10, 2014
*/
public class YangReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
private IProgressMonitor monitor;
private IDocument document;
private ISourceViewer viewer;
private ITextEditor editor;
/**
* next character position - used locally and only valid while {@link #calculatePositions()} is
* in progress.
*/
protected int cNextPos = 0;
/** number of newLines found by {@link #classifyTag()} */
protected int cNewLines = 0;
public YangReconcilingStrategy(ISourceViewer viewer, ITextEditor editor) {
this.viewer = viewer;
this.editor = editor;
}
@Override
public void setDocument(IDocument document) {
this.document = document;
}
@Override
public void setProgressMonitor(IProgressMonitor monitor) {
this.monitor = monitor;
}
@Override
public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
reconcile(dirtyRegion);
}
@Override
public void reconcile(IRegion partition) {
if (editor == null || editor.getEditorInput() == null || !(editor.getEditorInput() instanceof IFileEditorInput)) {
return;
}
IFile file = ((IFileEditorInput) editor.getEditorInput()).getFile();
final YangAnnotationModel annotationModel = (YangAnnotationModel) getAnnotationModel();
YangFile yangFile = YangCorePlugin.createYangFile(file);
try {
annotationModel.init();
Module module = YangParserUtil.parseYangFile(document.get().toCharArray(), file.getProject(),
new IYangValidationListener() {
@Override
public void validationError(String msg, int lineNumber, int charStart, int charEnd) {
annotationModel.addProblem(new YangProblem(new YangSyntaxAnnotation(msg), new Position(
charStart, charEnd - charStart)));
}
@Override
public void syntaxError(String msg, int lineNumber, int charStart, int charEnd) {
annotationModel.addProblem(new YangProblem(new YangSyntaxAnnotation(msg), new Position(
charStart, charEnd - charStart)));
}
});
annotationModel.reportProblem();
YangFileInfo fileInfo = (YangFileInfo) yangFile.getElementInfo(monitor);
// reindex if no errors found
if (module.isSyntaxValid()) {
fileInfo.setModule(module);
fileInfo.setIsStructureKnown(true);
// re index content
YangModelManager.getIndexManager().addWorkingCopy(file);
} else {
fileInfo.setModule(module);
fileInfo.setIsStructureKnown(false);
}
if (editor instanceof YangEditor) {
((YangEditor) editor).reconcile();
}
} catch (Exception e) {
// ignore any exception on reconcile
} finally {
if (editor instanceof YangEditor) {
((YangEditor) editor).updateSemanticHigliting();
}
}
}
private IAnnotationModel getAnnotationModel() {
return viewer.getAnnotationModel();
}
@Override
public void initialReconcile() {
reconcile(new Region(0, document.getLength()));
}
}