/*******************************************************************************
* 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.ext.model.editor;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.part.MultiPageEditorSite;
import com.cisco.yangide.core.YangCorePlugin;
import com.cisco.yangide.editor.YangEditorPlugin;
import com.cisco.yangide.editor.editors.IYangEditor;
import com.cisco.yangide.editor.editors.YangEditor;
import com.cisco.yangide.editor.editors.YangSourceViewer;
import com.cisco.yangide.ext.model.Module;
import com.cisco.yangide.ext.model.editor.editors.YangDiagramEditor;
import com.cisco.yangide.ext.model.editor.editors.YangDiagramEditorInput;
import com.cisco.yangide.ext.model.editor.sync.ModelSynchronizer;
/**
* @author Konstantin Zaitsev
* @date Aug 7, 2014
*/
public class YangMultiPageEditorPart extends MultiPageEditorPart implements IYangEditor {
private YangEditor yangSourceEditor;
private YangSourceViewer yangSourceViewer;
private YangDiagramEditor yangDiagramEditor;
private ModelSynchronizer modelSynchronizer;
@Override
protected void createPages() {
yangSourceEditor = new YangEditor();
yangDiagramEditor = new YangDiagramEditor(yangSourceEditor);
modelSynchronizer = new ModelSynchronizer(yangSourceEditor, yangDiagramEditor);
initSourcePage();
initDiagramPage();
modelSynchronizer.init();
modelSynchronizer.enableNotification();
}
@Override
public void doSave(IProgressMonitor monitor) {
yangSourceEditor.doSave(monitor);
}
@Override
public void doSaveAs() {
yangSourceEditor.doSaveAs();
}
@Override
public boolean isSaveAsAllowed() {
return yangSourceEditor.isSaveAsAllowed();
}
@Override
public boolean isDirty() {
return yangSourceEditor.isDirty();
}
@Override
protected IEditorSite createSite(IEditorPart editor) {
return new MultiPageEditorSite(this, editor) {
@Override
protected void handlePostSelectionChanged(SelectionChangedEvent event) {
if ((event.getSelection() instanceof StructuredSelection && getActivePage() == 1)
|| (getActivePage() == 0 && !(event.getSelection() instanceof StructuredSelection))) {
super.handlePostSelectionChanged(event);
}
}
};
}
private void initDiagramPage() {
try {
Module diagModule = modelSynchronizer.getDiagramModule();
YangDiagramEditorInput input = new YangDiagramEditorInput(URI.createURI("tmp:/local"), getFile(),
"com.cisco.yangide.ext.model.editor.editorDiagramTypeProvider", diagModule);
addPage(1, yangDiagramEditor, input);
setPageText(1, "Diagram");
yangDiagramEditor.setSourceModelManager(modelSynchronizer.getSourceModelManager());
} catch (PartInitException e) {
YangEditorPlugin.log(e);
}
}
private IFile getFile() {
if (null != yangSourceEditor && null != yangSourceEditor.getEditorInput()) {
if (yangSourceEditor.getEditorInput() instanceof IFileEditorInput) {
IFileEditorInput fileEI = (IFileEditorInput) yangSourceEditor.getEditorInput();
return fileEI.getFile();
}
}
return null;
}
private void initSourcePage() {
try {
addPage(0, yangSourceEditor, getEditorInput());
setPageText(0, "Source");
yangSourceViewer = (YangSourceViewer) yangSourceEditor.getViewer();
} catch (PartInitException e) {
YangEditorPlugin.log(e);
}
setPartName(yangSourceEditor.getPartName());
}
@Override
protected void pageChange(int newPageIndex) {
if (newPageIndex == 1) {
modelSynchronizer.syncWithSource();
if (modelSynchronizer.isSourceInvalid()) {
MessageDialog.openWarning(getSite().getShell(), "Yang source is invalid",
"Yang source has syntax error and diagram view cannot be synchronized correctly.\n"
+ "Please correct syntax error first.");
}
yangSourceViewer.disableProjection();
if (yangSourceViewer.getReconciler() != null) {
yangSourceViewer.getReconciler().uninstall();
}
yangSourceViewer.disableTextListeners();
try {
getEditorSite().getPage().showView("org.eclipse.ui.views.PropertySheet");
} catch (PartInitException e) {
YangEditorPlugin.log(e);
}
yangDiagramEditor.startSourceSelectionUpdater();
} else {
yangDiagramEditor.stopSourceSelectionUpdater();
IRegion highlightRange = yangSourceEditor.getHighlightRange();
yangSourceViewer.enableTextListeners();
yangSourceViewer.updateDocument();
yangSourceViewer.enableProjection();
if (yangSourceViewer.getReconciler() != null) {
yangSourceViewer.getReconciler().install(yangSourceEditor.getViewer());
}
setSourceSelection(highlightRange);
}
super.pageChange(newPageIndex);
}
private void setSourceSelection(IRegion highlightRange) {
if (highlightRange != null) {
Point selectedRange = yangSourceViewer.getSelectedRange();
if (selectedRange.x != highlightRange.getOffset() && selectedRange.y != highlightRange.getLength()) {
yangSourceEditor.selectAndReveal(highlightRange.getOffset(), highlightRange.getLength());
}
}
}
/**
* @return the yangSourceEditor
*/
public YangEditor getYangSourceEditor() {
return yangSourceEditor;
}
/**
* @return the yangDiagramEditor
*/
public YangDiagramEditor getYangDiagramEditor() {
return yangDiagramEditor;
}
@Override
public void dispose() {
try {
modelSynchronizer.dispose();
} catch (Exception e) {
YangCorePlugin.log(e);
}
super.dispose();
}
@Override
public void selectAndReveal(int offset, int length) {
yangSourceEditor.selectAndReveal(offset, length);
}
}