/*=============================================================================#
 # Copyright (c) 2007, 2018 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.internal.redocs.tex.r.model;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;

import org.eclipse.statet.ecommons.text.core.sections.IDocContentSections;

import org.eclipse.statet.docmlet.tex.core.ITexCoreAccess;
import org.eclipse.statet.docmlet.tex.core.model.ITexWorkspaceSourceUnit;
import org.eclipse.statet.ltk.model.core.IModelManager;
import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
import org.eclipse.statet.ltk.model.core.impl.GenericResourceSourceUnit2;
import org.eclipse.statet.r.core.IRCoreAccess;
import org.eclipse.statet.r.core.IRProject;
import org.eclipse.statet.r.core.RCore;
import org.eclipse.statet.r.core.RProjects;
import org.eclipse.statet.r.core.model.IRWorkspaceSourceUnit;
import org.eclipse.statet.r.core.model.RModel;
import org.eclipse.statet.redocs.tex.r.core.TexRweaveCore;
import org.eclipse.statet.redocs.tex.r.core.model.ILtxRweaveSourceUnit;
import org.eclipse.statet.redocs.tex.r.core.model.TexRweaveModel;
import org.eclipse.statet.redocs.tex.r.core.source.LtxRweaveDocumentContentInfo;


public class LtxRweaveSourceUnit extends GenericResourceSourceUnit2<LtxRweaveSuModelContainer> 
		implements ILtxRweaveSourceUnit, ITexWorkspaceSourceUnit, IRWorkspaceSourceUnit {
	
	
	public LtxRweaveSourceUnit(final String id, final IFile file) {
		super(id, file);
	}
	
	@Override
	protected LtxRweaveSuModelContainer createModelContainer() {
		return new LtxRweaveSuModelContainer(this);
	}
	
	
	@Override
	public String getModelTypeId() {
		return TexRweaveModel.LTX_R_MODEL_TYPE_ID;
	}
	
	@Override
	public IDocContentSections getDocumentContentInfo() {
		return LtxRweaveDocumentContentInfo.INSTANCE;
	}
	
	@Override
	public ITexCoreAccess getTexCoreAccess() {
		return TexRweaveCore.TEX_WORKBENCH_ACCESS;
	}
	
	@Override
	public IRCoreAccess getRCoreAccess() {
		final IRProject rProject= RProjects.getRProject(getResource().getProject());
		return (rProject != null) ? rProject : RCore.WORKBENCH_ACCESS;
	}
	
	
	@Override
	protected void register() {
		super.register();
		
		final IModelManager rManager= RModel.getRModelManager();
		if (rManager != null) {
			rManager.deregisterDependentUnit(this);
		}
	}
	
	@Override
	protected void unregister() {
		final IModelManager rManager= RModel.getRModelManager();
		if (rManager != null) {
			rManager.deregisterDependentUnit(this);
		}
		
		super.unregister();
	}
	
	
	@Override
	public ISourceUnitModelInfo getModelInfo(final String type, final int flags, final IProgressMonitor monitor) {
		if (type == RModel.R_TYPE_ID) {
			return RModel.getRModelInfo(getModelContainer().getModelInfo(flags, monitor));
		}
		return super.getModelInfo(type, flags, monitor);
	}
	
	
	@Override
	@SuppressWarnings("unchecked")
	public <T> T getAdapter(final Class<T> adapterType) {
		if (adapterType == ITexCoreAccess.class) {
			return (T) getTexCoreAccess();
		}
		if (adapterType == IRCoreAccess.class) {
			return (T) getRCoreAccess();
		}
		return super.getAdapter(adapterType);
	}
	
}
