/*=============================================================================#
 # Copyright (c) 2007, 2019 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.wikitext.r.core.model;

import org.eclipse.core.runtime.IProgressMonitor;

import org.eclipse.statet.docmlet.wikitext.core.WikitextCoreAccess;
import org.eclipse.statet.docmlet.wikitext.core.model.WikidocWorkspaceSourceUnit;
import org.eclipse.statet.docmlet.wikitext.core.model.WikitextSourceUnit;
import org.eclipse.statet.ltk.model.core.IModelManager;
import org.eclipse.statet.ltk.model.core.elements.ISourceUnitModelInfo;
import org.eclipse.statet.ltk.ui.GenericEditorWorkspaceSourceUnitWorkingCopy2;
import org.eclipse.statet.r.core.IRCoreAccess;
import org.eclipse.statet.r.core.model.IRWorkspaceSourceUnit;
import org.eclipse.statet.r.core.model.RModel;
import org.eclipse.statet.redocs.wikitext.r.core.model.WikidocRweaveSourceUnit;


public class WikidocRweaveEditorWorkingCopy
		extends GenericEditorWorkspaceSourceUnitWorkingCopy2<WikidocRweaveSuModelContainer>
		implements WikidocRweaveSourceUnit, WikidocWorkspaceSourceUnit, IRWorkspaceSourceUnit {
	
	
	public WikidocRweaveEditorWorkingCopy(final IRWorkspaceSourceUnit from) {
		super(from);
	}
	
	@Override
	protected WikidocRweaveSuModelContainer createModelContainer() {
		return new WikidocRweaveSuModelContainer(this);
	}
	
	
	@Override
	public WikitextCoreAccess getWikitextCoreAccess() {
		return ((WikitextSourceUnit) getUnderlyingUnit()).getWikitextCoreAccess();
	}
	
	@Override
	public IRCoreAccess getRCoreAccess() {
		return ((WikidocRweaveSourceUnit) getUnderlyingUnit()).getRCoreAccess();
	}
	
	
	@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);
	}
	
}
