org.destecs.ide.ui.editor.impl.CoSimMultiPageEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.destecs.ide.ui.editor.impl.CoSimMultiPageEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2010, 2011 DESTECS Team and others.
 *
 * DESTECS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * DESTECS is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with DESTECS.  If not, see <http://www.gnu.org/licenses/>.
 *    
 * The DESTECS web-site: http://destecs.org/
 *******************************************************************************/
package org.destecs.ide.ui.editor.impl;

import java.io.ByteArrayInputStream;
import java.io.StringBufferInputStream;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;

import org.destecs.core.contract.Contract;
import org.destecs.core.contract.IVariable;
import org.destecs.core.vdmlink.LinkInfo;
import org.destecs.core.vdmlink.Links;
import org.destecs.ide.core.resources.IDestecsProject;
import org.destecs.ide.core.utility.ParserUtil;
import org.destecs.ide.ui.DestecsUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager;

/**
 * An example showing how to create a multi-page editor. This example has 3 pages:
 * <ul>
 * <li>page 0 contains a nested text editor.
 * <li>page 1 allows you to change the font used in page 2
 * <li>page 2 shows the words in page 0 in sorted order
 * </ul>
 */
@SuppressWarnings("deprecation")
public class CoSimMultiPageEditor extends MultiPageEditorPart implements IResourceChangeListener {

    /** The text editor used in page 0. */
    private TextEditor editor;

    /** The font chosen in page 1. */

    /** The text widget used in page 2. */
    private StyledText text;

    /** The text widget used in page 3. */
    private StyledText text3;

    final Map<IFile, Integer> handingFiles = new Hashtable<IFile, Integer>();

    /**
     * Creates a multi-page editor example.
     */
    public CoSimMultiPageEditor() {
        super();
        ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
    }

    public Set<IFile> getHandingFiles() {
        return this.handingFiles.keySet();
    }

    public void setActivePage(IFile file) {
        if (handingFiles.containsKey(file)) {
            setActivePage(handingFiles.get(file));
        }
    }

