/*******************************************************************************
* Copyright (c) 2016 Pivotal, Inc.
* 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
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.boot.dash.cloudfoundry.deployment;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
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.IAnnotationModelExtension;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.ISourceViewerExtension2;
import org.springframework.ide.eclipse.editor.support.yaml.ast.YamlASTProvider;
/**
* Reconciling strategy responsible for keeping track of application name
* annotations
*
* @author Alex Boyko
*
*/
public class AppNameReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
/**
* Reconciler for application name annotations
*/
private AppNameReconciler fReconciler;
/**
* Source viewer
*/
private ISourceViewer fViewer;
/**
* Document to perform reconciling on
*/
private IDocument fDocument;
/**
* Reconciling cycle progress monitor
*/
private IProgressMonitor fProgressMonitor;
/**
* Creates new instance of the reconciler
*
* @param viewer Source viewer
* @param parser YAML parser
* @param appName Application name to keep selected all the time
*/
public AppNameReconcilingStrategy(ISourceViewer viewer, YamlASTProvider parser, String appName) {
fViewer = viewer;
fReconciler = new AppNameReconciler(parser, appName);
}
/*
* @see org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension#initialReconcile()
*/
public void initialReconcile() {
reconcile(new Region(0, fDocument.getLength()));
}
/*
* @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion,org.eclipse.jface.text.IRegion)
*/
public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
try {
IRegion startLineInfo= fDocument.getLineInformationOfOffset(subRegion.getOffset());
IRegion endLineInfo= fDocument.getLineInformationOfOffset(subRegion.getOffset() + Math.max(0, subRegion.getLength() - 1));
if (startLineInfo.getOffset() == endLineInfo.getOffset())
subRegion= startLineInfo;
else
subRegion= new Region(startLineInfo.getOffset(), endLineInfo.getOffset() + Math.max(0, endLineInfo.getLength() - 1) - startLineInfo.getOffset());
} catch (BadLocationException e) {
subRegion= new Region(0, fDocument.getLength());
}
reconcile(subRegion);
}
private AppNameAnnotationModel getAppNameAnnotationModel() {
IAnnotationModel model = fViewer instanceof ISourceViewerExtension2 ? ((ISourceViewerExtension2)fViewer).getVisualAnnotationModel() : fViewer.getAnnotationModel();
if (model instanceof IAnnotationModelExtension) {
return (AppNameAnnotationModel) ((IAnnotationModelExtension) model).getAnnotationModel(AppNameAnnotationModel.APP_NAME_MODEL_KEY);
}
return (AppNameAnnotationModel) model;
}
@Override
public void reconcile(IRegion region) {
fReconciler.reconcile(fDocument, getAppNameAnnotationModel(), fProgressMonitor);
}
/*
* @see org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
*/
public final void setProgressMonitor(IProgressMonitor monitor) {
fProgressMonitor= monitor;
}
@Override
public void setDocument(IDocument document) {
fDocument= document;
}
}