    /**
     * Creates page 0 of the multi-page editor, which contains a text editor.
     */
    void createPage0(IEditorInput input) {
        try {
            editor = new ContractEditor();
            int index = addPage(editor, input);
            // setPageText(index, editor.getTitle());
            setPageText(index, "Contract");
            setTitle(editor.getTitle());
        } catch (PartInitException e) {
            ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus());
        }
    }

    /**
     * Creates page 1 of the multi-page editor, which allows you to change the font used in page 2.
     */
    void createPage1(IEditorInput input) {
        try {
            VdmLinkEditor vdmLinkEditor = new VdmLinkEditor();
            int index = addPage(vdmLinkEditor, input);
            // setPageText(index, editor.getTitle());
            setPageText(index, "VDM Link");

        } catch (PartInitException e) {
            ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus());
        }
    }

    /**
     * Creates page 2 of the multi-page editor, which shows the sorted text.
     */
    void createPage2() {
        Composite composite = new Composite(getContainer(), SWT.NONE);
        FillLayout layout = new FillLayout();
        composite.setLayout(layout);
        text = new StyledText(composite, SWT.H_SCROLL | SWT.V_SCROLL);
        text.setEditable(false);

        int index = addPage(composite);
        setPageText(index, "20-Sim Link");
    }

    void createPage3() {
        Composite composite = new Composite(getContainer(), SWT.NONE);
        FillLayout layout = new FillLayout();
        composite.setLayout(layout);
        text3 = new StyledText(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY);
        text3.setEditable(false);

        int index = addPage(composite);
        setPageText(index, "Overview");
        IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
        ITheme currentTheme = themeManager.getCurrentTheme();

        FontRegistry fontRegistry = currentTheme.getFontRegistry();
        text3.setFont(fontRegistry.get(JFaceResources.TEXT_FONT));
        text3.addFocusListener(new FocusListener() {

            public void focusLost(FocusEvent e) {
            }

            public void focusGained(FocusEvent e) {
                text3.setText(getOverviewDescription());
            }
        });
    }

    /**
     * Creates the pages of the multi-page editor.
     */
    protected void createPages() {
        if (getProject() == null || getProject().getContractFile() == null) {
            return;
        }
        IFile contractFile = getProject().getContractFile();
        handingFiles.put(contractFile, 0);
        createPage0(createEditorInput(contractFile));

        IFile vdmLinkFile = getProject().getVdmLinkFile();
        handingFiles.put(vdmLinkFile, 1);

        if (!vdmLinkFile.exists()) {
            createPage1(createEditorInput(vdmLinkFile));
            createVdmLinkInitialTemplate(vdmLinkFile);
        } else {
            createPage1(createEditorInput(vdmLinkFile));
        }

        createPage2();

        createPage3();

        IFile inputFile = (IFile) getEditorInput().getAdapter(IFile.class);

        if (inputFile.equals(getProject().getContractFile())) {
            setActivePage(0);
        }
        if (inputFile.equals(getProject().getVdmLinkFile())) {
            setActivePage(1);
        }
    }

    protected void createVdmLinkInitialTemplate(IFile vdmLinkFile) {
        StringBuffer sb = new StringBuffer();

        sb.append("-- Linking of Shared Design Parameters\n");
        sb.append("--sdp maxlevel=Controller.maxLevel;\n");
        sb.append("--sdp minlevel=Controller.minLevel;\n\n");

        sb.append("-- Linking of Monitored Variables\n");
        sb.append("--input level=System.levelSensor.level;\n\n");

        sb.append("-- Linking of Controlled Variables\n");
        sb.append("--output valve=System.valveActuator.valveState;\n\n");

        sb.append("-- Linking of Events\n");
        sb.append("--event HIGH=System.eventHandler.high;\n\n");

        sb.append("-- other linked names used in scenarios\n");
        sb.append("--model fault=levelSensor.fault\n");

        try {
            vdmLinkFile.setContents(new StringBufferInputStream(sb.toString()), true, true,
                    new NullProgressMonitor());
        } catch (CoreException e) {
            //DO nothing
        }

    }

    protected IEditorInput createEditorInput(IFile file) {
        if (!file.exists()) {
            try {
                file.create(new ByteArrayInputStream("".getBytes()), true, null);
            } catch (CoreException e) {
                DestecsUIPlugin.log("Failed to create contract file in editor", e);
            }
        }
        return new FileEditorInput(file);
    }

    protected IDestecsProject getProject() {
        IProject project = ((IFile) getEditorInput().getAdapter(IFile.class)).getProject();

        IDestecsProject dp = (IDestecsProject) project.getAdapter(IDestecsProject.class);
        return dp;
    }

    /**
     * The <code>MultiPageEditorPart</code> implementation of this <code>IWorkbenchPart</code> method disposes all
     * nested editors. Subclasses may extend.
     */
    public void dispose() {
        ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
        super.dispose();
    }

    /**
     * Saves the multi-page editor's document.
     */
    public void doSave(IProgressMonitor monitor) {
        for (int i = 0; i < 3; i++) {
            if (getEditor(i) != null) {
                getEditor(i).doSave(monitor);
            }
        }
        // getEditor(0).doSave(monitor);
    }

    @Override
    public boolean isDirty() {
        for (int i = 0; i < 3; i++) {
            if (getEditor(i) != null && getEditor(i).isDirty()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Saves the multi-page editor's document as another file. Also updates the text for page 0's tab, and updates this
     * multi-page editor's input to correspond to the nested editor's.
     */
    public void doSaveAs() {
        IEditorPart editor = getEditor(0);
        editor.doSaveAs();
        setPageText(0, editor.getTitle());
        setInput(editor.getEditorInput());
    }

    /*
     * (non-Javadoc) Method declared on IEditorPart
     */
    public void gotoMarker(IMarker marker) {
        setActivePage(0);
        IDE.gotoMarker(getEditor(0), marker);
    }

    /**
     * The <code>MultiPageEditorExample</code> implementation of this method checks that the input is an instance of
     * <code>IFileEditorInput</code>.
     */
    public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
        if (!(editorInput instanceof IFileEditorInput))
            throw new PartInitException("Invalid Input: Must be IFileEditorInput");
        super.init(site, editorInput);

    }

    @Override
    public String getTitle() {
        return "Configuration Editor";
    }

    /*
     * (non-Javadoc) Method declared on IEditorPart.
     */
    public boolean isSaveAsAllowed() {
        return false;
    }

    /**
     * Calculates the contents of page 2 when the it is activated.
     */
    protected void pageChange(int newPageIndex) {
        super.pageChange(newPageIndex);
        // if (newPageIndex == 2)
        // {
        // sortWords();
        // }
    }

    /**
     * Closes all project files on project close.
     */
    public void resourceChanged(final IResourceChangeEvent event) {
        if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
            Display.getDefault().asyncExec(new Runnable() {
                public void run() {
                    IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages();
                    for (int i = 0; i < pages.length; i++) {
                        if (((FileEditorInput) editor.getEditorInput()).getFile().getProject()
                                .equals(event.getResource())) {
                            IEditorPart editorPart = pages[i].findEditor(editor.getEditorInput());
                            pages[i].closeEditor(editorPart, true);
                        }
                    }
                }
            });
        }
    }

    public String getOverviewDescription() {
        IDestecsProject p = getProject();
        StringBuilder sb = new StringBuilder();
        try {
            if (p != null) {
                Contract contract = ParserUtil.getContract(p, null);
                Links vdmLinks = ParserUtil.getVdmLinks(p, null);

                sb.append("--- \n");
                sb.append("--- Shared Design Parameters ---\n");
                sb.append("--- \n");
                for (IVariable sdp : contract.getSharedDesignParameters()) {
                    LinkInfo info = vdmLinks.getBoundVariableInfo(sdp.getName());
                    String id = "?";
                    if (info != null) {
                        id = info.getQualifiedNameString();
                    }
                    sb.append(id + " <-> " + sdp.getName() + " <-> " + sdp.getName() + " not checked\n");
                }

                sb.append("\n\n");
                sb.append("--- \n");
                sb.append("--- Monitored Variables ---\n");
                sb.append("--- \n");
                for (IVariable sdp : contract.getMonitoredVariables()) {
                    LinkInfo info = vdmLinks.getBoundVariableInfo(sdp.getName());
                    String id = "?";
                    if (info != null) {
                        id = info.getQualifiedNameString();
                    }
                    sb.append(id + " <-> " + sdp.getName() + " <-> " + sdp.getName() + " not checked\n");
                }
                sb.append("\n\n");
                sb.append("--- \n");
                sb.append("--- Controlled Variables ---\n");
                sb.append("--- \n");
                for (IVariable sdp : contract.getControlledVariables()) {
                    LinkInfo info = vdmLinks.getBoundVariableInfo(sdp.getName());
                    String id = "?";
                    if (info != null) {
                        id = info.getQualifiedNameString();
                    }
                    sb.append(id + " <-> " + sdp.getName() + " <-> " + sdp.getName() + " not checked\n");
                }
                sb.append("\n\n");
                sb.append("--- \n");
                sb.append("--- Events ---\n");
                sb.append("--- \n");
                for (String event : contract.getEvents()) {
                    LinkInfo info = vdmLinks.getBoundVariableInfo(event);
                    String id = "?";
                    if (info != null) {
                        id = info.getQualifiedNameString();
                    }
                    sb.append(id + " <-> " + event + " <-> not supported\n");
                }
            }
        } catch (Exception e) {
            sb.append("No info avaliable");
        }
        return sb.toString();
    }

}